@astryxdesign/cli 0.7.2-canary.fe2c655 → 0.7.2

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 (509) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +175 -154
  3. package/api/build/_adapter.d.mts +8 -0
  4. package/api/build/_adapter.mjs +12 -1
  5. package/api/build/build.doc.mjs +4 -0
  6. package/api/build/help/help.mjs +1 -1
  7. package/api/build/kit/kit.mjs +3 -11
  8. package/api/component/_adapter.d.mts +72 -1
  9. package/api/component/_adapter.mjs +212 -18
  10. package/api/component/component.doc.mjs +6 -1
  11. package/api/component/component.mjs +82 -15
  12. package/api/component/component.test.mjs +80 -0
  13. package/api/component/doc-links.test.mjs +386 -0
  14. package/api/component/integration-export-name.test.mjs +644 -0
  15. package/api/component/list/list.mjs +42 -4
  16. package/api/discover/_adapter.d.mts +132 -12
  17. package/api/discover/_adapter.mjs +488 -27
  18. package/api/discover/_adapter.test.mjs +599 -17
  19. package/api/discover/_catalog-view.d.mts +16 -5
  20. package/api/discover/_catalog-view.mjs +32 -8
  21. package/api/discover/detail/doc/doc.mjs +9 -1
  22. package/api/discover/discover.d.mts +11 -0
  23. package/api/discover/discover.doc.mjs +9 -7
  24. package/api/discover/discover.mjs +121 -19
  25. package/api/discover/discover.type.d.mts +20 -7
  26. package/api/discover/discover.type.mjs +17 -7
  27. package/api/discover/list/list.d.mts +4 -3
  28. package/api/discover/list/list.mjs +17 -10
  29. package/api/docs/_adapter.d.mts +74 -0
  30. package/api/docs/_adapter.mjs +553 -16
  31. package/api/docs/docs.doc.mjs +2 -1
  32. package/api/docs/docs.mjs +2 -1
  33. package/api/docs/docs.test.mjs +5 -2
  34. package/api/docs/integration-tree.test.mjs +22 -0
  35. package/api/docs/integrationDocs.test.mjs +124 -0
  36. package/api/docs/list/list.mjs +12 -2
  37. package/api/docs/reference-blocks.test.mjs +1 -3
  38. package/api/doctor/_adapter.d.mts +108 -0
  39. package/api/doctor/_adapter.mjs +223 -4
  40. package/api/doctor/doctor.d.mts +199 -0
  41. package/api/doctor/doctor.doc.mjs +3 -2
  42. package/api/doctor/doctor.mjs +530 -34
  43. package/api/doctor/doctor.test.mjs +180 -14
  44. package/api/doctor/release-checks.test.mjs +156 -0
  45. package/api/doctor/theme-checks.mjs +17 -4
  46. package/api/doctor/theme-checks.test.mjs +223 -7
  47. package/api/error.d.mts +10 -0
  48. package/api/error.mjs +25 -0
  49. package/api/gap-report/gap-report.d.mts +3 -0
  50. package/api/gap-report/gap-report.doc.mjs +11 -3
  51. package/api/gap-report/gap-report.mjs +219 -52
  52. package/api/gap-report/gap-report.test.mjs +233 -0
  53. package/api/gap-report/gap-report.type.d.mts +41 -0
  54. package/api/gap-report/gap-report.type.mjs +18 -0
  55. package/api/hook/_adapter.mjs +3 -11
  56. package/api/hook/hook.doc.mjs +4 -0
  57. package/api/hook/list/list.d.mts +1 -1
  58. package/api/index.d.mts +2 -0
  59. package/api/index.mjs +2 -0
  60. package/api/init/_adapter.d.mts +22 -0
  61. package/api/init/_adapter.mjs +59 -0
  62. package/api/init/init.d.mts +7 -5
  63. package/api/init/init.doc.mjs +28 -7
  64. package/api/init/init.mjs +28 -4
  65. package/api/init/init.type.d.mts +48 -3
  66. package/api/init/init.type.mjs +37 -3
  67. package/api/init/run/run.d.mts +1 -1
  68. package/api/init/run/run.mjs +17 -6
  69. package/api/init/user/user.d.mts +14 -0
  70. package/api/init/user/user.mjs +87 -0
  71. package/api/init/user/user.test.mjs +232 -0
  72. package/api/integration/_adapter.d.mts +45 -0
  73. package/api/integration/_adapter.mjs +112 -0
  74. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  75. package/api/integration/add-contribution.mjs +8 -4
  76. package/api/integration/add-contribution.test.mjs +4 -2
  77. package/api/integration/authoring-checks.mjs +110 -6
  78. package/api/integration/authoring-checks.test.mjs +808 -0
  79. package/api/integration/authoring-checks.type.d.mts +143 -0
  80. package/api/integration/authoring-checks.type.mjs +74 -2
  81. package/api/integration/check/check.d.mts +96 -0
  82. package/api/integration/check/check.mjs +357 -0
  83. package/api/integration/check/check.test.mjs +489 -0
  84. package/api/integration/integration-check.type.d.mts +118 -0
  85. package/api/integration/integration-check.type.mjs +84 -0
  86. package/api/integration/integrationCheck.doc.d.mts +10 -0
  87. package/api/integration/integrationCheck.doc.mjs +73 -0
  88. package/api/integration/integrationComponentConflicts.doc.mjs +45 -6
  89. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  90. package/api/integration/pack-check.mjs +364 -120
  91. package/api/integration/pack-check.test.mjs +730 -10
  92. package/api/integration/validate-integration-fixes.test.mjs +67 -0
  93. package/api/integration/validate-integration.d.mts +8 -0
  94. package/api/integration/validate-integration.mjs +63 -9
  95. package/api/integration/validate-integration.test.mjs +88 -8
  96. package/api/integration/validate-integration.type.d.mts +16 -0
  97. package/api/integration/validate-integration.type.mjs +14 -1
  98. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  99. package/api/integration/validateIntegration.doc.mjs +19 -3
  100. package/api/search/_adapter.d.mts +11 -0
  101. package/api/search/_adapter.mjs +25 -0
  102. package/api/search/search.d.mts +82 -13
  103. package/api/search/search.doc.mjs +8 -3
  104. package/api/search/search.domain-priority.test.mjs +108 -18
  105. package/api/search/search.integration-check.test.mjs +24 -0
  106. package/api/search/search.mjs +645 -64
  107. package/api/search/search.test.mjs +179 -1
  108. package/api/search/search.type.d.mts +14 -1
  109. package/api/search/search.type.mjs +6 -1
  110. package/api/swizzle/_adapter.mjs +2 -2
  111. package/api/swizzle/copy/copy.mjs +29 -15
  112. package/api/template/template-integration.test.mjs +1 -1
  113. package/api/template/template.test.mjs +120 -3
  114. package/api/theme/_adapter.d.mts +16 -0
  115. package/api/theme/_adapter.mjs +32 -5
  116. package/api/theme/build/build.d.mts +2 -1
  117. package/api/theme/build/build.family.test.mjs +64 -0
  118. package/api/theme/build/build.mjs +250 -38
  119. package/api/theme/build/build.packed-old-core.test.mjs +20 -3
  120. package/api/theme/build/font-warning.mjs +5 -3
  121. package/api/theme/build/font-warning.test.mjs +2 -1
  122. package/api/theme/remove/remove.test.mjs +2 -2
  123. package/api/theme/targets/targets.mjs +3 -10
  124. package/api/theme/themeBuild.doc.mjs +4 -4
  125. package/api/theme/themeTargets.doc.mjs +4 -0
  126. package/api/theme/use/use.test.mjs +1 -1
  127. package/api/upgrade/_adapter.d.mts +40 -2
  128. package/api/upgrade/_adapter.mjs +118 -5
  129. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  130. package/api/upgrade/run/run.mjs +35 -2
  131. package/api/upgrade/status/status.d.mts +21 -5
  132. package/api/upgrade/status/status.mjs +45 -8
  133. package/api/upgrade/upgrade.doc.mjs +6 -3
  134. package/api/upgrade/upgrade.mjs +5 -1
  135. package/api/upgrade/upgrade.type.d.mts +23 -0
  136. package/api/upgrade/upgrade.type.mjs +16 -1
  137. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  138. package/assets/codemods/registry.mjs +1 -0
  139. package/assets/codemods/runner.mjs +7 -1
  140. package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
  141. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  142. package/assets/codemods/transforms/v0.7.2/migrate-list-edge-compensation-to-edge.mjs +198 -0
  143. package/assets/discover/official-packages.json +367 -0
  144. package/assets/docs/README.md +10 -0
  145. package/assets/docs/author-a-theme.doc.mjs +3 -3
  146. package/assets/docs/browser-support.doc.mjs +1 -1
  147. package/assets/docs/getting-started.doc.mjs +26 -6
  148. package/assets/docs/styling-overview.doc.mjs +1 -1
  149. package/assets/docs/theme.doc.dense.mjs +1 -1
  150. package/assets/docs/theme.doc.mjs +2 -2
  151. package/assets/docs/theme.doc.zh.mjs +1 -1
  152. package/assets/docs/tree/add-a-component.doc.mjs +22 -2
  153. package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
  154. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  155. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  156. package/assets/docs/tree/block-template.doc.mjs +8 -20
  157. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  158. package/assets/docs/tree/building-blocks.doc.mjs +4 -0
  159. package/assets/docs/tree/check-the-props.doc.mjs +201 -0
  160. package/assets/docs/tree/check-your-docs.doc.mjs +69 -11
  161. package/assets/docs/tree/checks.doc.mjs +32 -24
  162. package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
  163. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  164. package/assets/docs/tree/cli.doc.mjs +6 -0
  165. package/assets/docs/tree/codemods.doc.mjs +17 -7
  166. package/assets/docs/tree/commands.doc.mjs +7 -1
  167. package/assets/docs/tree/component-family.doc.mjs +8 -6
  168. package/assets/docs/tree/component-imports.doc.mjs +21 -3
  169. package/assets/docs/tree/components.doc.mjs +7 -1
  170. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  171. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  172. package/assets/docs/tree/configuration.doc.mjs +7 -3
  173. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  174. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  175. package/assets/docs/tree/describe-the-component.doc.mjs +3 -3
  176. package/assets/docs/tree/docs.doc.mjs +9 -3
  177. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  178. package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
  179. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  180. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  181. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  182. package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
  183. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  184. package/assets/docs/tree/global.doc.mjs +131 -0
  185. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  186. package/assets/docs/tree/install-once.doc.mjs +105 -0
  187. package/assets/docs/tree/integrations.doc.mjs +13 -1
  188. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  189. package/assets/docs/tree/layout.doc.mjs +6 -6
  190. package/assets/docs/tree/links.doc.mjs +7 -6
  191. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  192. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  193. package/assets/docs/tree/migration.doc.mjs +0 -1
  194. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  195. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  196. package/assets/docs/tree/page-template.doc.mjs +4 -8
  197. package/assets/docs/tree/problems.doc.mjs +205 -0
  198. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  199. package/assets/docs/tree/publishing.doc.mjs +6 -6
  200. package/assets/docs/tree/quick-start.doc.mjs +53 -27
  201. package/assets/docs/tree/reference.doc.mjs +192 -0
  202. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  203. package/assets/docs/tree/replace-a-core-template.doc.mjs +10 -12
  204. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  205. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  206. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  207. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  208. package/assets/docs/tree/single-component.doc.mjs +15 -6
  209. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  210. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  211. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  212. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  213. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  214. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  215. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  216. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  217. package/assets/docs/tree/templates.doc.mjs +7 -1
  218. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  219. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  220. package/assets/docs/tree/themes.doc.mjs +4 -0
  221. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  222. package/assets/docs/tree/troubleshooting.doc.mjs +29 -13
  223. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  224. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  225. package/assets/docs/tree/updates.doc.mjs +92 -0
  226. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  227. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
  228. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  229. package/assets/docs/tree/versioning.doc.mjs +10 -9
  230. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  231. package/assets/docs/tree/write-the-template-file.doc.mjs +7 -6
  232. package/assets/docs/use-a-theme.doc.mjs +2 -2
  233. package/assets/docs/working-with-ai.doc.mjs +66 -13
  234. package/assets/theme.template.ts +1 -1
  235. package/authoring/codemod/codemod.doc.mjs +7 -3
  236. package/authoring/config/config.doc.mjs +9 -6
  237. package/authoring/config/type.ts +4 -2
  238. package/authoring/debug/parse.d.mts +5 -5
  239. package/authoring/discover/discover.doc.mjs +7 -1
  240. package/authoring/doctypes/_schema.d.mts +8 -3
  241. package/authoring/doctypes/_schema.mjs +1 -0
  242. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  243. package/authoring/doctypes/command/command.doc.mjs +20 -12
  244. package/authoring/doctypes/command/type.ts +14 -0
  245. package/authoring/doctypes/component/component.doc.mjs +30 -27
  246. package/authoring/doctypes/component/type.ts +21 -8
  247. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  248. package/authoring/doctypes/function/function.doc.mjs +9 -8
  249. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  250. package/authoring/doctypes/hook/type.ts +4 -0
  251. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  252. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  253. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  254. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  255. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  256. package/authoring/doctypes/template/parse.d.mts +6 -2
  257. package/authoring/doctypes/template/parse.mjs +3 -1
  258. package/authoring/doctypes/template/template.doc.mjs +3 -3
  259. package/authoring/doctypes/template/type.ts +22 -0
  260. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  261. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  262. package/authoring/identity/identity.doc.mjs +3 -3
  263. package/authoring/index.d.ts +2 -0
  264. package/authoring/integration/integration.doc.mjs +30 -6
  265. package/authoring/integration/parse.test.mjs +21 -0
  266. package/authoring/integration/schema.d.mts +16 -3
  267. package/authoring/integration/schema.mjs +34 -2
  268. package/authoring/integration/type.ts +12 -0
  269. package/clients/cli/bin/astryx.mjs +20 -3
  270. package/clients/cli/cli-command.test.mjs +166 -0
  271. package/clients/cli/commands/blog.doc.mjs +1 -0
  272. package/clients/cli/commands/build-theme.batch-report.test.mjs +17 -3
  273. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  274. package/clients/cli/commands/build-theme.mjs +26 -13
  275. package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
  276. package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
  277. package/clients/cli/commands/build.doc.mjs +1 -0
  278. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  279. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  280. package/clients/cli/commands/component.doc.mjs +1 -0
  281. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  282. package/clients/cli/commands/discover.doc.mjs +9 -1
  283. package/clients/cli/commands/discover.mjs +144 -93
  284. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  285. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  286. package/clients/cli/commands/docs.doc.mjs +1 -0
  287. package/clients/cli/commands/docs.mjs +49 -19
  288. package/clients/cli/commands/docs.test.mjs +2 -2
  289. package/clients/cli/commands/doctor-integration-components.doc.mjs +19 -4
  290. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  291. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  292. package/clients/cli/commands/doctor-integration-validate.doc.mjs +22 -2
  293. package/clients/cli/commands/doctor-integration.test.mjs +888 -3
  294. package/clients/cli/commands/doctor.doc.mjs +12 -2
  295. package/clients/cli/commands/doctor.mjs +292 -7
  296. package/clients/cli/commands/doctor.test.mjs +10 -4
  297. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  298. package/clients/cli/commands/gap-report.mjs +24 -2
  299. package/clients/cli/commands/gap-report.test.mjs +79 -0
  300. package/clients/cli/commands/hook.doc.mjs +1 -0
  301. package/clients/cli/commands/init.behavior.test.mjs +5 -0
  302. package/clients/cli/commands/init.doc.mjs +29 -3
  303. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  304. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  305. package/clients/cli/commands/integration-check.doc.mjs +93 -0
  306. package/clients/cli/commands/integration-check.test.mjs +441 -0
  307. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  308. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  309. package/clients/cli/commands/integration.doc.mjs +6 -2
  310. package/clients/cli/commands/integration.mjs +119 -7
  311. package/clients/cli/commands/json-contract.test.mjs +11 -2
  312. package/clients/cli/commands/manifest.doc.mjs +1 -0
  313. package/clients/cli/commands/outside-project.test.mjs +774 -0
  314. package/clients/cli/commands/search.doc.mjs +1 -0
  315. package/clients/cli/commands/search.mjs +16 -11
  316. package/clients/cli/commands/search.test.mjs +429 -296
  317. package/clients/cli/commands/setup-nudge.test.mjs +102 -2
  318. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  319. package/clients/cli/commands/swizzle.mjs +5 -3
  320. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  321. package/clients/cli/commands/template.doc.mjs +1 -0
  322. package/clients/cli/commands/text-json-parity.test.mjs +5 -0
  323. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  324. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  325. package/clients/cli/commands/theme-build.doc.mjs +3 -2
  326. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  327. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  328. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  329. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  330. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  331. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  332. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  333. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  334. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  335. package/clients/cli/commands/upgrade.doc.mjs +22 -1
  336. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  337. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  338. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  339. package/clients/cli/index.mjs +112 -16
  340. package/clients/cli/lib/cli-error.mjs +4 -1
  341. package/clients/cli/lib/component-format.test.mjs +1 -1
  342. package/clients/cli/lib/define-command.mjs +2 -2
  343. package/clients/cli/lib/json-shim.mjs +3 -1
  344. package/clients/cli/lib/manifest.d.ts +9 -0
  345. package/clients/cli/lib/manifest.mjs +17 -1
  346. package/clients/cli/lib/manifest.test.mjs +25 -0
  347. package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
  348. package/foundation/agent-docs/agent-doc-state.mjs +66 -6
  349. package/foundation/agent-docs/agent-docs.d.mts +4 -3
  350. package/foundation/agent-docs/agent-docs.mjs +11 -9
  351. package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
  352. package/foundation/agent-docs/computer-agent-text.mjs +623 -0
  353. package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
  354. package/foundation/config/project.d.mts +35 -3
  355. package/foundation/config/project.mjs +226 -7
  356. package/foundation/config/project.test.mjs +66 -0
  357. package/foundation/config/theme-state.mjs +5 -4
  358. package/foundation/discovery/authoring-self-docs.mjs +2 -1
  359. package/foundation/discovery/cli-self-docs.mjs +20 -3
  360. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  361. package/foundation/discovery/component-discovery.d.mts +190 -10
  362. package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
  363. package/foundation/discovery/component-discovery.mjs +864 -56
  364. package/foundation/discovery/component-discovery.test.mjs +96 -0
  365. package/foundation/discovery/component-replacement.mjs +20 -1
  366. package/foundation/discovery/component-replacement.test.mjs +40 -0
  367. package/foundation/discovery/copied-passages.d.mts +216 -0
  368. package/foundation/discovery/copied-passages.mjs +720 -0
  369. package/foundation/discovery/copied-passages.test.mjs +124 -0
  370. package/foundation/discovery/doc-consistency.d.mts +34 -0
  371. package/foundation/discovery/doc-consistency.mjs +513 -0
  372. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  373. package/foundation/discovery/doc-fluff.d.mts +112 -0
  374. package/foundation/discovery/doc-fluff.mjs +328 -0
  375. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  376. package/foundation/discovery/doc-types.d.mts +157 -0
  377. package/foundation/discovery/doc-types.mjs +1231 -0
  378. package/foundation/discovery/doc-types.test.mjs +744 -0
  379. package/foundation/discovery/docs-discovery.d.mts +88 -0
  380. package/foundation/discovery/docs-discovery.mjs +83 -2
  381. package/foundation/discovery/integration-doc-files.d.mts +22 -0
  382. package/foundation/discovery/integration-doc-files.mjs +231 -0
  383. package/foundation/discovery/integration-doc-files.test.mjs +246 -0
  384. package/foundation/discovery/module-exports.d.mts +27 -0
  385. package/foundation/discovery/module-exports.mjs +356 -31
  386. package/foundation/discovery/module-exports.test.mjs +172 -0
  387. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  388. package/foundation/discovery/package-tsconfig.mjs +228 -0
  389. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  390. package/foundation/discovery/project-typescript.d.mts +32 -0
  391. package/foundation/discovery/project-typescript.mjs +89 -0
  392. package/foundation/discovery/prop-drift.d.mts +297 -0
  393. package/foundation/discovery/prop-drift.mjs +2428 -0
  394. package/foundation/discovery/prop-drift.test.mjs +2337 -0
  395. package/foundation/discovery/runner-allowlist.d.mts +40 -0
  396. package/foundation/discovery/runner-allowlist.mjs +53 -0
  397. package/foundation/discovery/stray-pointers.d.mts +52 -0
  398. package/foundation/discovery/stray-pointers.mjs +293 -0
  399. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  400. package/foundation/discovery/template-adapter.mjs +74 -5
  401. package/foundation/discovery/template-needs.mjs +5 -2
  402. package/foundation/discovery/theme-imports.mjs +8 -4
  403. package/foundation/discovery/theme-imports.test.mjs +1 -1
  404. package/foundation/discovery/type-match.d.mts +53 -0
  405. package/foundation/discovery/type-match.mjs +660 -0
  406. package/foundation/discovery/type-match.test.mjs +169 -0
  407. package/foundation/discovery/type-text.d.mts +68 -0
  408. package/foundation/discovery/type-text.mjs +658 -0
  409. package/foundation/discovery/type-text.test.mjs +196 -0
  410. package/foundation/discovery/unresolved-references.d.mts +62 -0
  411. package/foundation/discovery/unresolved-references.mjs +790 -0
  412. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  413. package/foundation/doc-compiler/doc-loads.test.mjs +51 -1
  414. package/foundation/doc-compiler/inputs.mjs +27 -1
  415. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  416. package/foundation/doc-compiler/links.d.mts +41 -5
  417. package/foundation/doc-compiler/links.mjs +167 -28
  418. package/foundation/doc-compiler/links.test.mjs +97 -4
  419. package/foundation/doc-compiler/read.d.mts +1 -1
  420. package/foundation/doc-compiler/tree.mjs +30 -1
  421. package/foundation/doc-compiler/tree.test.mjs +8 -1
  422. package/foundation/env/cli-command.d.mts +83 -0
  423. package/foundation/env/cli-command.mjs +152 -0
  424. package/foundation/env/cli-command.test.mjs +129 -0
  425. package/foundation/env/node-version.test.mjs +15 -3
  426. package/foundation/env/package-manager.d.mts +93 -9
  427. package/foundation/env/package-manager.global.test.mjs +66 -0
  428. package/foundation/env/package-manager.mjs +184 -13
  429. package/foundation/env/package-manager.test.mjs +341 -15
  430. package/foundation/env/project-scope.d.mts +9 -0
  431. package/foundation/env/project-scope.mjs +33 -0
  432. package/foundation/env/search-path.d.mts +42 -0
  433. package/foundation/env/search-path.mjs +205 -0
  434. package/foundation/env/search-path.test.mjs +122 -0
  435. package/foundation/env/user-dirs.d.mts +39 -0
  436. package/foundation/env/user-dirs.mjs +93 -0
  437. package/foundation/env/user-dirs.test.mjs +72 -0
  438. package/foundation/env/user-settings.d.mts +46 -0
  439. package/foundation/env/user-settings.mjs +106 -0
  440. package/foundation/env/user-settings.test.mjs +64 -0
  441. package/foundation/fs/file-protection.mjs +15 -1
  442. package/foundation/fs/module-loader.d.mts +2 -1
  443. package/foundation/fs/module-loader.mjs +60 -4
  444. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  445. package/foundation/fs/module-loader.test.mjs +194 -0
  446. package/foundation/fs/path-compare.d.mts +33 -0
  447. package/foundation/fs/path-compare.mjs +73 -0
  448. package/foundation/fs/paths.d.mts +57 -1
  449. package/foundation/fs/paths.mjs +131 -3
  450. package/foundation/fs/paths.test.mjs +10 -1
  451. package/foundation/integrations/computer-integrations.d.mts +78 -0
  452. package/foundation/integrations/computer-integrations.mjs +316 -0
  453. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  454. package/foundation/integrations/contribution-inventory.d.mts +11 -0
  455. package/foundation/integrations/contribution-inventory.mjs +56 -3
  456. package/foundation/integrations/integration-warnings.mjs +3 -2
  457. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  458. package/foundation/integrations/integrations.d.mts +25 -1
  459. package/foundation/integrations/integrations.mjs +46 -3
  460. package/foundation/integrations/issue.ts +6 -0
  461. package/foundation/integrations/validate-contributions.d.mts +2 -0
  462. package/foundation/integrations/validate-contributions.mjs +41 -1
  463. package/foundation/release/agent-text-worker.d.mts +4 -0
  464. package/foundation/release/agent-text-worker.mjs +52 -0
  465. package/foundation/release/cache.d.mts +310 -0
  466. package/foundation/release/cache.mjs +1216 -0
  467. package/foundation/release/cache.test.mjs +920 -0
  468. package/foundation/release/choose.d.mts +207 -0
  469. package/foundation/release/choose.mjs +677 -0
  470. package/foundation/release/choose.test.mjs +427 -0
  471. package/foundation/release/core-worker.d.mts +4 -0
  472. package/foundation/release/core-worker.mjs +38 -0
  473. package/foundation/release/global-state.d.mts +259 -0
  474. package/foundation/release/global-state.mjs +472 -0
  475. package/foundation/release/global-state.test.mjs +381 -0
  476. package/foundation/release/handoff.d.mts +60 -0
  477. package/foundation/release/handoff.e2e.test.mjs +278 -0
  478. package/foundation/release/handoff.mjs +357 -0
  479. package/foundation/release/lock-lease.d.mts +23 -0
  480. package/foundation/release/lock-lease.mjs +80 -0
  481. package/foundation/release/notices.d.mts +253 -0
  482. package/foundation/release/notices.mjs +596 -0
  483. package/foundation/release/notices.test.mjs +565 -0
  484. package/foundation/release/npm-guard.d.mts +4 -0
  485. package/foundation/release/npm-guard.mjs +126 -0
  486. package/foundation/release/project.d.mts +141 -0
  487. package/foundation/release/project.mjs +466 -0
  488. package/foundation/release/project.test.mjs +288 -0
  489. package/foundation/release/refresh-worker.d.mts +4 -0
  490. package/foundation/release/refresh-worker.mjs +27 -0
  491. package/foundation/release/run-context.d.mts +47 -0
  492. package/foundation/release/run-context.mjs +149 -0
  493. package/foundation/release/update-notice-env.d.mts +28 -0
  494. package/foundation/release/update-notice-env.mjs +39 -0
  495. package/foundation/response/base.d.ts +26 -3
  496. package/foundation/response/error-codes.d.mts +3 -1
  497. package/foundation/response/error-codes.doc.mjs +12 -0
  498. package/foundation/response/error-codes.mjs +17 -0
  499. package/foundation/response/error-codes.test.mjs +2 -0
  500. package/foundation/response/json-contract.test.mjs +7 -2
  501. package/foundation/response/json.mjs +4 -1
  502. package/foundation/response/response-types.doc.mjs +22 -11
  503. package/foundation/response/response-types.doc.test.mjs +46 -0
  504. package/foundation/response/response.doc.mjs +3 -3
  505. package/foundation/xle/browser-imports.test.mjs +74 -0
  506. package/foundation/xle/registry.mjs +4 -0
  507. package/foundation/xle/registry.test.mjs +28 -0
  508. package/package.json +11 -11
  509. package/scripts/postinstall.mjs +24 -5
@@ -66,6 +66,14 @@ export function isWeightsFile(file: any): file is import("./kit/weights.mjs").We
66
66
  * @returns {string[]} Setup notes (empty when the template needs nothing).
67
67
  */
68
68
  export function templateSetupNotes(template: PageTemplate, cwd: string): string[];
69
+ /**
70
+ * The Core a build answers from: the project's, else the release's own,
71
+ * installed into the per-user cache first when needed (a network install
72
+ * and an npm subprocess; spec AST-081 FR3). Throws as requireCoreDir does.
73
+ * @param {string} cwd
74
+ * @returns {string}
75
+ */
76
+ export function requireBuildCoreDir(cwd: string): string;
69
77
  export { withListingCache } from "../../foundation/fs/listing-cache.mjs";
70
78
  /**
71
79
  * A page template the kit can recommend starting from.
@@ -20,7 +20,7 @@ import fs from 'node:fs';
20
20
 
21
21
  import {discoverTemplates} from '../template/template.mjs';
22
22
  import {componentKeywords} from '../search/search.mjs';
23
- import {findCoreDir} from '../../foundation/fs/paths.mjs';
23
+ import {findCoreDir, requireCoreDir} from '../../foundation/fs/paths.mjs';
24
24
  import {analyzeTemplateNeeds} from '../../foundation/discovery/template-needs.mjs';
25
25
 
26
26
  /**
@@ -177,3 +177,14 @@ export function templateSetupNotes(template, cwd) {
177
177
  return [];
178
178
  }
179
179
  }
180
+
181
+ /**
182
+ * The Core a build answers from: the project's, else the release's own,
183
+ * installed into the per-user cache first when needed (a network install
184
+ * and an npm subprocess; spec AST-081 FR3). Throws as requireCoreDir does.
185
+ * @param {string} cwd
186
+ * @returns {string}
187
+ */
188
+ export function requireBuildCoreDir(cwd) {
189
+ return requireCoreDir(cwd);
190
+ }
@@ -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();'},
@@ -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
  {
@@ -28,11 +28,9 @@
28
28
  */
29
29
 
30
30
  import {search, searchedComponents} from '../../search/search.mjs';
31
- import {findCoreDir} from '../../../foundation/fs/paths.mjs';
32
- import {AstryxError} from '../../error.mjs';
33
- import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
31
+ import {coreDirOrThrow} from '../../error.mjs';
34
32
  import {getResultCoverage} from '../../search/coverage.mjs';
35
- import {loadComponents, loadPageTemplates, loadWeights, templateSetupNotes} from '../_adapter.mjs';
33
+ import {loadComponents, loadPageTemplates, loadWeights, requireBuildCoreDir, templateSetupNotes} from '../_adapter.mjs';
36
34
  import {
37
35
  asksForNewPage,
38
36
  ideaKind,
@@ -260,13 +258,7 @@ export async function buildKit(query, options = {}) {
260
258
  const {cwd = process.cwd(), type, limit = 60} = options;
261
259
  // A kit is built from Core's components, hooks, and templates. An open
262
260
  // search without core covers the docs alone, so the kit asks for core here.
263
- if (type !== 'doc' && !findCoreDir(cwd)) {
264
- throw new AstryxError(
265
- 'Could not find @astryxdesign/core package',
266
- undefined,
267
- ERROR_CODES.ERR_CORE_NOT_FOUND,
268
- );
269
- }
261
+ if (type !== 'doc') coreDirOrThrow(requireBuildCoreDir, cwd);
270
262
  // search()'s JSDoc @returns widens results to object[]; the SearchResponse
271
263
  // shape is the contract (api/search/search.type.mjs). Cast locally rather than
272
264
  // tightening the search @returns (a separate follow-up).
@@ -26,6 +26,8 @@
26
26
  * @property {string|null} sourcePath
27
27
  * @property {string|undefined} issuesUrl
28
28
  * @property {import('../../foundation/integrations/integrations.mjs').LoadedIntegration|null} integration
29
+ * @property {import('../../foundation/discovery/component-discovery.mjs').NameHold} hold
30
+ * how the owner holds the name, for the owner rule
29
31
  */
30
32
  /**
31
33
  * What ownership shaping needs from an owner. The core and legacy-external
@@ -138,6 +140,25 @@ export function assertUnambiguousOwners(owners: ComponentOwner[], dirName: strin
138
140
  * @returns {string | null}
139
141
  */
140
142
  export function resolveLegacyExternalDoc(ext: ExternalPackageRef, dirName: string): string | null;
143
+ /**
144
+ * Whether a legacy external package documents `dirName`.
145
+ * @param {string} cwd
146
+ * @param {string} dirName
147
+ * @returns {boolean}
148
+ */
149
+ export function legacyExternalDocuments(cwd: string, dirName: string): boolean;
150
+ /**
151
+ * Whether a legacy docs package keeps `dirName` over these owners, each of which
152
+ * holds it only as an export a doc records.
153
+ * @param {string} cwd
154
+ * @param {string} dirName
155
+ * @param {Array<{hold?: string, docPath?: string | null}>} owners
156
+ * @returns {boolean}
157
+ */
158
+ export function legacyExternalKeeps(cwd: string, dirName: string, owners: Array<{
159
+ hold?: string;
160
+ docPath?: string | null;
161
+ }>): boolean;
141
162
  /**
142
163
  * The core source file for `dirName` (the no-scope `--source` path reads core
143
164
  * directly — it does NOT fall back to externals or fuzzy search).
@@ -210,7 +231,51 @@ export function scopeSubComponent(docs: LoadedComponentDoc, dirName: string, cor
210
231
  };
211
232
  matchingComponent: any;
212
233
  } | null;
213
- export { CORE_PACKAGE };
234
+ /**
235
+ * The doc an integration owner shows for `dirName`: when `dirName` is a member
236
+ * its family doc lists under its own name (`AcmeSlide` in an `AcmeCarousel`
237
+ * doc), the doc scoped to that member as {@link scopeSubComponent} scopes
238
+ * Core's, keeping the import the family doc states; otherwise `docs` itself.
239
+ * @param {LoadedComponentDoc} docs
240
+ * @param {OwnershipSubject} owner
241
+ * @param {string} dirName
242
+ * @returns {LoadedComponentDoc & {parentDoc?: string, import?: string}}
243
+ */
244
+ export function scopeIntegrationMember(docs: LoadedComponentDoc, owner: OwnershipSubject, dirName: string): LoadedComponentDoc & {
245
+ parentDoc?: string;
246
+ import?: string;
247
+ };
248
+ /**
249
+ * A search response with every inline `{@link <target>}` in a component
250
+ * result's description resolved to the command that opens the doc it names,
251
+ * as `astryx component` prints it (spec:AST-047 FR9). The response object is
252
+ * kept, with its results replaced.
253
+ * @template {{data: {results: any[]}}} R
254
+ * @param {R} response
255
+ * @param {string} cwd
256
+ * @returns {Promise<R>}
257
+ */
258
+ export function linkSearchResponse<R extends {
259
+ data: {
260
+ results: any[];
261
+ };
262
+ }>(response: R, cwd: string): Promise<R>;
263
+ /**
264
+ * A component read with every inline `{@link <target>}` in its doc text
265
+ * resolved to the command that opens the doc it names (spec:AST-047 FR9), in
266
+ * the detail, its props projection, and each list entry. A Core component's
267
+ * links resolve against the CLI's own docs; an integration's against that
268
+ * integration's. A link that names no doc prints as written.
269
+ * @template {{type: string, package?: string, data?: any}} R
270
+ * @param {R} response
271
+ * @param {string} cwd
272
+ * @returns {Promise<R>}
273
+ */
274
+ export function linkComponentResponse<R extends {
275
+ type: string;
276
+ package?: string;
277
+ data?: any;
278
+ }>(response: R, cwd: string): Promise<R>;
214
279
  /**
215
280
  * Internal ambiguity marker. Single-component callers still receive the same
216
281
  * AstryxError code, message, and suggestions; batch callers can additionally
@@ -261,6 +326,10 @@ export type ComponentOwner = {
261
326
  sourcePath: string | null;
262
327
  issuesUrl: string | undefined;
263
328
  integration: import("../../foundation/integrations/integrations.mjs").LoadedIntegration | null;
329
+ /**
330
+ * how the owner holds the name, for the owner rule
331
+ */
332
+ hold: import("../../foundation/discovery/component-discovery.mjs").NameHold;
264
333
  };
265
334
  /**
266
335
  * What ownership shaping needs from an owner. The core and legacy-external
@@ -303,4 +372,6 @@ export type ResolvedUnscopedDoc = {
303
372
  resolvedSourcePath: string | null;
304
373
  };
305
374
  import { CORE_PACKAGE } from '../../foundation/discovery/component-discovery.mjs';
375
+ import { unscopedComponentOwners } from '../../foundation/discovery/component-discovery.mjs';
306
376
  import { AstryxError } from '../error.mjs';
377
+ export { CORE_PACKAGE, unscopedComponentOwners };
@@ -22,27 +22,36 @@ import * as fs from 'node:fs';
22
22
  import * as path from 'node:path';
23
23
  import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
24
24
  import {
25
- findCoreDir,
25
+ requireCoreDir as requireAnswerCoreDir,
26
26
  discoverExternalPackages,
27
27
  } from '../../foundation/fs/paths.mjs';
28
28
  import {
29
29
  CORE_PACKAGE,
30
30
  discoverComponents,
31
+ docStem,
31
32
  findComponentReadme,
32
33
  findComponentSource,
33
34
  findExternalComponentDoc,
34
- findIntegrationComponentDoc,
35
- findIntegrationComponentSource,
35
+ findIntegrationComponent,
36
+ integrationMemberEntry,
37
+ isIntegrationMember,
38
+ recordedDocName,
36
39
  resolveImportPath,
37
40
  resolveIntegrationImportPath as resolveIntegrationImport,
41
+ unscopedComponentOwners,
38
42
  } from '../../foundation/discovery/component-discovery.mjs';
39
43
  import {Project} from '../../foundation/config/project.mjs';
40
44
  import {loadComponentDoc as loadValidatedComponentDoc} from '../../foundation/discovery/component-loader.mjs';
41
45
  import {resolveComponentReplacements} from '../../foundation/discovery/component-replacement.mjs';
42
46
  import {searchComponents} from '../../foundation/text/string-utils.mjs';
43
- import {AstryxError} from '../error.mjs';
47
+ import {AstryxError, coreDirOrThrow} from '../error.mjs';
48
+ import {
49
+ componentLinkProvider,
50
+ linkComponentDoc,
51
+ loadDocsCatalog,
52
+ } from '../docs/_adapter.mjs';
44
53
 
45
- export {CORE_PACKAGE};
54
+ export {CORE_PACKAGE, unscopedComponentOwners};
46
55
 
47
56
  /**
48
57
  * A loaded component doc. The shared validated loader accepts stamped and legacy
@@ -71,6 +80,8 @@ export {CORE_PACKAGE};
71
80
  * @property {string|null} sourcePath
72
81
  * @property {string|undefined} issuesUrl
73
82
  * @property {import('../../foundation/integrations/integrations.mjs').LoadedIntegration|null} integration
83
+ * @property {import('../../foundation/discovery/component-discovery.mjs').NameHold} hold
84
+ * how the owner holds the name, for the owner rule
74
85
  */
75
86
 
76
87
  /**
@@ -110,15 +121,7 @@ export {CORE_PACKAGE};
110
121
  * @returns {string}
111
122
  */
112
123
  export function requireCoreDir(cwd) {
113
- const coreDir = findCoreDir(cwd);
114
- if (!coreDir) {
115
- throw new AstryxError(
116
- 'Could not find @astryxdesign/core package',
117
- undefined,
118
- ERROR_CODES.ERR_CORE_NOT_FOUND,
119
- );
120
- }
121
- return coreDir;
124
+ return coreDirOrThrow(requireAnswerCoreDir, cwd);
122
125
  }
123
126
 
124
127
  /**
@@ -240,17 +243,19 @@ export function resolveOwners(coreDir, dirName, loadedIntegrations) {
240
243
  sourcePath: findComponentSource(coreDir, dirName),
241
244
  issuesUrl: undefined,
242
245
  integration: null,
246
+ hold: 'core',
243
247
  });
244
248
  }
245
249
  for (const integration of loadedIntegrations) {
246
- const docPath = findIntegrationComponentDoc(integration, dirName);
247
- if (!docPath) continue;
250
+ const found = findIntegrationComponent(integration, dirName);
251
+ if (!found) continue;
248
252
  owners.push({
249
253
  package: integration.name,
250
- docPath,
251
- sourcePath: findIntegrationComponentSource(integration, dirName),
254
+ docPath: found.docPath,
255
+ sourcePath: found.sourcePath,
252
256
  issuesUrl: integration.issuesUrl,
253
257
  integration,
258
+ hold: found.hold,
254
259
  });
255
260
  }
256
261
  return owners;
@@ -361,6 +366,39 @@ export function resolveLegacyExternalDoc(ext, dirName) {
361
366
  return extDocPath && extDocPath.endsWith('.doc.mjs') ? extDocPath : null;
362
367
  }
363
368
 
369
+ /**
370
+ * Whether a legacy external package documents `dirName`.
371
+ * @param {string} cwd
372
+ * @param {string} dirName
373
+ * @returns {boolean}
374
+ */
375
+ export function legacyExternalDocuments(cwd, dirName) {
376
+ return discoverExternalPackages(cwd).some(
377
+ ext => resolveLegacyExternalDoc(ext, dirName) != null,
378
+ );
379
+ }
380
+
381
+ /**
382
+ * Whether a legacy docs package keeps `dirName` over these owners, each of which
383
+ * holds it only as an export a doc records.
384
+ * @param {string} cwd
385
+ * @param {string} dirName
386
+ * @param {Array<{hold?: string, docPath?: string | null}>} owners
387
+ * @returns {boolean}
388
+ */
389
+ export function legacyExternalKeeps(cwd, dirName, owners) {
390
+ return (
391
+ owners.length > 0 &&
392
+ owners.every(
393
+ owner =>
394
+ owner.hold === 'doc' &&
395
+ owner.docPath != null &&
396
+ docStem(owner.docPath).toLowerCase() !== dirName.toLowerCase(),
397
+ ) &&
398
+ legacyExternalDocuments(cwd, dirName)
399
+ );
400
+ }
401
+
364
402
  /**
365
403
  * The core source file for `dirName` (the no-scope `--source` path reads core
366
404
  * directly — it does NOT fall back to externals or fuzzy search).
@@ -583,3 +621,159 @@ export function scopeSubComponent(docs, dirName, coreDir) {
583
621
 
584
622
  return {scoped, matchingComponent};
585
623
  }
624
+
625
+ /**
626
+ * The doc an integration owner shows for `dirName`: when `dirName` is a member
627
+ * its family doc lists under its own name (`AcmeSlide` in an `AcmeCarousel`
628
+ * doc), the doc scoped to that member as {@link scopeSubComponent} scopes
629
+ * Core's, keeping the import the family doc states; otherwise `docs` itself.
630
+ * @param {LoadedComponentDoc} docs
631
+ * @param {OwnershipSubject} owner
632
+ * @param {string} dirName
633
+ * @returns {LoadedComponentDoc & {parentDoc?: string, import?: string}}
634
+ */
635
+ export function scopeIntegrationMember(docs, owner, dirName) {
636
+ const record = {name: dirName, docPath: owner.docPath ?? null};
637
+ if (!isIntegrationMember(record)) return docs;
638
+ const entry = integrationMemberEntry(docs, record);
639
+ // The files list the member but the doc this process loaded has no entry
640
+ // for it (the doc changed after it loaded): never answer with the family.
641
+ if (entry == null) {
642
+ throw new AstryxError(
643
+ `No component named "${dirName}": its family doc changed after this process loaded it.`,
644
+ undefined,
645
+ ERROR_CODES.ERR_UNKNOWN_COMPONENT,
646
+ );
647
+ }
648
+ // Built from the entry, as scopeSubComponent scopes Core's, so a member that
649
+ // shares the doc's own `name` is scoped too.
650
+ /** @type {LoadedComponentDoc & {parentDoc?: string, import?: string}} */
651
+ const scoped = {
652
+ name: dirName,
653
+ description: entry.description,
654
+ props: entry.props,
655
+ components: [entry],
656
+ // The name the family doc opens under, for every member.
657
+ parentDoc:
658
+ owner.integration && record.docPath
659
+ ? recordedDocName(owner.integration, record.docPath)
660
+ : docs.name === dirName && record.docPath
661
+ ? docStem(record.docPath)
662
+ : docs.name,
663
+ };
664
+ if (docs.usage) scoped.usage = docs.usage;
665
+ if (docs.theming) scoped.theming = docs.theming;
666
+ if (docs.import) scoped.import = docs.import;
667
+ return scoped;
668
+ }
669
+
670
+ /**
671
+ * A search response with every inline `{@link <target>}` in a component
672
+ * result's description resolved to the command that opens the doc it names,
673
+ * as `astryx component` prints it (spec:AST-047 FR9). The response object is
674
+ * kept, with its results replaced.
675
+ * @template {{data: {results: any[]}}} R
676
+ * @param {R} response
677
+ * @param {string} cwd
678
+ * @returns {Promise<R>}
679
+ */
680
+ export async function linkSearchResponse(response, cwd) {
681
+ const results = response.data.results;
682
+ if (
683
+ !results.some(
684
+ result =>
685
+ result?.domain === 'component' &&
686
+ typeof result.description === 'string' &&
687
+ result.description.includes('{@link'),
688
+ )
689
+ ) {
690
+ return response;
691
+ }
692
+ const linked = [];
693
+ for (const result of results) {
694
+ if (
695
+ result?.domain !== 'component' ||
696
+ typeof result.description !== 'string' ||
697
+ !result.description.includes('{@link')
698
+ ) {
699
+ linked.push(result);
700
+ continue;
701
+ }
702
+ const read = await linkComponentResponse(
703
+ {
704
+ type: 'component.detail',
705
+ package: result.package,
706
+ data: {description: result.description},
707
+ },
708
+ cwd,
709
+ );
710
+ linked.push({...result, description: read.data.description});
711
+ }
712
+ response.data = {...response.data, results: linked};
713
+ return response;
714
+ }
715
+
716
+ /**
717
+ * A component read with every inline `{@link <target>}` in its doc text
718
+ * resolved to the command that opens the doc it names (spec:AST-047 FR9), in
719
+ * the detail, its props projection, and each list entry. A Core component's
720
+ * links resolve against the CLI's own docs; an integration's against that
721
+ * integration's. A link that names no doc prints as written.
722
+ * @template {{type: string, package?: string, data?: any}} R
723
+ * @param {R} response
724
+ * @param {string} cwd
725
+ * @returns {Promise<R>}
726
+ */
727
+ export async function linkComponentResponse(response, cwd) {
728
+ const {type} = response;
729
+ if (
730
+ type !== 'component.detail' &&
731
+ type !== 'component.detail.props' &&
732
+ type !== 'component.list'
733
+ ) {
734
+ return response;
735
+ }
736
+ if (!JSON.stringify(response.data ?? null).includes('{@link')) {
737
+ return response;
738
+ }
739
+ const catalog = await loadDocsCatalog(cwd);
740
+ /** @type {Map<string, string>} */
741
+ const declared = new Map();
742
+ for (const integration of await loadIntegrationsSafely(cwd)) {
743
+ const id = /** @type {any} */ (integration).providerId;
744
+ if (typeof id === 'string') declared.set(integration.name, id);
745
+ }
746
+ /**
747
+ * @param {any} doc
748
+ * @param {string | undefined} owner
749
+ */
750
+ const link = async (doc, owner) => {
751
+ if (typeof owner !== 'string') return doc;
752
+ try {
753
+ return (
754
+ await linkComponentDoc(
755
+ catalog,
756
+ componentLinkProvider(owner, declared.get(owner)),
757
+ doc,
758
+ )
759
+ ).doc;
760
+ } catch {
761
+ // An owner that is not a provider id links nothing; its text reads as
762
+ // written.
763
+ return doc;
764
+ }
765
+ };
766
+ if (type !== 'component.list') {
767
+ return {...response, data: await link(response.data, response.package)};
768
+ }
769
+ /** @type {Record<string, any[]>} */
770
+ const components = {};
771
+ for (const [group, entries] of Object.entries(
772
+ response.data.components ?? {},
773
+ )) {
774
+ const linked = [];
775
+ for (const entry of entries) linked.push(await link(entry, entry?.package));
776
+ components[group] = linked;
777
+ }
778
+ return {...response, data: {...response.data, components}};
779
+ }
@@ -24,7 +24,8 @@ export const doc = {
24
24
  'showcase, or example blocks. An integration component that replaces a Core ' +
25
25
  'component (its doc sets replaces, and its package declares the CLI range that ' +
26
26
  'turns replacement on) answers to the Core name in detail, batch, and list ' +
27
- "results; use options.package '@astryxdesign/core' for the original.",
27
+ "results; use options.package '@astryxdesign/core' for the original." +
28
+ " In global mode: with `cwd` outside a project, components from integrations installed next to this CLI package globally resolve too; inside a project, only the project's own integrations count. See {@link namespace:global} and {@link generic:computer-integrations}.",
28
29
  importPath: '@astryxdesign/cli/api',
29
30
  signature:
30
31
  'component(name?: string | string[], options?: ComponentOptions): Promise<ComponentListResponse | ComponentBatchResponse | ComponentDetailResponse | ComponentDetailPropsResponse | ComponentDetailSourceResponse | ComponentDetailShowcaseResponse | ComponentDetailBlocksResponse>',
@@ -164,6 +165,10 @@ export const doc = {
164
165
  code: 'ERR_CORE_NOT_FOUND',
165
166
  when: '@astryxdesign/core cannot be resolved from cwd',
166
167
  },
168
+ {
169
+ code: 'ERR_VERSIONS_UNAVAILABLE',
170
+ when: 'outside a project, or in a project with nothing installed, 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)',
171
+ },
167
172
  {
168
173
  code: 'ERR_UNKNOWN_CATEGORY',
169
174
  when: 'options.category is not a string or matches no component group',