@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
@@ -4,6 +4,7 @@
4
4
 
5
5
  import {afterEach, describe, expect, it} from 'vitest';
6
6
  import * as fs from 'node:fs';
7
+ import * as os from 'node:os';
7
8
  import * as path from 'node:path';
8
9
  import {spawnSync} from 'node:child_process';
9
10
  import {checkAppThemes, checkThemes} from './theme-checks.mjs';
@@ -12,6 +13,8 @@ import {themeAdd} from '../theme/add/add.mjs';
12
13
  import {themeEject} from '../theme/eject/eject.mjs';
13
14
  import {themeBuild} from '../theme/build/build.mjs';
14
15
  import {parseThemeModuleRecord} from '../../foundation/config/theme-state.mjs';
16
+ import {CLI_VERSION} from '../../test-utils/release-fixtures.mjs';
17
+ import {globalCli} from '../../test-utils/global-local-fixtures.mjs';
15
18
 
16
19
  /** @type {string[]} */
17
20
  const dirs = [];
@@ -25,11 +28,12 @@ function write(file, content) {
25
28
 
26
29
  /**
27
30
  * @param {Array<{slug: string, css?: string, fontFamily?: string, fontCss?: string}>} themeSpecs
28
- * @param {{peerRange?: string, importModule?: boolean}} [options]
31
+ * @param {{peerRange?: string, importModule?: boolean, root?: string}} [options]
32
+ * `root`: the folder the fixture is made in (default: this package)
29
33
  */
30
34
  async function fixture(themeSpecs = [{slug: 'ocean'}], options = {}) {
31
35
  const dir = fs.mkdtempSync(
32
- path.join(process.cwd(), '.astryx-doctor-themes-'),
36
+ path.join(options.root ?? process.cwd(), '.astryx-doctor-themes-'),
33
37
  );
34
38
  dirs.push(dir);
35
39
  fs.mkdirSync(path.join(dir, 'src'), {recursive: true});
@@ -47,7 +51,7 @@ async function fixture(themeSpecs = [{slug: 'ocean'}], options = {}) {
47
51
  );
48
52
  write(
49
53
  path.join(dir, 'node_modules/@astryxdesign/core/package.json'),
50
- JSON.stringify({name: '@astryxdesign/core', version: '1.0.0'}),
54
+ JSON.stringify({name: '@astryxdesign/core', version: CLI_VERSION}),
51
55
  );
52
56
 
53
57
  const packageDir = path.join(dir, 'node_modules/@acme/themes');
@@ -67,7 +71,7 @@ async function fixture(themeSpecs = [{slug: 'ocean'}], options = {}) {
67
71
  version: '1.0.0',
68
72
  type: 'module',
69
73
  peerDependencies: {
70
- '@astryxdesign/core': options.peerRange ?? '^1.0.0',
74
+ '@astryxdesign/core': options.peerRange ?? `^${CLI_VERSION}`,
71
75
  },
72
76
  exports: exportsMap,
73
77
  }),
@@ -340,6 +344,142 @@ describe('app-theme doctor checks', () => {
340
344
  expect(result.message).not.toMatch(/\n\s+at /u);
341
345
  });
342
346
 
347
+ it('passes theme-owners when a built module imports its stylesheet', async () => {
348
+ const {dir, packageDir} = await fixture();
349
+ write(
350
+ path.join(packageDir, 'dist/ocean.js'),
351
+ "import './ocean.css';\nimport '@acme/themes/themes/ocean.css';\nexport const oceanTheme = {name: 'ocean', tokens: {}};\n",
352
+ );
353
+
354
+ const checks = await checkAppThemes(dir);
355
+
356
+ expect(checks.map(item => item.status)).toEqual(Array(10).fill('pass'));
357
+ expect(check(checks, 'theme-owners').message).toContain(
358
+ 'every built module loads',
359
+ );
360
+ const cli = runDoctor(dir);
361
+ expect(cli.status).toBe(0);
362
+ expect(cli.stdout).not.toContain('could not load its built module');
363
+ }, 30_000);
364
+
365
+ it('passes every check for an entry that loads its fonts and stylesheet and re-exports the built module', async () => {
366
+ const {dir, packageDir} = await fixture([
367
+ {
368
+ slug: 'ocean',
369
+ fontFamily: 'Ocean Sans',
370
+ fontCss:
371
+ "@font-face { font-family: 'Ocean Sans'; src: local('Ocean Sans'); }\n",
372
+ },
373
+ ]);
374
+ write(
375
+ path.join(packageDir, 'dist/ocean.built.js'),
376
+ "export const oceanTheme = {name: 'ocean', tokens: {}, fontFamily: 'Ocean Sans'};\n",
377
+ );
378
+ write(
379
+ path.join(packageDir, 'dist/ocean.js'),
380
+ "import './ocean.fonts.css';\nimport '@acme/themes/themes/ocean.css';\nexport {oceanTheme} from './ocean.built.js';\n",
381
+ );
382
+
383
+ const checks = await checkAppThemes(dir);
384
+
385
+ expect(checks.map(item => [item.id, item.status])).toEqual(
386
+ checks.map(item => [item.id, 'pass']),
387
+ );
388
+ expect(checks).toHaveLength(10);
389
+ const cli = runDoctor(dir);
390
+ expect(cli.status).toBe(0);
391
+ expect(cli.stdout).not.toContain('could not load its built module');
392
+ }, 30_000);
393
+
394
+ it('passes every check for an entry that re-exports a theme whose own name differs from its slug', async () => {
395
+ const {dir, packageDir} = await fixture([
396
+ {
397
+ slug: 'ocean',
398
+ css: '[data-astryx-theme="deep-sea"] { --color-text: black; }\n',
399
+ fontFamily: 'Ocean Sans',
400
+ fontCss:
401
+ "@font-face { font-family: 'Ocean Sans'; src: local('Ocean Sans'); }\n",
402
+ },
403
+ ]);
404
+ write(
405
+ path.join(packageDir, 'dist/deep-sea.js'),
406
+ "export const deepSeaTheme = {name: 'deep-sea', tokens: {}, fontFamily: 'Ocean Sans'};\n",
407
+ );
408
+ write(
409
+ path.join(packageDir, 'dist/ocean.js'),
410
+ "import './ocean.fonts.css';\nimport './ocean.css';\nexport {deepSeaTheme as oceanTheme} from './deep-sea.js';\n",
411
+ );
412
+
413
+ const checks = await checkAppThemes(dir);
414
+
415
+ expect(checks.map(item => [item.id, item.status])).toEqual(
416
+ checks.map(item => [item.id, 'pass']),
417
+ );
418
+ expect(checks).toHaveLength(10);
419
+ }, 30_000);
420
+
421
+ it.each([
422
+ [
423
+ 'a missing dependency',
424
+ "import '@acme/definitely-missing-dep';\nexport const oceanTheme = {name: 'ocean', tokens: {}};\n",
425
+ '@acme/definitely-missing-dep',
426
+ ],
427
+ [
428
+ 'a throwing module',
429
+ "throw new Error('broken theme module');\nexport const oceanTheme = {name: 'ocean', tokens: {}};\n",
430
+ 'broken theme module',
431
+ ],
432
+ ])(
433
+ 'still fails theme-owners when a built module imports its stylesheet and has %s',
434
+ async (_label, rest, detail) => {
435
+ const {dir, packageDir} = await fixture();
436
+ write(
437
+ path.join(packageDir, 'dist/ocean.js'),
438
+ `import './ocean.css';\n${rest}`,
439
+ );
440
+
441
+ const result = check(await checkAppThemes(dir), 'theme-owners');
442
+
443
+ expect(result).toMatchObject({id: 'theme-owners', status: 'fail'});
444
+ expect(result.message).toContain(
445
+ 'Theme "ocean" from @acme/themes could not load its built module',
446
+ );
447
+ expect(result.message).toContain(detail);
448
+ },
449
+ );
450
+
451
+ it("still fails theme-owners when the theme's stylesheet export is missing", async () => {
452
+ const {dir, packageDir} = await fixture();
453
+ write(
454
+ path.join(packageDir, 'dist/ocean.js'),
455
+ "import './ocean.css';\nexport const oceanTheme = {name: 'ocean', tokens: {}};\n",
456
+ );
457
+ fs.rmSync(path.join(packageDir, 'dist/ocean.css'));
458
+
459
+ const result = check(await checkAppThemes(dir), 'theme-owners');
460
+
461
+ expect(result).toMatchObject({id: 'theme-owners', status: 'fail'});
462
+ expect(result.message).toContain(
463
+ 'Missing stylesheet export @acme/themes/themes/ocean.css',
464
+ );
465
+ });
466
+
467
+ it('still fails theme-owners when another stylesheet the built module imports is missing', async () => {
468
+ const {dir, packageDir} = await fixture();
469
+ write(
470
+ path.join(packageDir, 'dist/ocean.js'),
471
+ "import './ocean.css';\nimport './fonts.css';\nexport const oceanTheme = {name: 'ocean', tokens: {}};\n",
472
+ );
473
+
474
+ const result = check(await checkAppThemes(dir), 'theme-owners');
475
+
476
+ expect(result).toMatchObject({id: 'theme-owners', status: 'fail'});
477
+ expect(result.message).toContain(
478
+ 'Theme "ocean" from @acme/themes could not load its built module',
479
+ );
480
+ expect(result.message).toContain('fonts.css');
481
+ });
482
+
343
483
  it('fails theme-owners for an ambiguous multi-theme record', async () => {
344
484
  const {dir, packageDir} = await fixture([{slug: 'ocean'}, {slug: 'reef'}]);
345
485
  const packageFile = path.join(packageDir, 'package.json');
@@ -456,6 +596,82 @@ describe('app-theme doctor checks', () => {
456
596
  });
457
597
  });
458
598
 
599
+ it("check 5 is info, and builds nothing, when the project's Core is not installed (spec AST-081 FR3)", async () => {
600
+ // Outside this repository, whose own installed Core would be found above.
601
+ const {dir} = await fixture(undefined, {root: os.tmpdir()});
602
+ await themeEject('ocean', {cwd: dir, package: '@acme/themes'});
603
+ const sourceFile = path.join(dir, 'src/themes/ocean/oceanTheme.ts');
604
+ fs.writeFileSync(
605
+ sourceFile,
606
+ "const oceanTheme = {name: 'ocean', tokens: {'--color-bg': '#000'}};\nexport {oceanTheme};\nexport default oceanTheme;\n",
607
+ );
608
+ await themeBuild(sourceFile, {}, {cwd: dir});
609
+ await themeAdd('ocean', {cwd: dir, import: true});
610
+ // A fresh clone: the project declares Core but has not installed it.
611
+ fs.rmSync(path.join(dir, 'node_modules/@astryxdesign/core'), {
612
+ recursive: true,
613
+ force: true,
614
+ });
615
+
616
+ expect(check(await checkAppThemes(dir), 'theme-local-builds')).toEqual({
617
+ id: 'theme-local-builds',
618
+ label: 'Local theme build freshness',
619
+ status: 'info',
620
+ message:
621
+ "The project's Core isn't installed, so local theme builds were not checked. Install the project's dependencies, then run doctor again.",
622
+ });
623
+ // A build that may read only the project's Core refuses instead of
624
+ // reading another one.
625
+ await expect(
626
+ themeBuild(sourceFile, {check: true}, {cwd: dir, projectCore: true}),
627
+ ).rejects.toMatchObject({code: 'ERR_CORE_NOT_FOUND'});
628
+ });
629
+
630
+ it.skipIf(process.platform === 'win32')(
631
+ 'check 5 through a CLI installed for the computer, in a fresh clone: info, and no carried Core is read or fetched',
632
+ async () => {
633
+ const home = fs.mkdtempSync(
634
+ path.join(os.tmpdir(), 'astryx-doctor-home-'),
635
+ );
636
+ dirs.push(home);
637
+ const g = globalCli('npm', CLI_VERSION, {root: home});
638
+ const {dir} = await fixture(undefined, {root: os.tmpdir()});
639
+ await themeEject('ocean', {cwd: dir, package: '@acme/themes'});
640
+ const sourceFile = path.join(dir, 'src/themes/ocean/oceanTheme.ts');
641
+ await themeBuild(sourceFile, {}, {cwd: dir});
642
+ await themeAdd('ocean', {cwd: dir, import: true});
643
+ fs.rmSync(path.join(dir, 'node_modules/@astryxdesign/core'), {
644
+ recursive: true,
645
+ force: true,
646
+ });
647
+ const cache = path.join(home, '.cache');
648
+ const result = spawnSync(process.execPath, [g.bin, 'doctor', '--json'], {
649
+ cwd: dir,
650
+ encoding: 'utf8',
651
+ timeout: 120_000,
652
+ env: {
653
+ PATH: path.dirname(process.execPath),
654
+ HOME: home,
655
+ USERPROFILE: home,
656
+ XDG_CACHE_HOME: cache,
657
+ XDG_CONFIG_HOME: path.join(home, '.config'),
658
+ // Nothing can be fetched: a fetch of the carried Core would fail.
659
+ npm_config_registry: 'http://127.0.0.1:9/',
660
+ npm_config_update_notifier: 'false',
661
+ NO_COLOR: '1',
662
+ },
663
+ });
664
+ const checks = JSON.parse(result.stdout).data.checks;
665
+ expect(checks.find(c => c.id === 'theme-local-builds')).toMatchObject({
666
+ status: 'info',
667
+ });
668
+ expect(
669
+ fs.existsSync(path.join(cache, 'astryx', 'releases', CLI_VERSION)),
670
+ ).toBe(false);
671
+ },
672
+ 180_000,
673
+ );
674
+
459
675
  it('check 6 ignores private variables generated from guaranteed component properties', async () => {
460
676
  const {dir, packageDir} = await fixture([
461
677
  {
@@ -610,7 +826,7 @@ describe('app-theme doctor checks', () => {
610
826
  for (const name of ['@astryxdesign/core', '@astryxdesign/theme-neutral']) {
611
827
  write(
612
828
  path.join(root, 'node_modules', name, 'package.json'),
613
- JSON.stringify({name, version: '1.0.0'}),
829
+ JSON.stringify({name, version: CLI_VERSION}),
614
830
  );
615
831
  }
616
832
  const app = path.join(root, 'packages/app');
@@ -620,8 +836,8 @@ describe('app-theme doctor checks', () => {
620
836
  name: 'app',
621
837
  private: true,
622
838
  dependencies: {
623
- '@astryxdesign/core': '1.0.0',
624
- '@astryxdesign/theme-neutral': '1.0.0',
839
+ '@astryxdesign/core': CLI_VERSION,
840
+ '@astryxdesign/theme-neutral': CLI_VERSION,
625
841
  },
626
842
  astryx: {theme: '@astryxdesign/theme-neutral'},
627
843
  }),
package/api/error.d.mts CHANGED
@@ -23,6 +23,16 @@
23
23
  * @returns {AstryxError}
24
24
  */
25
25
  export function writeFailed(target: string, cwd: string, cause: unknown, unrestored?: string[]): AstryxError;
26
+ /**
27
+ * Locate the Core a command answers from (`requireCoreDir` in
28
+ * foundation/fs/paths.mjs), raising its coded failure as an AstryxError:
29
+ * ERR_CORE_NOT_FOUND with no Core to answer from, ERR_VERSIONS_UNAVAILABLE
30
+ * when the carried Core is needed and cannot be installed.
31
+ * @param {(cwd: string) => string} lookup the foundation lookup
32
+ * @param {string} cwd
33
+ * @returns {string}
34
+ */
35
+ export function coreDirOrThrow(lookup: (cwd: string) => string, cwd: string): string;
26
36
  export class AstryxError extends Error {
27
37
  /**
28
38
  * @param {string} message
package/api/error.mjs CHANGED
@@ -78,3 +78,28 @@ export function writeFailed(target, cwd, cause, unrestored = []) {
78
78
  ERROR_CODES.ERR_WRITE_FAILED,
79
79
  );
80
80
  }
81
+
82
+ /**
83
+ * Locate the Core a command answers from (`requireCoreDir` in
84
+ * foundation/fs/paths.mjs), raising its coded failure as an AstryxError:
85
+ * ERR_CORE_NOT_FOUND with no Core to answer from, ERR_VERSIONS_UNAVAILABLE
86
+ * when the carried Core is needed and cannot be installed.
87
+ * @param {(cwd: string) => string} lookup the foundation lookup
88
+ * @param {string} cwd
89
+ * @returns {string}
90
+ */
91
+ export function coreDirOrThrow(lookup, cwd) {
92
+ try {
93
+ return lookup(cwd);
94
+ } catch (error) {
95
+ const code = /** @type {any} */ (error)?.code;
96
+ if (typeof code === 'string' && code.startsWith('ERR_')) {
97
+ throw new AstryxError(
98
+ error instanceof Error ? error.message : String(error),
99
+ undefined,
100
+ code,
101
+ );
102
+ }
103
+ throw error;
104
+ }
105
+ }
@@ -60,6 +60,9 @@ export const GAP_REPORT_CATEGORIES: readonly (Readonly<{
60
60
  label: "Other";
61
61
  }>)[];
62
62
  export const PUBLIC_CONFIRMATION_MESSAGE: "Rerun with --confirm-public to file this report.";
63
+ /** What an agent does when more than one destination exists. */
64
+ export const ASK_DESTINATION_MESSAGE: "Ask the person where to file this report, then pass their choice with --to <package>. Never pick a package destination yourself; leave --to out to use the default.";
65
+ export type GapReportDestination = import("./gap-report.type.mjs").GapReportDestination;
63
66
  export type ReportTarget = {
64
67
  package: string;
65
68
  version: string | null;
@@ -19,6 +19,8 @@ export const doc = {
19
19
  'Sends a gap report to every configured handler: the project config handler first, then each integration handler in config order. ' +
20
20
  'Each handler has 30 s to finish, and its output goes to stderr. Public handlers run only with confirmPublic; internal handlers always run. ' +
21
21
  "With no handler, it files a GitHub issue for the owning package only with confirmPublic (without it nothing is sent), or returns the package's issues URL when that is not on GitHub. " +
22
+ "With options.to, the report goes only to that integration's issues URL instead, under the same confirmPublic rule. " +
23
+ 'When loaded integrations name their own issues URLs, the response lists every destination with a line telling an agent to ask the person where to file; pass their choice as options.to, never a package the agent picked itself. ' +
22
24
  'The report records whether an agent or a person ran it, and the response lists each handler outcome in order.',
23
25
  importPath: '@astryxdesign/cli/api',
24
26
  signature:
@@ -67,14 +69,20 @@ export const doc = {
67
69
  name: 'options.confirmPublic',
68
70
  type: 'boolean',
69
71
  description:
70
- 'Allow public delivery: public handlers run, and with no handler a GitHub issue is filed through the gh CLI.',
72
+ 'Allow public delivery: public handlers run, and a GitHub issues URL gets an issue filed through the gh CLI.',
71
73
  default: 'false',
72
74
  },
75
+ {
76
+ name: 'options.to',
77
+ type: 'string',
78
+ description:
79
+ 'A destination the person chose: a loaded integration whose manifest names an issues URL. The report goes only to that issues URL; handlers do not run.',
80
+ },
73
81
  {
74
82
  name: 'options.listCategories',
75
83
  type: 'boolean',
76
84
  description:
77
- 'Return categories without resolving a route or writing; the component and every other option are refused with ERR_INVALID_ARGUMENT.',
85
+ 'Return categories, and the destinations in meta when there is more than one, without resolving a route or writing; the component and every other option are refused with ERR_INVALID_ARGUMENT.',
78
86
  default: 'false',
79
87
  },
80
88
  {
@@ -115,7 +123,7 @@ export const doc = {
115
123
  },
116
124
  {
117
125
  code: 'ERR_UNKNOWN_PACKAGE',
118
- when: 'the explicitly selected package is not loaded',
126
+ when: 'the explicitly selected package is not loaded, or options.to names no destination (the error lists the destinations)',
119
127
  },
120
128
  {
121
129
  code: 'ERR_NOT_FOUND',