@astryxdesign/cli 0.7.2-canary.fdd384f → 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 (450) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +169 -149
  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/kit/kit.mjs +3 -11
  7. package/api/component/_adapter.d.mts +31 -0
  8. package/api/component/_adapter.mjs +119 -11
  9. package/api/component/component.doc.mjs +6 -1
  10. package/api/component/component.mjs +60 -10
  11. package/api/component/doc-links.test.mjs +386 -0
  12. package/api/discover/_adapter.d.mts +132 -12
  13. package/api/discover/_adapter.mjs +488 -27
  14. package/api/discover/_adapter.test.mjs +599 -17
  15. package/api/discover/_catalog-view.d.mts +16 -5
  16. package/api/discover/_catalog-view.mjs +32 -8
  17. package/api/discover/detail/doc/doc.mjs +9 -1
  18. package/api/discover/discover.d.mts +11 -0
  19. package/api/discover/discover.doc.mjs +9 -7
  20. package/api/discover/discover.mjs +121 -19
  21. package/api/discover/discover.type.d.mts +20 -7
  22. package/api/discover/discover.type.mjs +17 -7
  23. package/api/discover/list/list.d.mts +4 -3
  24. package/api/discover/list/list.mjs +17 -10
  25. package/api/docs/_adapter.d.mts +63 -0
  26. package/api/docs/_adapter.mjs +312 -18
  27. package/api/docs/docs.doc.mjs +2 -1
  28. package/api/docs/docs.mjs +2 -1
  29. package/api/docs/docs.test.mjs +5 -2
  30. package/api/docs/integration-tree.test.mjs +22 -0
  31. package/api/docs/list/list.mjs +12 -2
  32. package/api/docs/reference-blocks.test.mjs +1 -3
  33. package/api/doctor/_adapter.d.mts +108 -0
  34. package/api/doctor/_adapter.mjs +223 -4
  35. package/api/doctor/doctor.d.mts +199 -0
  36. package/api/doctor/doctor.doc.mjs +3 -2
  37. package/api/doctor/doctor.mjs +530 -34
  38. package/api/doctor/doctor.test.mjs +180 -14
  39. package/api/doctor/release-checks.test.mjs +156 -0
  40. package/api/doctor/theme-checks.mjs +16 -3
  41. package/api/doctor/theme-checks.test.mjs +223 -7
  42. package/api/error.d.mts +10 -0
  43. package/api/error.mjs +25 -0
  44. package/api/gap-report/gap-report.d.mts +3 -0
  45. package/api/gap-report/gap-report.doc.mjs +11 -3
  46. package/api/gap-report/gap-report.mjs +152 -48
  47. package/api/gap-report/gap-report.test.mjs +233 -0
  48. package/api/gap-report/gap-report.type.d.mts +41 -0
  49. package/api/gap-report/gap-report.type.mjs +18 -0
  50. package/api/hook/_adapter.mjs +3 -11
  51. package/api/hook/hook.doc.mjs +4 -0
  52. package/api/hook/list/list.d.mts +1 -1
  53. package/api/init/_adapter.d.mts +22 -0
  54. package/api/init/_adapter.mjs +59 -0
  55. package/api/init/init.d.mts +7 -5
  56. package/api/init/init.doc.mjs +28 -7
  57. package/api/init/init.mjs +28 -4
  58. package/api/init/init.type.d.mts +48 -3
  59. package/api/init/init.type.mjs +37 -3
  60. package/api/init/run/run.d.mts +1 -1
  61. package/api/init/run/run.mjs +15 -4
  62. package/api/init/user/user.d.mts +14 -0
  63. package/api/init/user/user.mjs +87 -0
  64. package/api/init/user/user.test.mjs +232 -0
  65. package/api/integration/_adapter.d.mts +33 -0
  66. package/api/integration/_adapter.mjs +58 -0
  67. package/api/integration/authoring-checks.mjs +100 -5
  68. package/api/integration/authoring-checks.test.mjs +769 -0
  69. package/api/integration/authoring-checks.type.d.mts +134 -0
  70. package/api/integration/authoring-checks.type.mjs +60 -1
  71. package/api/integration/integrationCheck.doc.mjs +1 -1
  72. package/api/integration/integrationComponentConflicts.doc.mjs +11 -3
  73. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  74. package/api/integration/pack-check.mjs +303 -13
  75. package/api/integration/pack-check.test.mjs +371 -10
  76. package/api/integration/validate-integration-fixes.test.mjs +67 -0
  77. package/api/integration/validate-integration.d.mts +8 -0
  78. package/api/integration/validate-integration.mjs +55 -9
  79. package/api/integration/validate-integration.test.mjs +77 -8
  80. package/api/integration/validate-integration.type.d.mts +8 -0
  81. package/api/integration/validate-integration.type.mjs +3 -1
  82. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  83. package/api/integration/validateIntegration.doc.mjs +4 -2
  84. package/api/search/_adapter.d.mts +11 -0
  85. package/api/search/_adapter.mjs +25 -0
  86. package/api/search/search.d.mts +73 -13
  87. package/api/search/search.doc.mjs +8 -3
  88. package/api/search/search.domain-priority.test.mjs +108 -18
  89. package/api/search/search.mjs +541 -52
  90. package/api/search/search.test.mjs +143 -1
  91. package/api/search/search.type.d.mts +14 -1
  92. package/api/search/search.type.mjs +6 -1
  93. package/api/swizzle/_adapter.mjs +2 -2
  94. package/api/swizzle/copy/copy.mjs +1 -1
  95. package/api/template/template-integration.test.mjs +1 -1
  96. package/api/theme/_adapter.d.mts +16 -0
  97. package/api/theme/_adapter.mjs +32 -5
  98. package/api/theme/build/build.d.mts +2 -1
  99. package/api/theme/build/build.mjs +70 -14
  100. package/api/theme/build/build.packed-old-core.test.mjs +20 -3
  101. package/api/theme/build/font-warning.mjs +5 -3
  102. package/api/theme/build/font-warning.test.mjs +2 -1
  103. package/api/theme/remove/remove.test.mjs +2 -2
  104. package/api/theme/targets/targets.mjs +3 -10
  105. package/api/theme/themeTargets.doc.mjs +4 -0
  106. package/api/theme/use/use.test.mjs +1 -1
  107. package/api/upgrade/_adapter.d.mts +40 -2
  108. package/api/upgrade/_adapter.mjs +118 -5
  109. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  110. package/api/upgrade/run/run.mjs +35 -2
  111. package/api/upgrade/status/status.d.mts +21 -5
  112. package/api/upgrade/status/status.mjs +45 -8
  113. package/api/upgrade/upgrade.doc.mjs +6 -3
  114. package/api/upgrade/upgrade.mjs +5 -1
  115. package/api/upgrade/upgrade.type.d.mts +23 -0
  116. package/api/upgrade/upgrade.type.mjs +16 -1
  117. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  118. package/assets/codemods/registry.mjs +1 -0
  119. package/assets/codemods/runner.mjs +7 -1
  120. package/assets/codemods/transforms/next/index.mjs +1 -11
  121. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  122. package/assets/discover/official-packages.json +367 -0
  123. package/assets/docs/author-a-theme.doc.mjs +2 -2
  124. package/assets/docs/browser-support.doc.mjs +1 -1
  125. package/assets/docs/getting-started.doc.mjs +23 -3
  126. package/assets/docs/styling-overview.doc.mjs +1 -1
  127. package/assets/docs/theme.doc.mjs +1 -1
  128. package/assets/docs/tree/add-a-component.doc.mjs +12 -2
  129. package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
  130. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  131. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  132. package/assets/docs/tree/block-template.doc.mjs +6 -18
  133. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  134. package/assets/docs/tree/building-blocks.doc.mjs +4 -0
  135. package/assets/docs/tree/check-the-props.doc.mjs +8 -3
  136. package/assets/docs/tree/check-your-docs.doc.mjs +30 -13
  137. package/assets/docs/tree/checks.doc.mjs +17 -17
  138. package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
  139. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  140. package/assets/docs/tree/cli.doc.mjs +6 -0
  141. package/assets/docs/tree/codemods.doc.mjs +17 -7
  142. package/assets/docs/tree/commands.doc.mjs +7 -1
  143. package/assets/docs/tree/component-family.doc.mjs +3 -5
  144. package/assets/docs/tree/component-imports.doc.mjs +13 -3
  145. package/assets/docs/tree/components.doc.mjs +7 -1
  146. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  147. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  148. package/assets/docs/tree/configuration.doc.mjs +7 -3
  149. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  150. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  151. package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
  152. package/assets/docs/tree/docs.doc.mjs +9 -3
  153. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  154. package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
  155. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  156. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  157. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  158. package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
  159. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  160. package/assets/docs/tree/global.doc.mjs +131 -0
  161. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  162. package/assets/docs/tree/install-once.doc.mjs +105 -0
  163. package/assets/docs/tree/integrations.doc.mjs +13 -1
  164. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  165. package/assets/docs/tree/layout.doc.mjs +6 -6
  166. package/assets/docs/tree/links.doc.mjs +6 -5
  167. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  168. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  169. package/assets/docs/tree/migration.doc.mjs +0 -1
  170. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  171. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  172. package/assets/docs/tree/page-template.doc.mjs +3 -7
  173. package/assets/docs/tree/problems.doc.mjs +205 -0
  174. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  175. package/assets/docs/tree/publishing.doc.mjs +6 -6
  176. package/assets/docs/tree/quick-start.doc.mjs +52 -26
  177. package/assets/docs/tree/reference.doc.mjs +192 -0
  178. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  179. package/assets/docs/tree/replace-a-core-template.doc.mjs +9 -11
  180. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  181. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  182. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  183. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  184. package/assets/docs/tree/single-component.doc.mjs +14 -6
  185. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  186. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  187. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  188. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  189. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  190. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  191. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  192. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  193. package/assets/docs/tree/templates.doc.mjs +7 -1
  194. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  195. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  196. package/assets/docs/tree/themes.doc.mjs +4 -0
  197. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  198. package/assets/docs/tree/troubleshooting.doc.mjs +22 -14
  199. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  200. package/assets/docs/tree/updates.doc.mjs +92 -0
  201. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  202. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
  203. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  204. package/assets/docs/tree/versioning.doc.mjs +9 -9
  205. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  206. package/assets/docs/tree/write-the-template-file.doc.mjs +5 -5
  207. package/assets/docs/working-with-ai.doc.mjs +23 -9
  208. package/authoring/codemod/codemod.doc.mjs +7 -3
  209. package/authoring/config/config.doc.mjs +9 -6
  210. package/authoring/config/type.ts +4 -2
  211. package/authoring/debug/parse.d.mts +5 -5
  212. package/authoring/discover/discover.doc.mjs +7 -1
  213. package/authoring/doctypes/_schema.d.mts +8 -3
  214. package/authoring/doctypes/_schema.mjs +1 -0
  215. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  216. package/authoring/doctypes/command/command.doc.mjs +20 -12
  217. package/authoring/doctypes/command/type.ts +14 -0
  218. package/authoring/doctypes/component/component.doc.mjs +29 -26
  219. package/authoring/doctypes/component/type.ts +15 -5
  220. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  221. package/authoring/doctypes/function/function.doc.mjs +9 -8
  222. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  223. package/authoring/doctypes/hook/type.ts +4 -0
  224. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  225. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  226. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  227. package/authoring/doctypes/template/template.doc.mjs +2 -2
  228. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  229. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  230. package/authoring/identity/identity.doc.mjs +3 -3
  231. package/authoring/index.d.ts +1 -0
  232. package/authoring/integration/integration.doc.mjs +22 -5
  233. package/authoring/integration/parse.test.mjs +11 -0
  234. package/authoring/integration/schema.d.mts +14 -3
  235. package/authoring/integration/schema.mjs +33 -2
  236. package/authoring/integration/type.ts +8 -0
  237. package/clients/cli/bin/astryx.mjs +20 -3
  238. package/clients/cli/cli-command.test.mjs +166 -0
  239. package/clients/cli/commands/blog.doc.mjs +1 -0
  240. package/clients/cli/commands/build-theme.batch-report.test.mjs +14 -2
  241. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  242. package/clients/cli/commands/build-theme.mjs +25 -12
  243. package/clients/cli/commands/build.doc.mjs +1 -0
  244. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  245. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  246. package/clients/cli/commands/component.doc.mjs +1 -0
  247. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  248. package/clients/cli/commands/discover.doc.mjs +9 -1
  249. package/clients/cli/commands/discover.mjs +144 -93
  250. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  251. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  252. package/clients/cli/commands/docs.doc.mjs +1 -0
  253. package/clients/cli/commands/docs.mjs +49 -19
  254. package/clients/cli/commands/docs.test.mjs +2 -2
  255. package/clients/cli/commands/doctor-integration-components.doc.mjs +7 -3
  256. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  257. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  258. package/clients/cli/commands/doctor-integration-validate.doc.mjs +13 -2
  259. package/clients/cli/commands/doctor-integration.test.mjs +52 -4
  260. package/clients/cli/commands/doctor.doc.mjs +12 -2
  261. package/clients/cli/commands/doctor.mjs +102 -7
  262. package/clients/cli/commands/doctor.test.mjs +10 -4
  263. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  264. package/clients/cli/commands/gap-report.mjs +24 -2
  265. package/clients/cli/commands/gap-report.test.mjs +79 -0
  266. package/clients/cli/commands/hook.doc.mjs +1 -0
  267. package/clients/cli/commands/init.behavior.test.mjs +5 -0
  268. package/clients/cli/commands/init.doc.mjs +29 -3
  269. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  270. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  271. package/clients/cli/commands/integration-check.doc.mjs +10 -2
  272. package/clients/cli/commands/integration-check.test.mjs +175 -1
  273. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  274. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  275. package/clients/cli/commands/integration.mjs +15 -9
  276. package/clients/cli/commands/json-contract.test.mjs +11 -2
  277. package/clients/cli/commands/manifest.doc.mjs +1 -0
  278. package/clients/cli/commands/outside-project.test.mjs +774 -0
  279. package/clients/cli/commands/search.doc.mjs +1 -0
  280. package/clients/cli/commands/search.mjs +16 -11
  281. package/clients/cli/commands/search.test.mjs +429 -296
  282. package/clients/cli/commands/setup-nudge.test.mjs +102 -2
  283. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  284. package/clients/cli/commands/swizzle.mjs +5 -3
  285. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  286. package/clients/cli/commands/template.doc.mjs +1 -0
  287. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  288. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  289. package/clients/cli/commands/theme-build.doc.mjs +1 -0
  290. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  291. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  292. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  293. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  294. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  295. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  296. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  297. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  298. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  299. package/clients/cli/commands/upgrade.doc.mjs +22 -1
  300. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  301. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  302. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  303. package/clients/cli/index.mjs +111 -16
  304. package/clients/cli/lib/cli-error.mjs +4 -1
  305. package/clients/cli/lib/component-format.test.mjs +1 -1
  306. package/clients/cli/lib/define-command.mjs +2 -2
  307. package/clients/cli/lib/json-shim.mjs +3 -1
  308. package/clients/cli/lib/manifest.d.ts +9 -0
  309. package/clients/cli/lib/manifest.mjs +17 -1
  310. package/clients/cli/lib/manifest.test.mjs +25 -0
  311. package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
  312. package/foundation/agent-docs/agent-doc-state.mjs +66 -6
  313. package/foundation/agent-docs/agent-docs.d.mts +4 -3
  314. package/foundation/agent-docs/agent-docs.mjs +11 -9
  315. package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
  316. package/foundation/agent-docs/computer-agent-text.mjs +623 -0
  317. package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
  318. package/foundation/config/project.d.mts +35 -3
  319. package/foundation/config/project.mjs +145 -8
  320. package/foundation/config/project.test.mjs +66 -0
  321. package/foundation/config/theme-state.mjs +5 -4
  322. package/foundation/discovery/authoring-self-docs.mjs +1 -1
  323. package/foundation/discovery/cli-self-docs.mjs +20 -3
  324. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  325. package/foundation/discovery/component-replacement.mjs +2 -1
  326. package/foundation/discovery/copied-passages.d.mts +216 -0
  327. package/foundation/discovery/copied-passages.mjs +720 -0
  328. package/foundation/discovery/copied-passages.test.mjs +124 -0
  329. package/foundation/discovery/doc-consistency.d.mts +34 -0
  330. package/foundation/discovery/doc-consistency.mjs +513 -0
  331. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  332. package/foundation/discovery/doc-fluff.d.mts +112 -0
  333. package/foundation/discovery/doc-fluff.mjs +328 -0
  334. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  335. package/foundation/discovery/doc-types.d.mts +1 -1
  336. package/foundation/discovery/doc-types.mjs +15 -8
  337. package/foundation/discovery/doc-types.test.mjs +94 -2
  338. package/foundation/discovery/docs-discovery.d.mts +7 -0
  339. package/foundation/discovery/docs-discovery.mjs +26 -2
  340. package/foundation/discovery/project-typescript.d.mts +11 -2
  341. package/foundation/discovery/project-typescript.mjs +32 -4
  342. package/foundation/discovery/prop-drift.d.mts +26 -7
  343. package/foundation/discovery/prop-drift.mjs +173 -8
  344. package/foundation/discovery/prop-drift.test.mjs +120 -2
  345. package/foundation/discovery/runner-allowlist.d.mts +40 -0
  346. package/foundation/discovery/runner-allowlist.mjs +53 -0
  347. package/foundation/discovery/stray-pointers.d.mts +52 -0
  348. package/foundation/discovery/stray-pointers.mjs +293 -0
  349. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  350. package/foundation/discovery/template-needs.mjs +5 -2
  351. package/foundation/discovery/theme-imports.mjs +8 -4
  352. package/foundation/discovery/theme-imports.test.mjs +1 -1
  353. package/foundation/discovery/type-text.mjs +1 -1
  354. package/foundation/discovery/type-text.test.mjs +1 -1
  355. package/foundation/doc-compiler/doc-loads.test.mjs +42 -2
  356. package/foundation/doc-compiler/inputs.mjs +4 -1
  357. package/foundation/doc-compiler/links.d.mts +32 -0
  358. package/foundation/doc-compiler/links.mjs +163 -26
  359. package/foundation/doc-compiler/links.test.mjs +97 -4
  360. package/foundation/doc-compiler/read.d.mts +1 -1
  361. package/foundation/doc-compiler/tree.mjs +30 -1
  362. package/foundation/doc-compiler/tree.test.mjs +8 -1
  363. package/foundation/env/cli-command.d.mts +83 -0
  364. package/foundation/env/cli-command.mjs +152 -0
  365. package/foundation/env/cli-command.test.mjs +129 -0
  366. package/foundation/env/node-version.test.mjs +15 -3
  367. package/foundation/env/package-manager.d.mts +93 -9
  368. package/foundation/env/package-manager.global.test.mjs +66 -0
  369. package/foundation/env/package-manager.mjs +184 -13
  370. package/foundation/env/package-manager.test.mjs +341 -15
  371. package/foundation/env/project-scope.d.mts +9 -0
  372. package/foundation/env/project-scope.mjs +33 -0
  373. package/foundation/env/search-path.d.mts +42 -0
  374. package/foundation/env/search-path.mjs +205 -0
  375. package/foundation/env/search-path.test.mjs +122 -0
  376. package/foundation/env/user-dirs.d.mts +39 -0
  377. package/foundation/env/user-dirs.mjs +93 -0
  378. package/foundation/env/user-dirs.test.mjs +72 -0
  379. package/foundation/env/user-settings.d.mts +46 -0
  380. package/foundation/env/user-settings.mjs +106 -0
  381. package/foundation/env/user-settings.test.mjs +64 -0
  382. package/foundation/fs/file-protection.mjs +15 -1
  383. package/foundation/fs/module-loader.d.mts +2 -1
  384. package/foundation/fs/module-loader.mjs +60 -4
  385. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  386. package/foundation/fs/module-loader.test.mjs +194 -0
  387. package/foundation/fs/path-compare.d.mts +33 -0
  388. package/foundation/fs/path-compare.mjs +73 -0
  389. package/foundation/fs/paths.d.mts +57 -1
  390. package/foundation/fs/paths.mjs +131 -3
  391. package/foundation/fs/paths.test.mjs +10 -1
  392. package/foundation/integrations/computer-integrations.d.mts +78 -0
  393. package/foundation/integrations/computer-integrations.mjs +316 -0
  394. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  395. package/foundation/integrations/contribution-inventory.d.mts +11 -0
  396. package/foundation/integrations/contribution-inventory.mjs +50 -2
  397. package/foundation/integrations/integration-warnings.mjs +3 -2
  398. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  399. package/foundation/integrations/integrations.d.mts +25 -1
  400. package/foundation/integrations/integrations.mjs +46 -3
  401. package/foundation/integrations/issue.ts +6 -0
  402. package/foundation/integrations/validate-contributions.d.mts +2 -0
  403. package/foundation/integrations/validate-contributions.mjs +41 -1
  404. package/foundation/release/agent-text-worker.d.mts +4 -0
  405. package/foundation/release/agent-text-worker.mjs +52 -0
  406. package/foundation/release/cache.d.mts +310 -0
  407. package/foundation/release/cache.mjs +1216 -0
  408. package/foundation/release/cache.test.mjs +920 -0
  409. package/foundation/release/choose.d.mts +207 -0
  410. package/foundation/release/choose.mjs +677 -0
  411. package/foundation/release/choose.test.mjs +427 -0
  412. package/foundation/release/core-worker.d.mts +4 -0
  413. package/foundation/release/core-worker.mjs +38 -0
  414. package/foundation/release/global-state.d.mts +259 -0
  415. package/foundation/release/global-state.mjs +472 -0
  416. package/foundation/release/global-state.test.mjs +381 -0
  417. package/foundation/release/handoff.d.mts +60 -0
  418. package/foundation/release/handoff.e2e.test.mjs +278 -0
  419. package/foundation/release/handoff.mjs +357 -0
  420. package/foundation/release/lock-lease.d.mts +23 -0
  421. package/foundation/release/lock-lease.mjs +80 -0
  422. package/foundation/release/notices.d.mts +253 -0
  423. package/foundation/release/notices.mjs +596 -0
  424. package/foundation/release/notices.test.mjs +565 -0
  425. package/foundation/release/npm-guard.d.mts +4 -0
  426. package/foundation/release/npm-guard.mjs +126 -0
  427. package/foundation/release/project.d.mts +141 -0
  428. package/foundation/release/project.mjs +466 -0
  429. package/foundation/release/project.test.mjs +288 -0
  430. package/foundation/release/refresh-worker.d.mts +4 -0
  431. package/foundation/release/refresh-worker.mjs +27 -0
  432. package/foundation/release/run-context.d.mts +47 -0
  433. package/foundation/release/run-context.mjs +149 -0
  434. package/foundation/release/update-notice-env.d.mts +28 -0
  435. package/foundation/release/update-notice-env.mjs +39 -0
  436. package/foundation/response/base.d.ts +26 -3
  437. package/foundation/response/error-codes.d.mts +3 -1
  438. package/foundation/response/error-codes.doc.mjs +12 -0
  439. package/foundation/response/error-codes.mjs +17 -0
  440. package/foundation/response/error-codes.test.mjs +2 -0
  441. package/foundation/response/json-contract.test.mjs +7 -2
  442. package/foundation/response/json.mjs +4 -1
  443. package/foundation/response/response-types.doc.mjs +17 -11
  444. package/foundation/response/response-types.doc.test.mjs +46 -0
  445. package/foundation/response/response.doc.mjs +3 -3
  446. package/foundation/xle/browser-imports.test.mjs +74 -0
  447. package/package.json +11 -11
  448. package/scripts/postinstall.mjs +24 -5
  449. /package/assets/codemods/transforms/{next → v0.7.2}/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +0 -0
  450. /package/assets/codemods/transforms/{next → v0.7.2}/migrate-list-edge-compensation-to-edge.mjs +0 -0
@@ -34,13 +34,17 @@ export function kindLists(contributions: CatalogPackage["contributions"]): Recor
34
34
  */
35
35
  export function hasKind(entry: Record<string, unknown>, kind: DiscoverKind): boolean;
36
36
  /**
37
- * Where a catalog package stands against the project.
37
+ * Where a catalog package stands against the project. An entry the official
38
+ * list supplied is checked against the project's own package.json
39
+ * (`officialDeclared`); any other entry against the folder discover runs in
40
+ * (`declared`).
38
41
  * @param {CatalogPackage} pkg
39
42
  * @param {Set<string>} installedNames
40
43
  * @param {Set<string>} declared
44
+ * @param {Set<string>} [officialDeclared]
41
45
  * @returns {{state: 'installed' | 'declared' | 'alias' | 'available', installedAs?: string}}
42
46
  */
43
- export function catalogState(pkg: CatalogPackage, installedNames: Set<string>, declared: Set<string>): {
47
+ export function catalogState(pkg: CatalogPackage, installedNames: Set<string>, declared: Set<string>, officialDeclared?: Set<string>): {
44
48
  state: "installed" | "declared" | "alias" | "available";
45
49
  installedAs?: string;
46
50
  };
@@ -64,12 +68,18 @@ export function catalogEntry(pkg: CatalogPackage, version: string | undefined):
64
68
  };
65
69
  /**
66
70
  * What the project could add: every catalog package it does not have, once per
67
- * integration (the first name a source lists), never an alias of one it has.
71
+ * integration (the first name a source lists), never an alias of one it has,
72
+ * each with the command that adds it when `install` is given.
68
73
  * @param {CatalogResult} catalog
69
74
  * @param {InstalledPackage[]} installed
70
75
  * @param {Set<string>} declared
76
+ * @param {{officialDeclared?: Set<string>, install?: (pkg: CatalogPackage) => string}} [options]
71
77
  */
72
- export function availableEntries(catalog: CatalogResult, installed: InstalledPackage[], declared: Set<string>): {
78
+ export function availableEntries(catalog: CatalogResult, installed: InstalledPackage[], declared: Set<string>, { officialDeclared, install }?: {
79
+ officialDeclared?: Set<string>;
80
+ install?: (pkg: CatalogPackage) => string;
81
+ }): {
82
+ install?: string | undefined;
73
83
  source: string;
74
84
  aliases?: string[] | undefined;
75
85
  description?: string | undefined;
@@ -93,9 +103,10 @@ export function withLatest(installed: InstalledPackage[], catalog: CatalogResult
93
103
  * @param {InstalledPackage[]} installed
94
104
  * @param {CatalogResult} catalog
95
105
  * @param {Set<string>} declared
106
+ * @param {Set<string>} [officialDeclared]
96
107
  * @returns {SearchItem[]}
97
108
  */
98
- export function searchItems(installed: InstalledPackage[], catalog: CatalogResult, declared: Set<string>): SearchItem[];
109
+ export function searchItems(installed: InstalledPackage[], catalog: CatalogResult, declared: Set<string>, officialDeclared?: Set<string>): SearchItem[];
99
110
  export type InstalledPackage = import("./_adapter.mjs").InstalledPackage;
100
111
  export type CatalogResult = import("./_adapter.mjs").CatalogResult;
101
112
  export type CatalogPackage = CatalogResult["packages"][number];
@@ -59,15 +59,24 @@ export function hasKind(entry, kind) {
59
59
  }
60
60
 
61
61
  /**
62
- * Where a catalog package stands against the project.
62
+ * Where a catalog package stands against the project. An entry the official
63
+ * list supplied is checked against the project's own package.json
64
+ * (`officialDeclared`); any other entry against the folder discover runs in
65
+ * (`declared`).
63
66
  * @param {CatalogPackage} pkg
64
67
  * @param {Set<string>} installedNames
65
68
  * @param {Set<string>} declared
69
+ * @param {Set<string>} [officialDeclared]
66
70
  * @returns {{state: 'installed' | 'declared' | 'alias' | 'available', installedAs?: string}}
67
71
  */
68
- export function catalogState(pkg, installedNames, declared) {
72
+ export function catalogState(pkg, installedNames, declared, officialDeclared) {
69
73
  if (installedNames.has(pkg.package)) return {state: 'installed'};
70
- if (declared.has(pkg.package)) return {state: 'declared'};
74
+ if (
75
+ (pkg.official && officialDeclared ? officialDeclared : declared).has(
76
+ pkg.package,
77
+ )
78
+ )
79
+ return {state: 'declared'};
71
80
  const installedAs = pkg.aliases.find(
72
81
  name => installedNames.has(name) || declared.has(name),
73
82
  );
@@ -103,18 +112,28 @@ export function catalogEntry(pkg, version) {
103
112
 
104
113
  /**
105
114
  * What the project could add: every catalog package it does not have, once per
106
- * integration (the first name a source lists), never an alias of one it has.
115
+ * integration (the first name a source lists), never an alias of one it has,
116
+ * each with the command that adds it when `install` is given.
107
117
  * @param {CatalogResult} catalog
108
118
  * @param {InstalledPackage[]} installed
109
119
  * @param {Set<string>} declared
120
+ * @param {{officialDeclared?: Set<string>, install?: (pkg: CatalogPackage) => string}} [options]
110
121
  */
111
- export function availableEntries(catalog, installed, declared) {
122
+ export function availableEntries(
123
+ catalog,
124
+ installed,
125
+ declared,
126
+ {officialDeclared, install} = {},
127
+ ) {
112
128
  const installedNames = new Set(installed.map(p => p.name));
113
129
  /** @type {Set<string>} */
114
130
  const integrations = new Set();
115
131
  const entries = [];
116
132
  for (const pkg of catalog.packages) {
117
- if (catalogState(pkg, installedNames, declared).state !== 'available')
133
+ if (
134
+ catalogState(pkg, installedNames, declared, officialDeclared).state !==
135
+ 'available'
136
+ )
118
137
  continue;
119
138
  if (integrations.has(pkg.integration)) continue;
120
139
  integrations.add(pkg.integration);
@@ -124,6 +143,7 @@ export function availableEntries(catalog, installed, declared) {
124
143
  ...entry,
125
144
  ...(pkg.aliases.length > 0 ? {aliases: pkg.aliases} : {}),
126
145
  source: pkg.source,
146
+ ...(install ? {install: install(pkg)} : {}),
127
147
  });
128
148
  }
129
149
  return entries;
@@ -150,9 +170,10 @@ export function withLatest(installed, catalog) {
150
170
  * @param {InstalledPackage[]} installed
151
171
  * @param {CatalogResult} catalog
152
172
  * @param {Set<string>} declared
173
+ * @param {Set<string>} [officialDeclared]
153
174
  * @returns {SearchItem[]}
154
175
  */
155
- export function searchItems(installed, catalog, declared) {
176
+ export function searchItems(installed, catalog, declared, officialDeclared) {
156
177
  /** @type {SearchItem[]} */
157
178
  const items = [];
158
179
  for (const pkg of installed) {
@@ -176,7 +197,10 @@ export function searchItems(installed, catalog, declared) {
176
197
  /** @type {Set<string>} */
177
198
  const integrations = new Set();
178
199
  for (const pkg of catalog.packages) {
179
- if (catalogState(pkg, installedNames, declared).state !== 'available')
200
+ if (
201
+ catalogState(pkg, installedNames, declared, officialDeclared).state !==
202
+ 'available'
203
+ )
180
204
  continue;
181
205
  if (integrations.has(pkg.integration)) continue;
182
206
  integrations.add(pkg.integration);
@@ -14,6 +14,7 @@
14
14
  */
15
15
 
16
16
  import {findComponent, loadValidatedDoc} from '../../_adapter.mjs';
17
+ import {linkComponentResponse} from '../../../component/_adapter.mjs';
17
18
  import {levenshteinDistance} from '../../../../foundation/text/string-utils.mjs';
18
19
  import {AstryxError} from '../../../error.mjs';
19
20
  import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
@@ -27,7 +28,14 @@ import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
27
28
  * @returns {Promise<import('../../discover.type.mjs').DiscoverDetailDocResponse>}
28
29
  */
29
30
  export async function docFromResult(result, opts) {
30
- return {type: 'discover.detail.doc', data: await loadValidatedDoc(result, opts)};
31
+ const data = await loadValidatedDoc(result, opts);
32
+ // Its `{@link}`s read as the commands that open their docs, as
33
+ // `astryx component` prints them (spec:AST-047 FR9).
34
+ const linked = await linkComponentResponse(
35
+ {type: 'component.detail', package: result.pkg.name, data},
36
+ process.cwd(),
37
+ );
38
+ return {type: 'discover.detail.doc', data: linked.data};
31
39
  }
32
40
 
33
41
  /**
@@ -1,6 +1,16 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
+ /**
5
+ * Whether discover answers a query in this project, or answers every query
6
+ * with the list (spec:AST-051 FR1): it answers once the project loads an
7
+ * integration or has a discover source of its own. This is the rule
8
+ * `discover()` applies to the project it loads; the command reads it to keep
9
+ * the list's hints from suggesting queries that only return the list.
10
+ * @param {import('../../foundation/config/project.mjs').Project | undefined} project
11
+ * @returns {boolean}
12
+ */
13
+ export function answersQueries(project: import("../../foundation/config/project.mjs").Project | undefined): boolean;
4
14
  /**
5
15
  * @param {string} [query]
6
16
  * @param {import('./discover.type.mjs').DiscoverOptions} [options]
@@ -13,3 +23,4 @@
13
23
  * >}
14
24
  */
15
25
  export function discover(query?: string, options?: import("./discover.type.mjs").DiscoverOptions): Promise<import("./discover.type.mjs").DiscoverListResponse | import("./discover.type.mjs").DiscoverDetailResponse | import("./discover.type.mjs").DiscoverDetailDocResponse | import("./discover.type.mjs").DiscoverItemResponse | import("./discover.type.mjs").DiscoverSearchResponse>;
26
+ export { OFFICIAL_SOURCE_NAME } from "./_adapter.mjs";
@@ -14,13 +14,15 @@ export const doc = {
14
14
  namespace: 'cli/api',
15
15
  displayName: 'discover()',
16
16
  summary:
17
- 'Browse and search integrations: the ones a project has and, through discover sources, the ones it could add.',
17
+ 'Browse and search integrations: the ones a project has and, through the official list and discover sources, the ones it could add.',
18
18
  description:
19
- 'Lists the integrations a project loads and, when the project or an integration provides a discover source, ' +
20
- 'the packages it could add, with what each one adds per kind. An @scope/name query shows one package with every ' +
19
+ 'Lists the integrations a project loads and the official packages it declares, then the packages it could add: ' +
20
+ 'the official Astryx packages first, from the list the CLI carries, then whatever the discover sources of the ' +
21
+ 'project and its integrations list, with what each one adds per kind. An @scope/name query shows one package with every ' +
21
22
  'version its source knows; @scope/name@version shows one version; @scope/name/Component returns an installed ' +
22
23
  "component's validated doc, and any other item path returns that item. A free-text term searches every item and " +
23
- 'package. Discover only reads: it prints the command that adds a package and never runs it.',
24
+ 'package. Discover only reads: it prints the command that adds a package and never runs it.' +
25
+ " In global mode: with `cwd` outside a project, integrations installed next to this CLI package globally are listed as installed; inside a project, only the project's own are, and the compatible global ones are listed in `meta.available` with source `installed for this computer` and an `install` command. See {@link namespace:global} and {@link generic:computer-integrations}.",
24
26
  importPath: '@astryxdesign/cli/api',
25
27
  signature:
26
28
  'discover(query?: string, options?: DiscoverOptions): Promise<DiscoverListResponse | DiscoverDetailResponse | DiscoverDetailDocResponse | DiscoverItemResponse | DiscoverSearchResponse>',
@@ -89,12 +91,12 @@ export const doc = {
89
91
  {
90
92
  type: 'discover.list',
91
93
  description:
92
- 'The installed integrations (name, category, components, version, and a list per other kind they add). With a discover source, meta.available lists what the project could add and meta.sources reports each source. When the list is empty it carries meta.configured.',
94
+ 'What the project has: the integrations it loads and the official packages it declares (name, category, components, version, and a list per other kind they add), official packages first. meta.available lists what the project could add, official packages first, each with the command that adds it; inside a project, an integration installed for the computer that the project does not install is listed there too, with source `installed for this computer` and the install command for the project in `install`. meta.sources reports each source, the official list last. When it lists no integration it carries meta.configured.',
93
95
  },
94
96
  {
95
97
  type: 'discover.detail',
96
98
  description:
97
- 'One package: what the shown version adds, whether the project has it, its versions and latest release when a source knows them, and the command that adds it when the project does not have it.',
99
+ "One package: what the shown version adds, whether the project has it, its versions and latest release when a source knows them, and the command that adds it when the project does not have it. An entry from the official list lists the newest release this CLI knows as latest and the project's Core version; its add command pins the project's Core version, else the Core range it declares (quoted), else the latest release. A version or item the official list does not show answers ERR_UNKNOWN_PACKAGE.",
98
100
  },
99
101
  {
100
102
  type: 'discover.detail.doc',
@@ -123,7 +125,7 @@ export const doc = {
123
125
  },
124
126
  {
125
127
  code: 'ERR_UNKNOWN_PACKAGE',
126
- when: 'neither the project nor any discover source has the package',
128
+ when: 'neither the project, the official list, nor any discover source has the package',
127
129
  },
128
130
  {
129
131
  code: 'ERR_UNKNOWN_COMPONENT',
@@ -4,7 +4,8 @@
4
4
  * @file Programmatic API for the discover command — dispatcher + barrel.
5
5
  *
6
6
  * `discover()` browses the integrations a project has and, through discover
7
- * sources, the ones it could add. It only reads: the package manager installs.
7
+ * sources and the official list the CLI carries, the ones it could add. It
8
+ * only reads: the package manager installs.
8
9
  * Its job is to resolve the project and its sources (via ./_adapter) and route
9
10
  * to the leaf that owns each response shape:
10
11
  *
@@ -22,14 +23,20 @@
22
23
  * the discover leaves.
23
24
  */
24
25
 
26
+ export {OFFICIAL_SOURCE_NAME} from './_adapter.mjs';
25
27
  import {
26
28
  addCommand,
27
29
  callSources,
30
+ computerAvailableEntries,
28
31
  declaredDependencies,
29
32
  describeInstalled,
30
33
  discoverPackages,
31
34
  findComponent,
32
35
  hasSources,
36
+ officialDeclarations,
37
+ officialFirst,
38
+ officialList,
39
+ withDeclaredOfficial,
33
40
  } from './_adapter.mjs';
34
41
  import {
35
42
  availableEntries,
@@ -49,9 +56,6 @@ import {DISCOVER_KINDS} from '../../authoring/discover/parse.mjs';
49
56
 
50
57
  const DEFAULT_LIMIT = 20;
51
58
 
52
- /** @type {import('./_adapter.mjs').CatalogResult} */
53
- const NO_CATALOG = {sources: [], packages: []};
54
-
55
59
  /**
56
60
  * Split a package-shaped query: `name`, `name@version`, or `name/item`, with an
57
61
  * optional `@scope/` prefix on the name.
@@ -144,6 +148,23 @@ function similarItems(entry, wanted) {
144
148
  }));
145
149
  }
146
150
 
151
+ /**
152
+ * Whether discover answers a query in this project, or answers every query
153
+ * with the list (spec:AST-051 FR1): it answers once the project loads an
154
+ * integration or has a discover source of its own. This is the rule
155
+ * `discover()` applies to the project it loads; the command reads it to keep
156
+ * the list's hints from suggesting queries that only return the list.
157
+ * @param {import('../../foundation/config/project.mjs').Project | undefined} project
158
+ * @returns {boolean}
159
+ */
160
+ export function answersQueries(project) {
161
+ return (
162
+ project != null &&
163
+ (project.loadedIntegrations.some(i => !i.__loadError) ||
164
+ hasSources(project))
165
+ );
166
+ }
167
+
147
168
  /**
148
169
  * @param {string} [query]
149
170
  * @param {import('./discover.type.mjs').DiscoverOptions} [options]
@@ -165,24 +186,62 @@ export async function discover(query, options = {}) {
165
186
  : undefined;
166
187
 
167
188
  const {packages: scanned, configured, project} = await discoverPackages();
168
- const withSources = hasSources(project);
169
- const packages = await describeInstalled(project, scanned);
189
+ const integrations = await describeInstalled(project, scanned);
170
190
  const declared = declaredDependencies(project);
191
+ // The official list is always read, so discover always has a source.
192
+ const official = officialList({project});
193
+ const declarations = officialDeclarations(project, official.packages);
171
194
  const add = addCommand(project);
195
+ const addOfficial = addCommand(project, {official: official.packages});
196
+ /** @param {{package: string, official?: true}} pkg */
197
+ const installFor = pkg => (pkg.official ? addOfficial : add)(pkg.package);
172
198
 
173
199
  /** @param {{package?: string, version?: string}} [request] */
174
- const catalogFor = async request =>
175
- withSources ? await callSources(project, request) : NO_CATALOG;
200
+ const catalogFor = request => callSources(project, request, {official});
201
+ /**
202
+ * What the project has, once a catalog says which official packages it
203
+ * declares.
204
+ * @param {import('./_adapter.mjs').CatalogResult} catalog
205
+ */
206
+ const installedFor = catalog =>
207
+ withDeclaredOfficial(
208
+ project,
209
+ integrations,
210
+ catalog,
211
+ declarations,
212
+ official.packages,
213
+ );
176
214
 
177
- // No query, or nothing to look through: the list.
178
- if (!query || (packages.length === 0 && !withSources)) {
179
- if (!withSources) return list(packages, {configured, type, only});
215
+ // No query, or any query in a project that loads no integration and has no
216
+ // discover source of its own: the list (spec:AST-051 FR1).
217
+ if (!query || (integrations.length === 0 && !hasSources(project))) {
180
218
  const catalog = await catalogFor();
219
+ const packages = installedFor(catalog);
220
+ // Inside a project, the integrations installed for the computer are
221
+ // available, never loaded (spec AST-081 FR12).
222
+ const computer = await computerAvailableEntries(
223
+ project,
224
+ packages,
225
+ declared,
226
+ add,
227
+ );
228
+ const fromSources = officialFirst(
229
+ availableEntries(catalog, packages, declared, {
230
+ officialDeclared: declarations.any,
231
+ install: installFor,
232
+ }),
233
+ official.packages,
234
+ entry => entry.name,
235
+ );
236
+ const named = new Set(fromSources.map(entry => entry.name));
181
237
  return list(withLatest(packages, catalog), {
182
238
  configured,
183
239
  type,
184
240
  only,
185
- available: availableEntries(catalog, packages, declared),
241
+ available: [
242
+ ...fromSources,
243
+ ...computer.filter(entry => !named.has(entry.name)),
244
+ ],
186
245
  sources: catalog.sources,
187
246
  });
188
247
  }
@@ -199,7 +258,6 @@ export async function discover(query, options = {}) {
199
258
  }
200
259
 
201
260
  const target = splitTarget(query);
202
- const installedNames = new Set(packages.map(p => p.name));
203
261
 
204
262
  /**
205
263
  * One package, one version, or one item, once `target.name` is known to be
@@ -207,29 +265,72 @@ export async function discover(query, options = {}) {
207
265
  * @param {import('./_adapter.mjs').CatalogResult} catalog
208
266
  */
209
267
  const packageView = async catalog => {
268
+ const packages = installedFor(catalog);
269
+ const installedNames = new Set(packages.map(p => p.name));
210
270
  const entry = catalog.packages.find(p => p.package === target.name);
211
271
  const installedAs = entry
212
- ? catalogState(entry, installedNames, declared).installedAs
272
+ ? catalogState(entry, installedNames, declared, declarations.any)
273
+ .installedAs
213
274
  : undefined;
214
- const context = {catalog: entry, version: target.version, add, installedAs};
275
+ const isIntegration = integrations.some(p => p.name === target.name);
276
+ // An entry only the official list supplies answers for what it lists.
277
+ // Any other version or item of that package keeps the answer discover
278
+ // gave before the list existed: ERR_UNKNOWN_PACKAGE.
279
+ const officialOnly = entry?.official === true && !isIntegration;
280
+ if (officialOnly && target.version) {
281
+ const local = packages.find(p => p.name === target.name)?.version;
282
+ if (
283
+ target.version !== local &&
284
+ !entry.versions.some(v => v.version === target.version)
285
+ ) {
286
+ throw new AstryxError(
287
+ `${target.name}@${target.version} is not a version discover knows here: ${
288
+ entry.versions.length > 0
289
+ ? `it knows ${entry.versions.map(v => v.version).join(', ')}`
290
+ : 'it knows no version of it for this project'
291
+ }. Other versions are on the package registry.`,
292
+ [...new Set([...entry.versions.map(v => v.version), local])]
293
+ .filter(v => v != null)
294
+ .map(v => ({
295
+ name: `${target.name}@${v}`,
296
+ reason: 'version discover knows',
297
+ })),
298
+ ERROR_CODES.ERR_UNKNOWN_PACKAGE,
299
+ );
300
+ }
301
+ }
302
+ const context = {
303
+ catalog: entry,
304
+ version: target.version,
305
+ // Only an entry the official list supplied gets a pinned version.
306
+ add: entry?.official ? addOfficial : add,
307
+ installedAs,
308
+ };
215
309
  if (!target.item) return detail(packages, target.name, context);
216
310
  const found = item(packages, target.name, target.item, context);
217
311
  if (found) return found;
312
+ if (officialOnly) {
313
+ throw new AstryxError(
314
+ `"${target.item}" not found in ${target.name}`,
315
+ similarItems(entry, target.item),
316
+ ERROR_CODES.ERR_UNKNOWN_PACKAGE,
317
+ );
318
+ }
218
319
  // Only an installed package has docs to fall back to. For one that is
219
320
  // only in a source, the item is what is unknown, not the package.
220
- if (entry && !packages.some(p => p.name === target.name)) {
321
+ if (entry && !isIntegration) {
221
322
  throw new AstryxError(
222
323
  `"${target.item}" not found in ${target.name}`,
223
324
  similarItems(entry, target.item),
224
325
  ERROR_CODES.ERR_UNKNOWN_COMPONENT,
225
326
  );
226
327
  }
227
- return await doc(packages, target.name, target.item, {lang, zh});
328
+ return await doc(integrations, target.name, target.item, {lang, zh});
228
329
  };
229
330
 
230
331
  // An installed component keeps resolving to its full doc, before any source
231
332
  // is asked anything.
232
- const installedPkg = packages.find(p => p.name === target.name);
333
+ const installedPkg = integrations.find(p => p.name === target.name);
233
334
  if (installedPkg && target.item && !target.version) {
234
335
  const resolved = findComponent([installedPkg], target.item);
235
336
  if (resolved) return await docFromResult(resolved, {lang, zh});
@@ -251,8 +352,9 @@ export async function discover(query, options = {}) {
251
352
  );
252
353
  }
253
354
 
355
+ const packages = installedFor(listing);
254
356
  return await search(packages, query, {
255
- items: searchItems(packages, listing, declared),
357
+ items: searchItems(packages, listing, declared, declarations.any),
256
358
  type,
257
359
  only,
258
360
  limit: limit ?? DEFAULT_LIMIT,
@@ -7,25 +7,29 @@
7
7
  export type DiscoverListResponse = {
8
8
  type: "discover.list";
9
9
  /**
10
- * The integrations the project loads.
10
+ * What the project has: the integrations
11
+ * it loads and the official packages it declares, official packages first.
11
12
  */
12
13
  data: DiscoverListEntry[];
13
14
  /**
14
15
  * Present when the list is empty, and
15
- * whenever the project has a discover source.
16
+ * whenever discover has a source, which is always: the official list the CLI
17
+ * carries is one.
16
18
  */
17
19
  meta?: DiscoverListMeta | undefined;
18
20
  };
19
21
  export type DiscoverListMeta = {
20
22
  /**
21
- * Present when `data` is empty, so callers can
23
+ * Present when `data` lists no integration (a
24
+ * declared official package is not one), so callers can
22
25
  * distinguish "no packages configured" from "configured but nothing
23
26
  * discovered".
24
27
  */
25
28
  configured?: boolean | undefined;
26
29
  /**
27
30
  * What the project could add,
28
- * one entry per integration, never an alias of a package it has.
31
+ * one entry per integration, never an alias of a package it has; official
32
+ * packages first.
29
33
  */
30
34
  available?: DiscoverAvailableEntry[] | undefined;
31
35
  /**
@@ -34,7 +38,7 @@ export type DiscoverListMeta = {
34
38
  sources?: DiscoverSourceState[] | undefined;
35
39
  };
36
40
  /**
37
- * An installed integration.
41
+ * An installed integration, or an official package the project declares.
38
42
  */
39
43
  export type DiscoverListEntry = {
40
44
  name: string;
@@ -89,14 +93,23 @@ export type DiscoverAvailableEntry = {
89
93
  */
90
94
  aliases?: string[] | undefined;
91
95
  /**
92
- * The discover source that lists it.
96
+ * The discover source that lists it; `Astryx` for
97
+ * the official list; `installed for this computer` for an integration
98
+ * installed beside the CLI that the project does not install (spec AST-081
99
+ * FR12).
93
100
  */
94
101
  source: string;
102
+ /**
103
+ * The package-manager command that adds it to
104
+ * this project; discover prints it and never runs it.
105
+ */
106
+ install?: string | undefined;
95
107
  };
96
108
  export type DiscoverSourceState = {
97
109
  name: string;
98
110
  /**
99
- * `astryx.config`, or the integration that exports it.
111
+ * `astryx.config`, the integration that exports it, or
112
+ * `@astryxdesign/cli` for the official list.
100
113
  */
101
114
  from: string;
102
115
  /**
@@ -21,23 +21,27 @@
21
21
  * astryx --json discover
22
22
  * @typedef {object} DiscoverListResponse
23
23
  * @property {'discover.list'} type
24
- * @property {DiscoverListEntry[]} data The integrations the project loads.
24
+ * @property {DiscoverListEntry[]} data What the project has: the integrations
25
+ * it loads and the official packages it declares, official packages first.
25
26
  * @property {DiscoverListMeta} [meta] Present when the list is empty, and
26
- * whenever the project has a discover source.
27
+ * whenever discover has a source, which is always: the official list the CLI
28
+ * carries is one.
27
29
  */
28
30
 
29
31
  /**
30
32
  * @typedef {object} DiscoverListMeta
31
- * @property {boolean} [configured] Present when `data` is empty, so callers can
33
+ * @property {boolean} [configured] Present when `data` lists no integration (a
34
+ * declared official package is not one), so callers can
32
35
  * distinguish "no packages configured" from "configured but nothing
33
36
  * discovered".
34
37
  * @property {DiscoverAvailableEntry[]} [available] What the project could add,
35
- * one entry per integration, never an alias of a package it has.
38
+ * one entry per integration, never an alias of a package it has; official
39
+ * packages first.
36
40
  * @property {DiscoverSourceState[]} [sources] What each discover source did.
37
41
  */
38
42
 
39
43
  /**
40
- * An installed integration.
44
+ * An installed integration, or an official package the project declares.
41
45
  * @typedef {object} DiscoverListEntry
42
46
  * @property {string} name
43
47
  * @property {string} category
@@ -66,13 +70,19 @@
66
70
  * @property {string[]} [agentDocs]
67
71
  * @property {string} [description]
68
72
  * @property {string[]} [aliases] The integration's other package names.
69
- * @property {string} source The discover source that lists it.
73
+ * @property {string} source The discover source that lists it; `Astryx` for
74
+ * the official list; `installed for this computer` for an integration
75
+ * installed beside the CLI that the project does not install (spec AST-081
76
+ * FR12).
77
+ * @property {string} [install] The package-manager command that adds it to
78
+ * this project; discover prints it and never runs it.
70
79
  */
71
80
 
72
81
  /**
73
82
  * @typedef {object} DiscoverSourceState
74
83
  * @property {string} name
75
- * @property {string} from `astryx.config`, or the integration that exports it.
84
+ * @property {string} from `astryx.config`, the integration that exports it, or
85
+ * `@astryxdesign/cli` for the official list.
76
86
  * @property {'fresh' | 'saved' | 'failed'} status `saved`: the live call
77
87
  * failed and discover used the copy saved at `savedAt`.
78
88
  * @property {string} [generatedAt]
@@ -2,9 +2,10 @@
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
4
  /**
5
- * Build the discover.list response. `data` lists installed integrations. An
6
- * empty `data` carries `meta.configured`, so callers can distinguish "nothing
7
- * configured" from "configured but nothing discovered". With discover sources,
5
+ * Build the discover.list response. `data` lists installed integrations and
6
+ * the official packages the project declares. A `data` with no integration
7
+ * carries `meta.configured`, so callers can distinguish "nothing configured"
8
+ * from "configured but nothing discovered". With discover sources,
8
9
  * `meta.available` lists what the project could add and `meta.sources` reports
9
10
  * what each source did.
10
11
  *
@@ -12,9 +12,10 @@ import {toEntry} from '../_adapter.mjs';
12
12
  import {hasKind} from '../_catalog-view.mjs';
13
13
 
14
14
  /**
15
- * Build the discover.list response. `data` lists installed integrations. An
16
- * empty `data` carries `meta.configured`, so callers can distinguish "nothing
17
- * configured" from "configured but nothing discovered". With discover sources,
15
+ * Build the discover.list response. `data` lists installed integrations and
16
+ * the official packages the project declares. A `data` with no integration
17
+ * carries `meta.configured`, so callers can distinguish "nothing configured"
18
+ * from "configured but nothing discovered". With discover sources,
18
19
  * `meta.available` lists what the project could add and `meta.sources` reports
19
20
  * what each source did.
20
21
  *
@@ -31,18 +32,24 @@ import {hasKind} from '../_catalog-view.mjs';
31
32
  export function list(packages, {configured, available, sources, type, only}) {
32
33
  const keep = (/** @type {Record<string, unknown>} */ entry) =>
33
34
  type == null || hasKind(entry, type);
34
- const data =
35
+ const shown =
35
36
  only === 'available'
36
37
  ? []
37
- : packages
38
- .map(toEntry)
39
- .filter(entry =>
40
- keep(/** @type {Record<string, unknown>} */ (entry)),
41
- );
38
+ : packages.filter(pkg =>
39
+ keep(/** @type {Record<string, unknown>} */ (toEntry(pkg))),
40
+ );
41
+ const data = shown.map(toEntry);
42
42
 
43
43
  /** @type {Record<string, unknown>} */
44
44
  const meta = {};
45
- if (data.length === 0) meta.configured = configured;
45
+ // An official package the project declares is not an integration, so it
46
+ // never hides whether any integration is configured.
47
+ if (
48
+ !shown.some(
49
+ pkg => !(/** @type {{declaredOfficial?: true}} */ (pkg).declaredOfficial),
50
+ )
51
+ )
52
+ meta.configured = configured;
46
53
  if (sources !== undefined) {
47
54
  meta.available = only === 'installed' ? [] : (available ?? []).filter(keep);
48
55
  meta.sources = sources;