@astryxdesign/cli 0.6.4-canary.f0355e3 → 0.6.4

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 (331) hide show
  1. package/README.md +96 -99
  2. package/api/build/build.doc.mjs +1 -6
  3. package/api/build/build.test.mjs +0 -22
  4. package/api/build/kit/kit.mjs +5 -44
  5. package/api/component/_adapter.d.mts +0 -25
  6. package/api/component/_adapter.mjs +5 -59
  7. package/api/component/component.d.mts +3 -6
  8. package/api/component/component.doc.mjs +17 -37
  9. package/api/component/component.mjs +9 -249
  10. package/api/component/component.type.d.mts +0 -25
  11. package/api/component/component.type.mjs +0 -44
  12. package/api/discover/_adapter.d.mts +6 -114
  13. package/api/discover/_adapter.mjs +17 -372
  14. package/api/discover/detail/detail.d.mts +6 -18
  15. package/api/discover/detail/detail.mjs +13 -67
  16. package/api/discover/detail/detail.test.mjs +0 -85
  17. package/api/discover/discover.d.mts +9 -3
  18. package/api/discover/discover.doc.mjs +18 -61
  19. package/api/discover/discover.mjs +36 -220
  20. package/api/discover/discover.test.mjs +2 -11
  21. package/api/discover/discover.type.d.mts +8 -147
  22. package/api/discover/discover.type.mjs +12 -102
  23. package/api/discover/list/list.d.mts +6 -20
  24. package/api/discover/list/list.mjs +12 -45
  25. package/api/discover/list/list.test.mjs +0 -46
  26. package/api/discover/search/search.d.mts +16 -18
  27. package/api/discover/search/search.mjs +56 -102
  28. package/api/discover/search/search.test.mjs +10 -144
  29. package/api/docs/_adapter.d.mts +3 -8
  30. package/api/docs/_adapter.mjs +6 -14
  31. package/api/docs/docOverlays.test.mjs +1 -27
  32. package/api/docs/docs.doc.mjs +2 -2
  33. package/api/docs/docs.test.mjs +243 -0
  34. package/api/docs/integration-tree.test.mjs +555 -0
  35. package/api/docs/integrationDocs.test.mjs +314 -0
  36. package/api/doctor/doctor.d.mts +3 -8
  37. package/api/doctor/doctor.doc.mjs +8 -17
  38. package/api/doctor/doctor.mjs +9 -90
  39. package/api/doctor/doctor.test.mjs +10 -122
  40. package/api/doctor/doctor.type.d.mts +1 -1
  41. package/api/doctor/doctor.type.mjs +1 -1
  42. package/api/gap-report/gap-report.doc.mjs +10 -19
  43. package/api/hook/hook.doc.mjs +3 -6
  44. package/api/index.d.mts +2 -1
  45. package/api/index.mjs +5 -5
  46. package/api/init/init.doc.mjs +12 -17
  47. package/api/integration/add-helpers.d.mts +2 -5
  48. package/api/integration/add-helpers.mjs +9 -36
  49. package/api/integration/add-theme.mjs +1 -22
  50. package/api/integration/add-theme.test.mjs +0 -34
  51. package/api/integration/authoring-checks.mjs +2 -2
  52. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  53. package/api/integration/pack-check.mjs +9 -82
  54. package/api/integration/pack-check.test.mjs +0 -90
  55. package/api/integration/pack-check.type.mjs +1 -1
  56. package/api/json/assertResponse.doc.mjs +1 -1
  57. package/api/json/index.ts +1 -0
  58. package/api/json/isError.doc.mjs +1 -1
  59. package/api/layout/_adapter.d.mts +34 -0
  60. package/api/layout/_adapter.mjs +148 -0
  61. package/api/layout/check/check.d.mts +16 -0
  62. package/api/layout/check/check.mjs +40 -0
  63. package/api/layout/expand/expand.d.mts +22 -0
  64. package/api/layout/expand/expand.mjs +155 -0
  65. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  66. package/api/layout/grammar/grammar.d.mts +13 -0
  67. package/api/layout/grammar/grammar.mjs +87 -0
  68. package/api/layout/layout.d.mts +6 -0
  69. package/api/layout/layout.mjs +17 -0
  70. package/api/layout/layout.test.mjs +297 -0
  71. package/api/layout/layout.type.d.mts +89 -0
  72. package/api/layout/layout.type.mjs +103 -0
  73. package/api/layout/layoutCheck.doc.d.mts +11 -0
  74. package/api/layout/layoutCheck.doc.mjs +85 -0
  75. package/api/layout/layoutExpand.doc.d.mts +11 -0
  76. package/api/layout/layoutExpand.doc.mjs +107 -0
  77. package/api/layout/layoutGrammar.doc.d.mts +11 -0
  78. package/api/layout/layoutGrammar.doc.mjs +57 -0
  79. package/api/search/search.d.mts +1 -27
  80. package/api/search/search.doc.mjs +2 -2
  81. package/api/search/search.mjs +16 -228
  82. package/api/search/search.test.mjs +512 -0
  83. package/api/swizzle/swizzle.doc.mjs +5 -7
  84. package/api/template/copy/copy.mjs +1 -1
  85. package/api/template/copy/copy.test.mjs +0 -9
  86. package/api/template/template-integration.test.mjs +65 -1
  87. package/api/template/template.doc.mjs +1 -2
  88. package/api/template/template.mjs +1 -1
  89. package/api/theme/add/add.mjs +25 -17
  90. package/api/theme/add/add.staging.test.mjs +23 -40
  91. package/api/theme/build/build.family.test.mjs +12 -7
  92. package/api/theme/build/build.mjs +18 -8
  93. package/api/theme/generateTonalPalette.doc.mjs +2 -1
  94. package/api/theme/listThemes.doc.mjs +1 -1
  95. package/api/theme/themeAdd.doc.mjs +10 -9
  96. package/api/theme/themeBuild.doc.mjs +13 -13
  97. package/api/theme/themeList.doc.mjs +1 -1
  98. package/api/theme/themeListAvailable.doc.mjs +1 -2
  99. package/api/theme/themePaletteGenerate.doc.mjs +8 -15
  100. package/api/theme/themeTargets.doc.mjs +2 -3
  101. package/api/theme/themeTemplate.doc.mjs +1 -2
  102. package/api/upgrade/run/run.mjs +4 -6
  103. package/api/upgrade/upgrade.doc.mjs +22 -24
  104. package/api/upgrade/upgrade.type.mjs +2 -2
  105. package/assets/codemods/__tests__/runner.test.mjs +1 -3
  106. package/assets/codemods/integration-runner.mjs +3 -3
  107. package/assets/codemods/runner.mjs +4 -5
  108. package/assets/docs/README.md +2 -4
  109. package/assets/docs/browser-support.doc.mjs +11 -11
  110. package/assets/docs/color.doc.mjs +2 -8
  111. package/assets/docs/elevation.doc.mjs +4 -6
  112. package/assets/docs/getting-started.doc.mjs +16 -5
  113. package/assets/docs/icons.doc.mjs +21 -2
  114. package/assets/docs/illustrations.doc.mjs +15 -7
  115. package/assets/docs/internationalization.doc.mjs +5 -7
  116. package/assets/docs/layout.doc.dense.mjs +82 -130
  117. package/assets/docs/layout.doc.mjs +77 -133
  118. package/assets/docs/migration.doc.mjs +21 -19
  119. package/assets/docs/motion.doc.mjs +3 -16
  120. package/assets/docs/principles.doc.dense.mjs +5 -5
  121. package/assets/docs/principles.doc.mjs +0 -8
  122. package/assets/docs/principles.doc.zh.mjs +6 -6
  123. package/assets/docs/shape.doc.mjs +3 -8
  124. package/assets/docs/spacing.doc.mjs +2 -7
  125. package/assets/docs/styling-libraries.doc.mjs +2 -6
  126. package/assets/docs/styling.doc.mjs +23 -19
  127. package/assets/docs/theme.doc.dense.mjs +18 -58
  128. package/assets/docs/theme.doc.mjs +46 -56
  129. package/assets/docs/theme.doc.zh.mjs +8 -9
  130. package/assets/docs/tokens.doc.dense.mjs +2 -2
  131. package/assets/docs/tokens.doc.mjs +8 -389
  132. package/assets/docs/tokens.doc.zh.mjs +2 -2
  133. package/assets/docs/tree/integrations.doc.mjs +451 -25
  134. package/assets/docs/tree/integrations.test.mjs +62 -0
  135. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  136. package/assets/docs/typography.doc.mjs +4 -24
  137. package/assets/docs/working-with-ai.doc.mjs +22 -30
  138. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  139. package/authoring/config/config.doc.mjs +2 -10
  140. package/authoring/config/parse.d.mts +0 -2
  141. package/authoring/config/parse.mjs +0 -19
  142. package/authoring/config/parse.test.mjs +0 -8
  143. package/authoring/config/type.ts +2 -13
  144. package/authoring/doctypes/_schema.d.mts +2 -3
  145. package/authoring/doctypes/_schema.mjs +0 -6
  146. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  147. package/authoring/doctypes/base/type.ts +2 -4
  148. package/authoring/doctypes/command/command.doc.mjs +1 -1
  149. package/authoring/doctypes/command/type.ts +1 -1
  150. package/authoring/doctypes/component/component.doc.mjs +0 -6
  151. package/authoring/doctypes/component/type.ts +0 -8
  152. package/authoring/doctypes/reference/reference.doc.mjs +0 -7
  153. package/authoring/doctypes/reference/type.ts +0 -5
  154. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  155. package/authoring/doctypes/template/template.doc.mjs +1 -1
  156. package/authoring/doctypes/template/type.ts +2 -2
  157. package/authoring/index.d.mts +0 -1
  158. package/authoring/index.d.ts +0 -10
  159. package/authoring/index.mjs +0 -1
  160. package/authoring/integration/integration.doc.mjs +10 -12
  161. package/clients/cli/command-result-coverage.test.mjs +7 -7
  162. package/clients/cli/commands/component/index.mjs +55 -152
  163. package/clients/cli/commands/component-ownership.test.mjs +0 -89
  164. package/clients/cli/commands/component.doc.mjs +9 -27
  165. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  166. package/clients/cli/commands/discover.doc.mjs +9 -53
  167. package/clients/cli/commands/discover.mjs +118 -393
  168. package/clients/cli/commands/docs.doc.mjs +1 -1
  169. package/clients/cli/commands/docs.mjs +17 -60
  170. package/clients/cli/commands/docs.test.mjs +294 -0
  171. package/clients/cli/commands/doctor-integration-docs.doc.mjs +2 -3
  172. package/clients/cli/commands/doctor-integration.test.mjs +0 -53
  173. package/clients/cli/commands/doctor.doc.mjs +1 -3
  174. package/clients/cli/commands/doctor.mjs +5 -49
  175. package/clients/cli/commands/gap-report.doc.mjs +9 -10
  176. package/clients/cli/commands/init.doc.mjs +6 -9
  177. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  178. package/clients/cli/commands/integration-authoring.test.mjs +10 -61
  179. package/clients/cli/commands/integration-pack.doc.mjs +9 -5
  180. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  181. package/clients/cli/commands/integration.doc.mjs +4 -4
  182. package/clients/cli/commands/integration.mjs +43 -74
  183. package/clients/cli/commands/layout-check.doc.mjs +65 -0
  184. package/clients/cli/commands/layout-expand.doc.mjs +83 -0
  185. package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
  186. package/clients/cli/commands/layout.doc.mjs +34 -0
  187. package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
  188. package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
  189. package/clients/cli/commands/layout.mjs +275 -0
  190. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  191. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  192. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  193. package/clients/cli/commands/manifest.doc.mjs +1 -1
  194. package/clients/cli/commands/search.doc.mjs +3 -10
  195. package/clients/cli/commands/search.mjs +2 -21
  196. package/clients/cli/commands/search.test.mjs +4 -21
  197. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  198. package/clients/cli/commands/template.doc.mjs +1 -1
  199. package/clients/cli/commands/text-json-parity.test.mjs +16 -5
  200. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  201. package/clients/cli/commands/theme-palette-generate.doc.mjs +2 -3
  202. package/clients/cli/commands/theme-palette.doc.mjs +2 -1
  203. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  204. package/clients/cli/commands/theme.doc.mjs +1 -2
  205. package/clients/cli/commands/upgrade.doc.mjs +3 -62
  206. package/clients/cli/index.mjs +10 -28
  207. package/clients/cli/lib/define-command.mjs +4 -28
  208. package/clients/cli/lib/define-command.test.mjs +0 -54
  209. package/clients/cli/lib/exit-codes.test.mjs +9 -18
  210. package/clients/cli/lib/json-shim.mjs +14 -24
  211. package/clients/cli/lib/json-shim.test.mjs +20 -6
  212. package/clients/cli/lib/manifest.mjs +13 -18
  213. package/clients/cli/lib/manifest.test.mjs +2 -5
  214. package/foundation/agent-docs/agent-docs.mjs +1 -1
  215. package/foundation/agent-docs/agent-docs.test.mjs +1159 -0
  216. package/foundation/discovery/authoring-self-docs.mjs +0 -1
  217. package/foundation/discovery/authoring-self-docs.test.mjs +2 -6
  218. package/foundation/discovery/cli-self-docs.mjs +2 -16
  219. package/foundation/discovery/cli-self-docs.test.mjs +0 -20
  220. package/foundation/discovery/docs-discovery.mjs +1 -5
  221. package/foundation/discovery/docs-discovery.test.mjs +0 -21
  222. package/foundation/discovery/docs-section-key.d.mts +1 -1
  223. package/foundation/discovery/docs-section-key.mjs +1 -1
  224. package/foundation/discovery/template-adapter.mjs +1 -1
  225. package/foundation/doc-compiler/doc-loads.test.mjs +14 -3
  226. package/foundation/doc-compiler/tree.d.mts +0 -4
  227. package/foundation/doc-compiler/tree.mjs +1 -6
  228. package/foundation/doc-compiler/tree.test.mjs +598 -0
  229. package/foundation/integrations/cli-requirement.d.mts +6 -26
  230. package/foundation/integrations/cli-requirement.mjs +11 -46
  231. package/foundation/integrations/cli-requirement.test.mjs +2 -7
  232. package/foundation/integrations/contribution-inventory.mjs +1 -1
  233. package/foundation/integrations/integrations.d.mts +1 -14
  234. package/foundation/integrations/integrations.mjs +1 -41
  235. package/foundation/integrations/integrations.test.mjs +0 -31
  236. package/foundation/response/error-codes.doc.mjs +8 -6
  237. package/foundation/response/error-codes.test.mjs +5 -30
  238. package/foundation/response/response-types.doc.d.mts +3 -4
  239. package/foundation/response/response-types.doc.mjs +27 -40
  240. package/foundation/response/response-types.doc.test.mjs +0 -23
  241. package/foundation/response/response.doc.mjs +10 -11
  242. package/foundation/xle/browser.d.mts +3 -3
  243. package/foundation/xle/browser.mjs +3 -3
  244. package/foundation/xle/expand.mjs +2 -2
  245. package/foundation/xle/parse.mjs +1 -1
  246. package/foundation/xle/print.mjs +2 -2
  247. package/foundation/xle/splice.mjs +1 -1
  248. package/package.json +9 -9
  249. package/api/discover/_adapter.test.mjs +0 -215
  250. package/api/discover/_catalog-view.d.mts +0 -115
  251. package/api/discover/_catalog-view.mjs +0 -203
  252. package/api/discover/_catalog-view.test.mjs +0 -128
  253. package/api/discover/detail/item/item.d.mts +0 -26
  254. package/api/discover/detail/item/item.mjs +0 -78
  255. package/api/discover/detail/item/item.test.mjs +0 -73
  256. package/api/integration/pack-check.lifecycle-output.test.mjs +0 -107
  257. package/api/theme/add/add.rollback.test.mjs +0 -158
  258. package/api/theme/build/build.rollback.test.mjs +0 -148
  259. package/api/upgrade/run/files-changed.test.mjs +0 -111
  260. package/assets/codemods/file-count.test.mjs +0 -163
  261. package/assets/docs/tree/add-a-component.doc.mjs +0 -75
  262. package/assets/docs/tree/add-a-theme.doc.mjs +0 -85
  263. package/assets/docs/tree/add-a-topic.doc.mjs +0 -144
  264. package/assets/docs/tree/agent-guidance.doc.mjs +0 -138
  265. package/assets/docs/tree/block-template.doc.mjs +0 -130
  266. package/assets/docs/tree/build-the-template.doc.mjs +0 -28
  267. package/assets/docs/tree/building-blocks.doc.mjs +0 -46
  268. package/assets/docs/tree/check-your-docs.doc.mjs +0 -137
  269. package/assets/docs/tree/checks.doc.mjs +0 -119
  270. package/assets/docs/tree/codemods.doc.mjs +0 -147
  271. package/assets/docs/tree/component-family.doc.mjs +0 -113
  272. package/assets/docs/tree/component-imports.doc.mjs +0 -69
  273. package/assets/docs/tree/component-lookups.doc.mjs +0 -149
  274. package/assets/docs/tree/components.doc.mjs +0 -23
  275. package/assets/docs/tree/configuration.doc.mjs +0 -23
  276. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +0 -182
  277. package/assets/docs/tree/define-the-theme.doc.mjs +0 -118
  278. package/assets/docs/tree/describe-the-component.doc.mjs +0 -57
  279. package/assets/docs/tree/docs.doc.mjs +0 -21
  280. package/assets/docs/tree/document-the-template.doc.mjs +0 -28
  281. package/assets/docs/tree/document-the-theme.doc.mjs +0 -68
  282. package/assets/docs/tree/export-template-assets.doc.mjs +0 -147
  283. package/assets/docs/tree/extend-or-replace.doc.mjs +0 -103
  284. package/assets/docs/tree/fonts-and-assets.doc.mjs +0 -106
  285. package/assets/docs/tree/generate-a-palette.doc.mjs +0 -66
  286. package/assets/docs/tree/grade-template-with-agent.doc.mjs +0 -105
  287. package/assets/docs/tree/help.doc.mjs +0 -16
  288. package/assets/docs/tree/links.doc.mjs +0 -98
  289. package/assets/docs/tree/package-and-test.doc.mjs +0 -32
  290. package/assets/docs/tree/page-template.doc.mjs +0 -71
  291. package/assets/docs/tree/publishing.doc.mjs +0 -111
  292. package/assets/docs/tree/quick-start.doc.mjs +0 -272
  293. package/assets/docs/tree/replace-a-core-component.doc.mjs +0 -104
  294. package/assets/docs/tree/replace-a-core-template.doc.mjs +0 -172
  295. package/assets/docs/tree/sections-and-placement.doc.mjs +0 -108
  296. package/assets/docs/tree/see-it-in-an-app.doc.mjs +0 -59
  297. package/assets/docs/tree/ship.doc.mjs +0 -16
  298. package/assets/docs/tree/short-and-findable.doc.mjs +0 -108
  299. package/assets/docs/tree/single-component.doc.mjs +0 -165
  300. package/assets/docs/tree/start-a-template.doc.mjs +0 -143
  301. package/assets/docs/tree/subcomponent.doc.mjs +0 -115
  302. package/assets/docs/tree/template-assets.doc.mjs +0 -64
  303. package/assets/docs/tree/template-doc-overview.doc.mjs +0 -109
  304. package/assets/docs/tree/template-fonts.doc.mjs +0 -102
  305. package/assets/docs/tree/template-grading-rubric.doc.mjs +0 -452
  306. package/assets/docs/tree/template-icons.doc.mjs +0 -97
  307. package/assets/docs/tree/template-images-media.doc.mjs +0 -127
  308. package/assets/docs/tree/template-styles.doc.mjs +0 -93
  309. package/assets/docs/tree/templates.doc.mjs +0 -34
  310. package/assets/docs/tree/test-in-an-app.doc.mjs +0 -115
  311. package/assets/docs/tree/test-template-in-app.doc.mjs +0 -128
  312. package/assets/docs/tree/themes.doc.mjs +0 -39
  313. package/assets/docs/tree/troubleshooting.doc.mjs +0 -149
  314. package/assets/docs/tree/upgrading.doc.mjs +0 -103
  315. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +0 -51
  316. package/assets/docs/tree/verify-packed-template.doc.mjs +0 -77
  317. package/assets/docs/tree/versioning.doc.mjs +0 -161
  318. package/assets/docs/tree/write-good-templates.doc.mjs +0 -64
  319. package/assets/docs/tree/write-the-template-file.doc.mjs +0 -154
  320. package/authoring/discover/discover.doc.d.mts +0 -13
  321. package/authoring/discover/discover.doc.mjs +0 -138
  322. package/authoring/discover/parse.d.mts +0 -24
  323. package/authoring/discover/parse.mjs +0 -128
  324. package/authoring/discover/parse.test.mjs +0 -124
  325. package/authoring/discover/type.ts +0 -87
  326. package/clients/cli/commands/component-batch.test.mjs +0 -341
  327. package/clients/cli/commands/discover.sources.test.mjs +0 -267
  328. package/clients/cli/commands/integration-verify.doc.mjs +0 -22
  329. package/clients/cli/lib/parse-error-format.test.mjs +0 -81
  330. package/foundation/response/batch.type.d.mts +0 -33
  331. package/foundation/response/batch.type.mjs +0 -34
@@ -0,0 +1,314 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file End-to-end tests for integration-contributed doc topics: a scaffolded
5
+ * consumer project whose configured integration ships a `docs` root, read back
6
+ * through the public surfaces — `docs()`, `search()`, and the agent-docs block.
7
+ *
8
+ * The unit-level rules (what a docs root contributes, what the catalog does
9
+ * with `replaces`/`extends`) are covered in
10
+ * foundation/discovery/docs-discovery.test.mjs. What is pinned here is that a
11
+ * contributed topic is indistinguishable from a built-in one at the surfaces
12
+ * an agent actually reads.
13
+ *
14
+ * Fixtures live under a repo-local temp dir, not /tmp, because Vite refuses to
15
+ * dynamically import a module from outside the project root.
16
+ */
17
+
18
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest';
19
+ import * as fs from 'node:fs';
20
+ import * as path from 'node:path';
21
+ import {docs} from './docs.mjs';
22
+ import {search} from '../search/search.mjs';
23
+ import {loadDocsCatalog} from './_adapter.mjs';
24
+ import {AstryxError} from '../error.mjs';
25
+
26
+ const SLOW = 30_000;
27
+
28
+ let tmpDir;
29
+
30
+ /** A minimal, valid topic. */
31
+ function topic(fields) {
32
+ return {
33
+ type: 'generic',
34
+ name: 'deploying',
35
+ title: 'Deploying',
36
+ description: 'How to ship an app built with Acme widgets.',
37
+ category: 'guide',
38
+ sections: [
39
+ {title: 'Overview', content: [{type: 'prose', text: 'Push the button.'}]},
40
+ ],
41
+ ...fields,
42
+ };
43
+ }
44
+
45
+ /**
46
+ * A consumer project that configures one integration, optionally with a docs
47
+ * root holding the given topics.
48
+ * @param {Record<string, object|string>} [topics] file name → doc
49
+ * @param {{config?: string}} [options]
50
+ */
51
+ function scaffold(topics, {config} = {}) {
52
+ fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({name: 'consumer'}));
53
+ fs.writeFileSync(
54
+ path.join(tmpDir, 'astryx.config.mjs'),
55
+ config ?? "export default {integrations: ['@acme/widgets']};\n",
56
+ );
57
+
58
+ const pkgDir = path.join(tmpDir, 'node_modules', '@acme', 'widgets');
59
+ fs.mkdirSync(pkgDir, {recursive: true});
60
+ fs.writeFileSync(
61
+ path.join(pkgDir, 'package.json'),
62
+ JSON.stringify({name: '@acme/widgets', version: '1.0.0'}),
63
+ );
64
+ fs.writeFileSync(
65
+ path.join(pkgDir, 'astryx.integration.mjs'),
66
+ `export default ${JSON.stringify(topics ? {docs: './docs'} : {})};\n`,
67
+ );
68
+
69
+ if (topics) {
70
+ const docsDir = path.join(pkgDir, 'docs');
71
+ fs.mkdirSync(docsDir, {recursive: true});
72
+ for (const [file, doc] of Object.entries(topics)) {
73
+ fs.writeFileSync(
74
+ path.join(docsDir, file),
75
+ typeof doc === 'string'
76
+ ? doc
77
+ : `export const docs = ${JSON.stringify(doc, null, 2)};\n`,
78
+ );
79
+ }
80
+ }
81
+ }
82
+
83
+ beforeEach(() => {
84
+ tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-integration-docs-test-'));
85
+ });
86
+
87
+ afterEach(() => {
88
+ fs.rmSync(tmpDir, {recursive: true, force: true});
89
+ });
90
+
91
+ describe('integration-contributed topics', () => {
92
+ it('lists and reads like a built-in topic, naming its owner', async () => {
93
+ scaffold({'deploying.doc.mjs': topic()});
94
+
95
+ const listed = await docs(undefined, undefined, {cwd: tmpDir});
96
+ const entry = listed.data.find(t => t.topic === 'deploying');
97
+ expect(entry).toMatchObject({
98
+ topic: 'deploying',
99
+ description: 'How to ship an app built with Acme widgets.',
100
+ package: '@acme/widgets',
101
+ });
102
+ // The built-in topics keep their own owner.
103
+ expect(listed.data.find(t => t.topic === 'tokens').package).toBe('@astryxdesign/cli');
104
+
105
+ const detail = await docs('deploying', undefined, {cwd: tmpDir, full: true});
106
+ expect(detail.type).toBe('docs.detail');
107
+ expect(detail.data.sections[0].content[0].text).toBe('Push the button.');
108
+
109
+ const section = await docs('deploying', 'overview', {cwd: tmpDir});
110
+ expect(section.data.title).toBe('Overview');
111
+ }, SLOW);
112
+
113
+ it('is invisible to a project that does not configure the integration', async () => {
114
+ scaffold({'deploying.doc.mjs': topic()}, {config: 'export default {};\n'});
115
+ const listed = await docs(undefined, undefined, {cwd: tmpDir});
116
+ expect(listed.data.some(t => t.topic === 'deploying')).toBe(false);
117
+ }, SLOW);
118
+
119
+ it('serves the replacement of a built-in topic, and says what it replaced', async () => {
120
+ scaffold({
121
+ 'getting-started.doc.mjs': topic({
122
+ name: 'getting-started',
123
+ replaces: 'getting-started',
124
+ title: 'Getting started',
125
+ description: 'Install Acme widgets.',
126
+ sections: [
127
+ {title: 'Install', content: [{type: 'prose', text: 'yarn add @acme/widgets'}]},
128
+ ],
129
+ }),
130
+ });
131
+
132
+ const detail = await docs('getting-started', undefined, {cwd: tmpDir, full: true});
133
+ expect(detail.data.sections.map(s => s.title)).toEqual(['Install']);
134
+ expect(detail.data.sections[0].content[0].text).toBe('yarn add @acme/widgets');
135
+
136
+ const listed = await docs(undefined, undefined, {cwd: tmpDir});
137
+ const entries = listed.data.filter(t => t.topic === 'getting-started');
138
+ expect(entries).toHaveLength(1);
139
+ expect(entries[0]).toMatchObject({
140
+ package: '@acme/widgets',
141
+ replaces: 'getting-started',
142
+ });
143
+ }, SLOW);
144
+
145
+ it('keeps the replaced name resolving when the replacement renames it', async () => {
146
+ scaffold({
147
+ 'setup.doc.mjs': topic({name: 'setup', replaces: 'getting-started'}),
148
+ });
149
+ const byOldName = await docs('getting-started', undefined, {cwd: tmpDir, full: true});
150
+ const byNewName = await docs('setup', undefined, {cwd: tmpDir, full: true});
151
+ expect(byOldName.data.name).toBe('setup');
152
+ expect(byNewName.data.name).toBe('setup');
153
+ }, SLOW);
154
+
155
+ it('merges an extension into the topic it extends', async () => {
156
+ const builtin = await docs('theme', undefined, {full: true});
157
+ const baseSectionTitle = builtin.data.sections[0].title;
158
+ scaffold({
159
+ 'theme-internal.doc.mjs': topic({
160
+ name: 'theme-internal',
161
+ extends: 'theme',
162
+ sections: [
163
+ {title: baseSectionTitle, content: [{type: 'prose', text: 'Use the Acme theme.'}]},
164
+ {title: 'Acme themes', content: [{type: 'prose', text: 'Three of them.'}]},
165
+ ],
166
+ }),
167
+ });
168
+
169
+ const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
170
+ // The extension is not a topic of its own.
171
+ expect((await docs(undefined, undefined, {cwd: tmpDir})).data.some(
172
+ t => t.topic === 'theme-internal',
173
+ )).toBe(false);
174
+ expect(extended.data.sections[0].content[0].text).toBe('Use the Acme theme.');
175
+ expect(extended.data.sections.at(-1).title).toBe('Acme themes');
176
+ // Everything the extension did not name is still the base doc's.
177
+ expect(extended.data.sections.length).toBe(builtin.data.sections.length + 1);
178
+ }, SLOW);
179
+
180
+ it('migrates a real built-in section to a stable ID without duplicating it', async () => {
181
+ const builtin = await docs('theme', undefined, {full: true});
182
+ // Readers see a key on every section; the migration case is one whose
183
+ // source authors no id.
184
+ const {docs: authored} = await import('../../assets/docs/theme.doc.mjs');
185
+ const target = authored.sections.find(section => section.id == null);
186
+ expect(target).toBeDefined();
187
+ scaffold({
188
+ 'theme-internal.doc.mjs': topic({
189
+ name: 'theme-internal',
190
+ extends: 'theme',
191
+ sections: [
192
+ {
193
+ id: 'acme-theme-setup',
194
+ title: target.title,
195
+ content: [{type: 'prose', text: 'Use the Acme theme.'}],
196
+ },
197
+ ],
198
+ }),
199
+ });
200
+
201
+ const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
202
+ expect(extended.data.sections).toHaveLength(builtin.data.sections.length);
203
+ const matches = extended.data.sections.filter(
204
+ section => section.title === target.title,
205
+ );
206
+ expect(matches).toEqual([
207
+ expect.objectContaining({
208
+ id: 'acme-theme-setup',
209
+ content: [{type: 'prose', text: 'Use the Acme theme.'}],
210
+ }),
211
+ ]);
212
+ }, SLOW);
213
+
214
+ it('replaces a real built-in section by the key its index shows', async () => {
215
+ const index = await docs('theme', undefined, {index: true});
216
+ const target = index.data.sections[0];
217
+ scaffold({
218
+ 'theme-internal.doc.mjs': topic({
219
+ name: 'theme-internal',
220
+ extends: 'theme',
221
+ sections: [
222
+ {
223
+ id: target.id,
224
+ title: `${target.title} with Acme`,
225
+ content: [{type: 'prose', text: 'Acme first.'}],
226
+ },
227
+ ],
228
+ }),
229
+ });
230
+
231
+ const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
232
+ expect(extended.data.sections).toHaveLength(index.data.sections.length);
233
+ expect(extended.data.sections.filter(s => s.id === target.id)).toEqual([
234
+ expect.objectContaining({content: [{type: 'prose', text: 'Acme first.'}]}),
235
+ ]);
236
+ const read = await docs('theme', target.id, {cwd: tmpDir});
237
+ expect(read.data.title).toBe(`${target.title} with Acme`);
238
+ }, SLOW);
239
+
240
+ it.each(['zh', 'dense'])(
241
+ 'replaces translated real sections by their authored titles under --%s',
242
+ async lang => {
243
+ const english = await docs('theme', undefined, {full: true});
244
+ const englishTitles = english.data.sections.map(section => section.title);
245
+ expect(englishTitles).toEqual(
246
+ expect.arrayContaining(['Quick Start', 'Theme Props']),
247
+ );
248
+ scaffold({
249
+ 'theme-internal.doc.mjs': topic({
250
+ name: 'theme-internal',
251
+ extends: 'theme',
252
+ sections: [
253
+ {
254
+ id: 'acme-quick-start',
255
+ title: 'Quick Start',
256
+ content: [{type: 'prose', text: 'Acme quick start.'}],
257
+ },
258
+ {
259
+ title: 'Theme Props',
260
+ content: [{type: 'prose', text: 'Acme props.'}],
261
+ },
262
+ ],
263
+ }),
264
+ });
265
+
266
+ const base = await docs('theme', undefined, {lang, full: true});
267
+ expect(base.data.sections.map(section => section.title)).not.toEqual(
268
+ englishTitles,
269
+ );
270
+ const extended = await docs('theme', undefined, {cwd: tmpDir, lang, full: true});
271
+ expect(extended.data.sections).toHaveLength(base.data.sections.length);
272
+ expect(
273
+ extended.data.sections.filter(
274
+ section => section.id === 'acme-quick-start',
275
+ ),
276
+ ).toHaveLength(1);
277
+ expect(
278
+ extended.data.sections.filter(
279
+ section => section.content[0]?.text === 'Acme props.',
280
+ ),
281
+ ).toHaveLength(1);
282
+ },
283
+ SLOW,
284
+ );
285
+
286
+ it('offers the contributed topics as suggestions on an unknown one', async () => {
287
+ scaffold({'deploying.doc.mjs': topic()});
288
+ await expect(docs('nope-not-a-topic', undefined, {cwd: tmpDir, full: true})).rejects.toBeInstanceOf(
289
+ AstryxError,
290
+ );
291
+ try {
292
+ await docs('nope-not-a-topic', undefined, {cwd: tmpDir, full: true});
293
+ } catch (err) {
294
+ expect(err.suggestions.map(s => s.name)).toContain('deploying');
295
+ }
296
+ }, SLOW);
297
+
298
+ it('indexes a contributed topic in search', async () => {
299
+ scaffold({'deploying.doc.mjs': topic()});
300
+ const {data} = await search('deploying', {cwd: tmpDir, type: 'doc'});
301
+ expect(data.results[0]).toMatchObject({
302
+ domain: 'doc',
303
+ name: 'deploying',
304
+ command: 'astryx docs deploying',
305
+ });
306
+ }, SLOW);
307
+
308
+ it("falls back to the CLI's own topics when the project config is unreadable", async () => {
309
+ scaffold({'deploying.doc.mjs': topic()}, {config: 'export default {integrations: 42};\n'});
310
+ const catalog = await loadDocsCatalog(tmpDir);
311
+ expect(catalog.resolve('tokens')).toBeTruthy();
312
+ expect(catalog.resolve('deploying')).toBeUndefined();
313
+ }, SLOW);
314
+ });
@@ -257,20 +257,15 @@ export type DoctorContext = {
257
257
  * could not be built, when it could not.
258
258
  */
259
259
  docsCatalogError?: string | null | undefined;
260
+ /**
261
+ * Combined project-level integration issues, including cross-package template replacement warnings.
262
+ */
260
263
  integrationIssues?: {
261
264
  package: string;
262
265
  code: string;
263
266
  severity: "warning" | "error";
264
267
  message: string;
265
268
  }[] | null | undefined;
266
- /**
267
- * installed dependencies whose integration manifest could not be loaded
268
- * Combined project-level integration issues, including cross-package template replacement warnings.
269
- */
270
- autolinkFailures?: {
271
- spec: string;
272
- error: string;
273
- }[] | null | undefined;
274
269
  /**
275
270
  * - Error thrown while resolving the config
276
271
  * path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
@@ -13,18 +13,14 @@ export const doc = {
13
13
  name: 'doctor',
14
14
  namespace: 'cli/api',
15
15
  displayName: 'doctor()',
16
- summary:
17
- "Check a project's Astryx setup and get a pass/warn/fail report per check. Use it as a CI gate or before debugging a broken install.",
16
+ summary: 'Read-only project + environment health check.',
18
17
  description:
19
- 'Runs a series of diagnostics: Node version, ' +
18
+ 'Runs a series of side-effect-free diagnostics: Node version, ' +
20
19
  '@astryxdesign/core install and version alignment with the CLI, installed ' +
21
20
  'themes and wiring, astryx.config validity, integrations linked from ' +
22
- 'package.json without a config entry, core peer dependencies, ' +
23
- 'integration provider identity and contribution issues, agent docs, the ' +
24
- 'detected package manager, and the health of the docs the CLI reads (authoring ' +
25
- 'and CLI docs, the docs tree, doc size), and returns a structured ' +
26
- 'report. It only reads (never installs, writes, or mutates), apart from ' +
27
- "importing astryx.config, which runs that file's top-level code, so it is safe " +
21
+ 'package.json without a config entry, agent docs, core peer ' +
22
+ 'dependencies, and the detected package manager, and returns a structured ' +
23
+ 'report. It only reads (never installs, writes, or mutates), so it is safe ' +
28
24
  'as a CI gate and for agents to invoke.',
29
25
  importPath: '@astryxdesign/cli/api',
30
26
  signature: 'doctor(options?: DoctorOptions): Promise<DoctorResponse>',
@@ -33,23 +29,18 @@ export const doc = {
33
29
  {
34
30
  name: 'options.cwd',
35
31
  type: 'string',
36
- description:
37
- 'Directory to diagnose. A missing directory is not an error; it shows up in the checks (e.g. core-installed: fail).',
38
- default: 'process.cwd()',
32
+ description: 'Directory to diagnose.',
39
33
  },
40
34
  ],
41
35
  returns: [
42
36
  {
43
37
  type: 'doctor',
44
38
  description:
45
- 'The diagnostic report: `data.checks`, each with a stable id, label, `status` (`pass` | `warn` | `fail` | `info`), a one-line message, and an optional `fix` (always present on `warn` and `fail`; some `info` checks carry one too); plus `data.summary` with counts per status.',
39
+ 'The diagnostic report: `data.checks`, each with a stable id, label, `status` (`pass` | `warn` | `fail` | `info`), a one-line message, and a `fix` when the status is not `pass`; plus `data.summary` with counts per status.',
46
40
  },
47
41
  ],
48
42
  examples: [
49
- {
50
- label: 'Fail a CI step on any failed check',
51
- code: 'const r = await doctor();\nif (r.data.summary.fail > 0) process.exitCode = 1;',
52
- },
43
+ {label: 'Run diagnostics', code: 'const r = await doctor();'},
53
44
  {
54
45
  label: 'Diagnose a directory',
55
46
  code: "await doctor({cwd: '/path/to/app'});",
@@ -26,11 +26,7 @@ import * as path from 'node:path';
26
26
  import {MIN_NODE_VERSION, isNodeVersionSupported} from '../../foundation/env/node-version.mjs';
27
27
  import {CLI_ROOT, findCoreDir, findInstalledPackage} from '../../foundation/fs/paths.mjs';
28
28
  import {explainPackageManager, getCliInvocation} from '../../foundation/env/package-manager.mjs';
29
- import {
30
- findConfigPath,
31
- Project,
32
- providerLedgerOf,
33
- } from '../../foundation/config/project.mjs';
29
+ import {findConfigPath, Project} from '../../foundation/config/project.mjs';
34
30
  import {DocsCatalog} from '../../foundation/discovery/docs-discovery.mjs';
35
31
  import {buildDocsIndexData} from '../../foundation/discovery/docs-section-key.mjs';
36
32
  import {
@@ -80,8 +76,6 @@ import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env
80
76
  * @property {string|null} [docsCatalogError] - Why the project's docs catalog
81
77
  * could not be built, when it could not.
82
78
  * @property {Array<{package: string, code: string, severity: 'warning'|'error', message: string}>|null} [integrationIssues]
83
- * @property {Array<{spec: string, error: string}>|null} [autolinkFailures]
84
- * installed dependencies whose integration manifest could not be loaded
85
79
  * Combined project-level integration issues, including cross-package template replacement warnings.
86
80
  * @property {Error|null} [configError] - Error thrown while resolving the config
87
81
  * path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
@@ -423,9 +417,6 @@ export function checkImplicitIntegrations(ctx) {
423
417
  const implicit = ctx.integrations.filter(
424
418
  integration => integration.__autolinked,
425
419
  );
426
- // A dependency whose manifest cannot be loaded leaves no loaded record, so
427
- // without this line doctor would say no dependency ships a manifest at all.
428
- const unreadable = describeUnreadableManifests(ctx.autolinkFailures ?? []);
429
420
 
430
421
  if (implicit.length === 0) {
431
422
  return {
@@ -433,12 +424,9 @@ export function checkImplicitIntegrations(ctx) {
433
424
  label,
434
425
  status: 'info',
435
426
  message:
436
- (ctx.integrations.length > 0
427
+ ctx.integrations.length > 0
437
428
  ? 'None — every loaded integration is named in astryx.config.'
438
- : unreadable
439
- ? 'None loaded.'
440
- : 'None — no installed dependency ships an astryx.integration.* manifest.') +
441
- unreadable,
429
+ : 'None — no installed dependency ships an astryx.integration.* manifest.',
442
430
  };
443
431
  }
444
432
 
@@ -451,25 +439,11 @@ export function checkImplicitIntegrations(ctx) {
451
439
  integration.__spec && integration.__spec !== integration.name
452
440
  ? ` (declared as "${integration.__spec}")`
453
441
  : '';
454
- // A declared root counts only when it exists: the manifest's keys are a
455
- // claim, and `integration-issues` reports the ones that are not true.
456
- const declared = ['components', 'templates', 'themes', 'docs', 'codemods'].filter(
442
+ const roots = ['components', 'templates', 'themes', 'docs', 'codemods'].filter(
457
443
  root => integration[/** @type {'components'} */ (root)],
458
444
  );
459
- const missing = declared.filter(root => {
460
- const dir = integration[/** @type {'components'} */ (root)];
461
- if (typeof dir !== 'string') return false;
462
- const base =
463
- typeof integration.__packageDir === 'string'
464
- ? integration.__packageDir
465
- : (ctx.cwd ?? process.cwd());
466
- return !fs.existsSync(path.isAbsolute(dir) ? dir : path.resolve(base, dir));
467
- });
468
- const roots = declared.filter(root => !missing.includes(root));
469
445
  const contributes = roots.length > 0 ? roots.join(', ') : 'nothing';
470
- const absent =
471
- missing.length > 0 ? ` (declared ${missing.join(', ')} missing on disk)` : '';
472
- return `${integration.name}${version}${alias} from ${integration.__dependencyField}, contributing ${contributes}${absent}`;
446
+ return `${integration.name}${version}${alias} from ${integration.__dependencyField}, contributing ${contributes}`;
473
447
  });
474
448
 
475
449
  const plural = implicit.length === 1 ? '' : 's';
@@ -479,8 +453,7 @@ export function checkImplicitIntegrations(ctx) {
479
453
  status: 'info',
480
454
  message:
481
455
  `${implicit.length} integration${plural} loaded from installed ` +
482
- `dependencies with no astryx.config entry: ${described.join('; ')}.` +
483
- unreadable,
456
+ `dependencies with no astryx.config entry: ${described.join('; ')}.`,
484
457
  fix:
485
458
  'Nothing to fix. Keep these dependencies installed. The CLI links them ' +
486
459
  'from package.json, so an unused-dependency check that looks only for ' +
@@ -489,30 +462,6 @@ export function checkImplicitIntegrations(ctx) {
489
462
  };
490
463
  }
491
464
 
492
- /**
493
- * The sentence `implicit-integrations` adds for dependencies whose manifest
494
- * could not be loaded, or '' when there are none. Still informational: the
495
- * package is a dependency's own bug, which `doctor integration validate`
496
- * diagnoses, but doctor must not report it as absent.
497
- * @param {Array<{spec: string, error: string}>} failures
498
- * @returns {string}
499
- */
500
- function describeUnreadableManifests(failures) {
501
- if (failures.length === 0) return '';
502
- const one = failures.length === 1;
503
- const listed = failures
504
- .map(({spec, error}) => {
505
- const reason = String(error).split('\n')[0].slice(0, 160);
506
- return `${spec} (${reason})`;
507
- })
508
- .join('; ');
509
- return (
510
- ` ${failures.length} installed ${one ? 'dependency ships' : 'dependencies ship'} ` +
511
- `an astryx.integration.* manifest that could not be loaded, so ${one ? 'it contributes' : 'they contribute'} ` +
512
- `nothing: ${listed}. Run \`astryx doctor integration validate <package>\` for details.`
513
- );
514
- }
515
-
516
465
  /**
517
466
  * Check 7 — agent docs exist and contain the Astryx section markers.
518
467
  * @param {DoctorContext} ctx
@@ -789,26 +738,12 @@ export function checkProviderIdentity(ctx) {
789
738
  integration =>
790
739
  integration.providerId != null && integration.__loadError == null,
791
740
  ).length;
792
- // An integration that could not be read has no provider ID to check, so the
793
- // count above is not a complete survey. Say so instead of counting silently.
794
- const unread = ctx.integrations.filter(
795
- integration => integration.__loadError != null,
796
- ).length;
797
- const unreadNote =
798
- unread === 0
799
- ? ''
800
- : unread === 1
801
- ? ' 1 loaded integration could not be read, so its provider ID is unknown.'
802
- : ` ${unread} loaded integrations could not be read, so their provider IDs are unknown.`;
803
741
  if (count === 0) {
804
742
  return {
805
743
  id,
806
744
  label,
807
745
  status: 'info',
808
- message:
809
- (unread === 0
810
- ? 'None — no loaded integration has a provider identity.'
811
- : 'No readable integration has a provider identity.') + unreadNote,
746
+ message: 'None — no loaded integration has a provider identity.',
812
747
  };
813
748
  }
814
749
  return {
@@ -816,10 +751,9 @@ export function checkProviderIdentity(ctx) {
816
751
  label,
817
752
  status: 'pass',
818
753
  message:
819
- (count === 1
754
+ count === 1
820
755
  ? '1 loaded integration has its own provider ID.'
821
- : `${count} loaded integrations each have their own provider ID.`) +
822
- unreadNote,
756
+ : `${count} loaded integrations each have their own provider ID.`,
823
757
  };
824
758
  }
825
759
 
@@ -1264,25 +1198,11 @@ export async function runChecks(options = {}) {
1264
1198
  let docsCatalogError = null;
1265
1199
  /** @type {Array<{package: string, code: string, severity: 'warning'|'error', message: string}>|null} */
1266
1200
  let integrationIssues = null;
1267
- /** @type {Array<{spec: string, error: string}>|null} */
1268
- let autolinkFailures = null;
1269
1201
  try {
1270
1202
  const project = await Project.load(cwd);
1271
1203
  configTheme =
1272
1204
  /** @type {{theme?: string}} */ (project.config ?? {}).theme ?? null;
1273
1205
  integrations = project.loadedIntegrations;
1274
- // An installed dependency whose manifest cannot be loaded is kept out of
1275
- // loadedIntegrations on purpose. The provider ledger still records it.
1276
- autolinkFailures = [...providerLedgerOf(project).values()]
1277
- .filter(
1278
- entry =>
1279
- entry.outcome === 'load-failed' &&
1280
- entry.candidate.source === 'autolinked',
1281
- )
1282
- .map(entry => ({
1283
- spec: entry.candidate.spec ?? entry.label,
1284
- error: entry.error ?? 'its manifest could not be loaded',
1285
- }));
1286
1206
  try {
1287
1207
  docsCatalog = await project.docs();
1288
1208
  docsCatalogIssues = (await project.issues()).filter(
@@ -1309,7 +1229,6 @@ export async function runChecks(options = {}) {
1309
1229
  docsCatalogIssues,
1310
1230
  docsCatalogError,
1311
1231
  integrationIssues,
1312
- autolinkFailures,
1313
1232
  configError,
1314
1233
  };
1315
1234