@astryxdesign/cli 0.6.4 → 0.6.5-canary.031021b

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 (288) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +97 -90
  3. package/api/build/build.doc.mjs +6 -1
  4. package/api/build/build.test.mjs +22 -0
  5. package/api/build/kit/kit.mjs +44 -5
  6. package/api/component/_adapter.d.mts +25 -0
  7. package/api/component/_adapter.mjs +59 -5
  8. package/api/component/component.d.mts +6 -3
  9. package/api/component/component.doc.mjs +37 -17
  10. package/api/component/component.mjs +249 -9
  11. package/api/component/component.type.d.mts +25 -0
  12. package/api/component/component.type.mjs +44 -0
  13. package/api/discover/_adapter.d.mts +114 -6
  14. package/api/discover/_adapter.mjs +372 -17
  15. package/api/discover/_adapter.test.mjs +215 -0
  16. package/api/discover/_catalog-view.d.mts +115 -0
  17. package/api/discover/_catalog-view.mjs +203 -0
  18. package/api/discover/_catalog-view.test.mjs +128 -0
  19. package/api/discover/detail/detail.d.mts +18 -6
  20. package/api/discover/detail/detail.mjs +67 -13
  21. package/api/discover/detail/detail.test.mjs +85 -0
  22. package/api/discover/detail/item/item.d.mts +26 -0
  23. package/api/discover/detail/item/item.mjs +78 -0
  24. package/api/discover/detail/item/item.test.mjs +73 -0
  25. package/api/discover/discover.d.mts +3 -9
  26. package/api/discover/discover.doc.mjs +61 -18
  27. package/api/discover/discover.mjs +220 -36
  28. package/api/discover/discover.test.mjs +11 -2
  29. package/api/discover/discover.type.d.mts +147 -8
  30. package/api/discover/discover.type.mjs +102 -12
  31. package/api/discover/list/list.d.mts +20 -6
  32. package/api/discover/list/list.mjs +45 -12
  33. package/api/discover/list/list.test.mjs +46 -0
  34. package/api/discover/search/search.d.mts +18 -16
  35. package/api/discover/search/search.mjs +102 -56
  36. package/api/discover/search/search.test.mjs +144 -10
  37. package/api/docs/_adapter.d.mts +8 -3
  38. package/api/docs/_adapter.mjs +14 -6
  39. package/api/docs/docOverlays.test.mjs +27 -1
  40. package/api/docs/docs.doc.mjs +2 -2
  41. package/api/doctor/doctor.d.mts +8 -3
  42. package/api/doctor/doctor.doc.mjs +17 -8
  43. package/api/doctor/doctor.mjs +90 -9
  44. package/api/doctor/doctor.test.mjs +122 -10
  45. package/api/doctor/doctor.type.d.mts +1 -1
  46. package/api/doctor/doctor.type.mjs +1 -1
  47. package/api/gap-report/gap-report.doc.mjs +19 -10
  48. package/api/hook/hook.doc.mjs +6 -3
  49. package/api/index.d.mts +1 -0
  50. package/api/index.mjs +5 -3
  51. package/api/init/init.doc.mjs +17 -12
  52. package/api/integration/add-helpers.d.mts +5 -2
  53. package/api/integration/add-helpers.mjs +36 -9
  54. package/api/integration/add-theme.mjs +22 -1
  55. package/api/integration/add-theme.test.mjs +34 -0
  56. package/api/integration/authoring-checks.mjs +2 -2
  57. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  58. package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
  59. package/api/integration/pack-check.mjs +82 -9
  60. package/api/integration/pack-check.test.mjs +90 -0
  61. package/api/integration/pack-check.type.mjs +1 -1
  62. package/api/json/assertResponse.doc.mjs +1 -1
  63. package/api/json/isError.doc.mjs +1 -1
  64. package/api/search/search.d.mts +27 -1
  65. package/api/search/search.doc.mjs +2 -2
  66. package/api/search/search.mjs +228 -16
  67. package/api/swizzle/swizzle.doc.mjs +7 -5
  68. package/api/template/copy/copy.mjs +1 -1
  69. package/api/template/copy/copy.test.mjs +9 -0
  70. package/api/template/template.doc.mjs +2 -1
  71. package/api/theme/add/add.mjs +17 -25
  72. package/api/theme/add/add.rollback.test.mjs +158 -0
  73. package/api/theme/add/add.staging.test.mjs +40 -23
  74. package/api/theme/build/build.family.test.mjs +7 -12
  75. package/api/theme/build/build.mjs +8 -18
  76. package/api/theme/build/build.rollback.test.mjs +148 -0
  77. package/api/theme/generateTonalPalette.doc.mjs +1 -2
  78. package/api/theme/listThemes.doc.mjs +1 -1
  79. package/api/theme/themeAdd.doc.mjs +9 -10
  80. package/api/theme/themeBuild.doc.mjs +13 -13
  81. package/api/theme/themeList.doc.mjs +1 -1
  82. package/api/theme/themeListAvailable.doc.mjs +2 -1
  83. package/api/theme/themePaletteGenerate.doc.mjs +15 -8
  84. package/api/theme/themeTargets.doc.mjs +3 -2
  85. package/api/theme/themeTemplate.doc.mjs +2 -1
  86. package/api/upgrade/run/files-changed.test.mjs +111 -0
  87. package/api/upgrade/run/run.mjs +5 -3
  88. package/api/upgrade/upgrade.doc.mjs +24 -22
  89. package/api/upgrade/upgrade.type.mjs +2 -2
  90. package/assets/codemods/__tests__/runner.test.mjs +3 -1
  91. package/assets/codemods/file-count.test.mjs +163 -0
  92. package/assets/codemods/integration-runner.mjs +3 -3
  93. package/assets/codemods/runner.mjs +5 -4
  94. package/assets/docs/README.md +4 -2
  95. package/assets/docs/browser-support.doc.mjs +11 -11
  96. package/assets/docs/color.doc.mjs +8 -2
  97. package/assets/docs/elevation.doc.mjs +6 -4
  98. package/assets/docs/getting-started.doc.mjs +5 -16
  99. package/assets/docs/icons.doc.mjs +2 -21
  100. package/assets/docs/illustrations.doc.mjs +7 -15
  101. package/assets/docs/internationalization.doc.mjs +7 -5
  102. package/assets/docs/layout.doc.dense.mjs +130 -82
  103. package/assets/docs/layout.doc.mjs +133 -77
  104. package/assets/docs/migration.doc.mjs +19 -21
  105. package/assets/docs/motion.doc.mjs +16 -3
  106. package/assets/docs/principles.doc.dense.mjs +5 -5
  107. package/assets/docs/principles.doc.mjs +8 -0
  108. package/assets/docs/principles.doc.zh.mjs +6 -6
  109. package/assets/docs/shape.doc.mjs +8 -3
  110. package/assets/docs/spacing.doc.mjs +7 -2
  111. package/assets/docs/styling-libraries.doc.mjs +6 -2
  112. package/assets/docs/styling.doc.mjs +19 -23
  113. package/assets/docs/theme.doc.dense.mjs +58 -18
  114. package/assets/docs/theme.doc.mjs +57 -47
  115. package/assets/docs/theme.doc.zh.mjs +9 -8
  116. package/assets/docs/tokens.doc.dense.mjs +2 -2
  117. package/assets/docs/tokens.doc.mjs +389 -8
  118. package/assets/docs/tokens.doc.zh.mjs +2 -2
  119. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  120. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  121. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  122. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  123. package/assets/docs/tree/block-template.doc.mjs +130 -0
  124. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  125. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  126. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  127. package/assets/docs/tree/checks.doc.mjs +119 -0
  128. package/assets/docs/tree/codemods.doc.mjs +147 -0
  129. package/assets/docs/tree/component-family.doc.mjs +113 -0
  130. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  131. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  132. package/assets/docs/tree/components.doc.mjs +23 -0
  133. package/assets/docs/tree/configuration.doc.mjs +23 -0
  134. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  135. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  136. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  137. package/assets/docs/tree/docs.doc.mjs +21 -0
  138. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  139. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  140. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  141. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  142. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  143. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  144. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  145. package/assets/docs/tree/help.doc.mjs +16 -0
  146. package/assets/docs/tree/integrations.doc.mjs +25 -451
  147. package/assets/docs/tree/links.doc.mjs +98 -0
  148. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  149. package/assets/docs/tree/page-template.doc.mjs +71 -0
  150. package/assets/docs/tree/publishing.doc.mjs +111 -0
  151. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  152. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  153. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  154. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  155. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  156. package/assets/docs/tree/ship.doc.mjs +16 -0
  157. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  158. package/assets/docs/tree/single-component.doc.mjs +165 -0
  159. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  160. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  161. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  162. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  163. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  164. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  165. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  166. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  167. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  168. package/assets/docs/tree/templates.doc.mjs +34 -0
  169. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  170. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  171. package/assets/docs/tree/themes.doc.mjs +39 -0
  172. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  173. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  174. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  175. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  176. package/assets/docs/tree/versioning.doc.mjs +161 -0
  177. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  178. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  179. package/assets/docs/typography.doc.mjs +24 -4
  180. package/assets/docs/working-with-ai.doc.mjs +30 -22
  181. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  182. package/authoring/config/config.doc.mjs +9 -1
  183. package/authoring/config/parse.d.mts +2 -0
  184. package/authoring/config/parse.mjs +19 -0
  185. package/authoring/config/parse.test.mjs +8 -0
  186. package/authoring/config/type.ts +11 -0
  187. package/authoring/discover/discover.doc.d.mts +13 -0
  188. package/authoring/discover/discover.doc.mjs +138 -0
  189. package/authoring/discover/parse.d.mts +24 -0
  190. package/authoring/discover/parse.mjs +128 -0
  191. package/authoring/discover/parse.test.mjs +124 -0
  192. package/authoring/discover/type.ts +87 -0
  193. package/authoring/doctypes/_schema.d.mts +3 -2
  194. package/authoring/doctypes/_schema.mjs +6 -0
  195. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  196. package/authoring/doctypes/base/type.ts +4 -2
  197. package/authoring/doctypes/component/component.doc.mjs +6 -0
  198. package/authoring/doctypes/component/type.ts +8 -0
  199. package/authoring/doctypes/reference/reference.doc.mjs +7 -0
  200. package/authoring/doctypes/reference/type.ts +5 -0
  201. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  202. package/authoring/doctypes/template/template.doc.mjs +1 -1
  203. package/authoring/doctypes/template/type.ts +2 -2
  204. package/authoring/index.d.mts +1 -0
  205. package/authoring/index.d.ts +10 -0
  206. package/authoring/index.mjs +1 -0
  207. package/authoring/integration/integration.doc.mjs +12 -10
  208. package/clients/cli/commands/component/index.mjs +152 -55
  209. package/clients/cli/commands/component-batch.test.mjs +341 -0
  210. package/clients/cli/commands/component-ownership.test.mjs +89 -0
  211. package/clients/cli/commands/component.doc.mjs +27 -9
  212. package/clients/cli/commands/discover.doc.mjs +53 -9
  213. package/clients/cli/commands/discover.mjs +393 -118
  214. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  215. package/clients/cli/commands/docs.doc.mjs +1 -1
  216. package/clients/cli/commands/docs.mjs +60 -17
  217. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -2
  218. package/clients/cli/commands/doctor-integration.test.mjs +53 -0
  219. package/clients/cli/commands/doctor.doc.mjs +3 -1
  220. package/clients/cli/commands/doctor.mjs +49 -5
  221. package/clients/cli/commands/gap-report.doc.mjs +10 -9
  222. package/clients/cli/commands/init.doc.mjs +9 -6
  223. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  224. package/clients/cli/commands/integration-authoring.test.mjs +61 -10
  225. package/clients/cli/commands/integration-pack.doc.mjs +5 -9
  226. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  227. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  228. package/clients/cli/commands/integration.doc.mjs +4 -4
  229. package/clients/cli/commands/integration.mjs +74 -43
  230. package/clients/cli/commands/manifest.doc.mjs +1 -1
  231. package/clients/cli/commands/search.doc.mjs +10 -3
  232. package/clients/cli/commands/search.mjs +21 -2
  233. package/clients/cli/commands/search.test.mjs +21 -4
  234. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  235. package/clients/cli/commands/template.doc.mjs +1 -1
  236. package/clients/cli/commands/text-json-parity.test.mjs +7 -1
  237. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  238. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -2
  239. package/clients/cli/commands/theme-palette.doc.mjs +1 -2
  240. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  241. package/clients/cli/commands/theme.doc.mjs +2 -1
  242. package/clients/cli/commands/upgrade.doc.mjs +62 -3
  243. package/clients/cli/index.mjs +28 -6
  244. package/clients/cli/lib/define-command.mjs +28 -4
  245. package/clients/cli/lib/define-command.test.mjs +54 -0
  246. package/clients/cli/lib/exit-codes.test.mjs +17 -1
  247. package/clients/cli/lib/json-shim.mjs +24 -14
  248. package/clients/cli/lib/manifest.mjs +18 -5
  249. package/clients/cli/lib/manifest.test.mjs +5 -2
  250. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  251. package/foundation/agent-docs/agent-docs.mjs +1 -1
  252. package/foundation/discovery/authoring-self-docs.mjs +1 -0
  253. package/foundation/discovery/authoring-self-docs.test.mjs +6 -2
  254. package/foundation/discovery/cli-self-docs.mjs +16 -2
  255. package/foundation/discovery/cli-self-docs.test.mjs +20 -0
  256. package/foundation/discovery/docs-discovery.mjs +5 -1
  257. package/foundation/discovery/docs-discovery.test.mjs +21 -0
  258. package/foundation/discovery/docs-section-key.d.mts +1 -1
  259. package/foundation/discovery/docs-section-key.mjs +1 -1
  260. package/foundation/doc-compiler/doc-loads.test.mjs +3 -2
  261. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  262. package/foundation/doc-compiler/tree.d.mts +4 -0
  263. package/foundation/doc-compiler/tree.mjs +6 -1
  264. package/foundation/integrations/cli-requirement.d.mts +26 -6
  265. package/foundation/integrations/cli-requirement.mjs +46 -11
  266. package/foundation/integrations/cli-requirement.test.mjs +7 -2
  267. package/foundation/integrations/contribution-inventory.mjs +1 -1
  268. package/foundation/integrations/integrations.d.mts +14 -1
  269. package/foundation/integrations/integrations.mjs +41 -1
  270. package/foundation/integrations/integrations.test.mjs +31 -0
  271. package/foundation/response/batch.type.d.mts +33 -0
  272. package/foundation/response/batch.type.mjs +34 -0
  273. package/foundation/response/error-codes.doc.mjs +6 -8
  274. package/foundation/response/error-codes.test.mjs +30 -5
  275. package/foundation/response/response-types.doc.d.mts +4 -3
  276. package/foundation/response/response-types.doc.mjs +40 -10
  277. package/foundation/response/response-types.doc.test.mjs +23 -0
  278. package/foundation/response/response.doc.mjs +11 -10
  279. package/package.json +9 -9
  280. package/api/docs/docs.test.mjs +0 -243
  281. package/api/docs/integration-tree.test.mjs +0 -555
  282. package/api/docs/integrationDocs.test.mjs +0 -314
  283. package/api/search/search.test.mjs +0 -512
  284. package/assets/docs/tree/integrations.test.mjs +0 -62
  285. package/assets/docs/tree/writing-docs.doc.mjs +0 -286
  286. package/clients/cli/commands/docs.test.mjs +0 -294
  287. package/foundation/agent-docs/agent-docs.test.mjs +0 -1159
  288. package/foundation/doc-compiler/tree.test.mjs +0 -598
@@ -0,0 +1,124 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Tests for the discover source and catalog checks.
5
+ */
6
+
7
+ import {describe, it, expect} from 'vitest';
8
+ import {
9
+ DISCOVER_KINDS,
10
+ parseDiscoverCatalog,
11
+ parseDiscoverSource,
12
+ } from './parse.mjs';
13
+
14
+ function catalog(overrides = {}) {
15
+ return {
16
+ schemaVersion: 1,
17
+ source: {
18
+ name: 'Acme catalog',
19
+ generatedAt: '2026-09-30T14:00:00.000Z',
20
+ complete: true,
21
+ },
22
+ packages: [
23
+ {
24
+ package: '@acme/ui',
25
+ integration: 'acme-ui',
26
+ aliases: [],
27
+ latest: '2.0.0',
28
+ versions: [
29
+ {
30
+ version: '2.0.0',
31
+ publishedAt: '2026-09-29T00:00:00.000Z',
32
+ prerelease: false,
33
+ status: 'ok',
34
+ },
35
+ ],
36
+ contributions: [{kind: 'component', name: 'Button'}],
37
+ },
38
+ ],
39
+ ...overrides,
40
+ };
41
+ }
42
+
43
+ describe('parseDiscoverCatalog', () => {
44
+ it('accepts a catalog', () => {
45
+ expect(parseDiscoverCatalog(catalog())).toEqual(catalog());
46
+ });
47
+
48
+ it('drops fields it does not know, so a newer source still works', () => {
49
+ const parsed = parseDiscoverCatalog({...catalog(), cursor: 'next'});
50
+ expect(parsed).not.toHaveProperty('cursor');
51
+ });
52
+
53
+ it('drops items of a kind it does not know', () => {
54
+ const value = catalog();
55
+ value.packages[0].contributions.push({kind: 'widget', name: 'Spinner'});
56
+ expect(parseDiscoverCatalog(value).packages[0].contributions).toEqual([
57
+ {kind: 'component', name: 'Button'},
58
+ ]);
59
+ });
60
+
61
+ it('puts versions newest first whatever order the source used', () => {
62
+ const value = catalog();
63
+ value.packages[0].versions = [
64
+ {
65
+ version: '1.0.0',
66
+ publishedAt: '2026-01-05T00:00:00.000Z',
67
+ prerelease: false,
68
+ status: 'ok',
69
+ },
70
+ {version: '1.5.0', publishedAt: null, prerelease: false, status: 'ok'},
71
+ {
72
+ version: '2.0.0',
73
+ publishedAt: '2026-09-29T00:00:00.000Z',
74
+ prerelease: false,
75
+ status: 'ok',
76
+ },
77
+ {
78
+ version: '2.0.0-rc.1',
79
+ publishedAt: '2026-09-01T00:00:00.000Z',
80
+ prerelease: true,
81
+ status: 'ok',
82
+ },
83
+ ];
84
+ expect(
85
+ parseDiscoverCatalog(value).packages[0].versions.map(v => v.version),
86
+ ).toEqual(['2.0.0', '2.0.0-rc.1', '1.0.0', '1.5.0']);
87
+ });
88
+
89
+ it('refuses a schemaVersion it does not read', () => {
90
+ expect(() => parseDiscoverCatalog(catalog({schemaVersion: 2}))).toThrow(
91
+ 'this CLI reads schemaVersion 1',
92
+ );
93
+ });
94
+
95
+ it('names the first problem and where it is', () => {
96
+ expect(() =>
97
+ parseDiscoverCatalog(catalog({packages: [{package: ''}]}), 'the source'),
98
+ ).toThrow(/^the source returned an invalid catalog at packages\.0\./);
99
+ });
100
+
101
+ it('lists the kinds in display order', () => {
102
+ expect(DISCOVER_KINDS).toEqual([
103
+ 'component',
104
+ 'template',
105
+ 'doc',
106
+ 'theme',
107
+ 'codemod',
108
+ 'agent-doc',
109
+ ]);
110
+ });
111
+ });
112
+
113
+ describe('parseDiscoverSource', () => {
114
+ it('accepts a function', () => {
115
+ const source = async () => catalog();
116
+ expect(parseDiscoverSource(source, 'discover')).toBe(source);
117
+ });
118
+
119
+ it('refuses anything else, such as a URL', () => {
120
+ expect(() =>
121
+ parseDiscoverSource('https://example.com/catalog.json', 'discover'),
122
+ ).toThrow('discover must be a function');
123
+ });
124
+ });
@@ -0,0 +1,87 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * Public type surface for discover sources.
5
+ *
6
+ * A discover source tells `astryx discover` which integrations exist beyond the
7
+ * ones a project already has. A project sets one as `discover` in
8
+ * `astryx.config`; an integration exports one as a `discover` NAMED export from
9
+ * its manifest. Discover calls every source, checks each answer, keeps a saved
10
+ * copy of the last good one, and never installs, enables, or runs anything a
11
+ * catalog names.
12
+ */
13
+
14
+ /** Kinds of item a package can add. */
15
+ export type DiscoverKind =
16
+ 'component' | 'template' | 'doc' | 'theme' | 'codemod' | 'agent-doc';
17
+
18
+ /** One item a package version adds. */
19
+ export interface DiscoverContribution {
20
+ kind: DiscoverKind;
21
+ /**
22
+ * The name the CLI uses for it: a component name, template id, doc topic,
23
+ * theme slug, or codemod id.
24
+ */
25
+ name: string;
26
+ title?: string;
27
+ summary?: string;
28
+ keywords?: string[];
29
+ }
30
+
31
+ /** One published version of a package. */
32
+ export interface DiscoverVersion {
33
+ version: string;
34
+ /** ISO 8601 publish time, or null when the source does not know it. */
35
+ publishedAt: string | null;
36
+ prerelease: boolean;
37
+ /** `ok`, or why the source could not read this version. */
38
+ status: string;
39
+ }
40
+
41
+ /** One npm package a source knows about. */
42
+ export interface DiscoverPackage {
43
+ package: string;
44
+ /** Shared by every npm name that publishes the same integration. */
45
+ integration: string;
46
+ /** The integration's other npm names. Discover never offers one the project has. */
47
+ aliases: string[];
48
+ description?: string;
49
+ /** The latest release, or null when the package has only prereleases. */
50
+ latest: string | null;
51
+ /** Every version, newest first. */
52
+ versions: DiscoverVersion[];
53
+ /** What the requested version adds, or the latest when none was requested. */
54
+ contributions: DiscoverContribution[];
55
+ }
56
+
57
+ /** What a discover source returns. */
58
+ export interface DiscoverCatalog {
59
+ schemaVersion: 1;
60
+ source: {
61
+ /** Shown to people, for example "Acme catalog". */
62
+ name: string;
63
+ /** ISO 8601 time the source's data was produced. */
64
+ generatedAt: string;
65
+ /** False when the source knows its list is partial. */
66
+ complete: boolean;
67
+ };
68
+ packages: DiscoverPackage[];
69
+ }
70
+
71
+ /** One call to a discover source. */
72
+ export interface DiscoverSourceContext {
73
+ /** Aborted when the source exceeds its 30-second budget. */
74
+ readonly signal: AbortSignal;
75
+ /** Asks for one package: every version, and `version`'s contributions. */
76
+ readonly package?: string;
77
+ /** With `package`: the version whose contributions to return. Defaults to the latest. */
78
+ readonly version?: string;
79
+ }
80
+
81
+ /**
82
+ * A discover source: an async function, like `debug`. Set it as `discover` in
83
+ * astryx.config, or export it as `discover` from an integration manifest.
84
+ */
85
+ export type DiscoverSource = (
86
+ context: DiscoverSourceContext,
87
+ ) => Promise<DiscoverCatalog>;
@@ -216,6 +216,7 @@ export const ComponentDocKindSchema: z.ZodObject<{
216
216
  theming: z.ZodOptional<z.ZodUnknown>;
217
217
  playground: z.ZodOptional<z.ZodUnknown>;
218
218
  examples: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
219
+ replaces: z.ZodOptional<z.ZodString>;
219
220
  name: z.ZodString;
220
221
  displayName: z.ZodOptional<z.ZodString>;
221
222
  description: z.ZodOptional<z.ZodString>;
@@ -316,6 +317,7 @@ export const FunctionDocKindSchema: z.ZodObject<{
316
317
  export const GenericDocKindSchema: z.ZodObject<{
317
318
  type: z.ZodLiteral<"generic">;
318
319
  title: z.ZodOptional<z.ZodString>;
320
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
319
321
  sections: z.ZodOptional<z.ZodArray<z.ZodObject<{
320
322
  id: z.ZodOptional<z.ZodString>;
321
323
  title: z.ZodString;
@@ -384,7 +386,6 @@ export const GenericDocKindSchema: z.ZodObject<{
384
386
  import: z.ZodOptional<z.ZodString>;
385
387
  group: z.ZodOptional<z.ZodString>;
386
388
  category: z.ZodOptional<z.ZodString>;
387
- keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
388
389
  parent: z.ZodOptional<z.ZodString>;
389
390
  relatedDocs: z.ZodOptional<z.ZodArray<z.ZodString>>;
390
391
  hidden: z.ZodOptional<z.ZodBoolean>;
@@ -840,7 +841,6 @@ export const LegacyDocSchema: z.ZodUnion<readonly [z.ZodObject<{
840
841
  displayName: z.ZodOptional<z.ZodString>;
841
842
  group: z.ZodOptional<z.ZodString>;
842
843
  category: z.ZodOptional<z.ZodString>;
843
- keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
844
844
  isHiddenFromOverview: z.ZodOptional<z.ZodBoolean>;
845
845
  hidden: z.ZodOptional<z.ZodBoolean>;
846
846
  hiddenComponents: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -865,6 +865,7 @@ export const LegacyDocSchema: z.ZodUnion<readonly [z.ZodObject<{
865
865
  }>>;
866
866
  title: z.ZodString;
867
867
  description: z.ZodString;
868
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
868
869
  sections: z.ZodArray<z.ZodObject<{
869
870
  id: z.ZodOptional<z.ZodString>;
870
871
  title: z.ZodString;
@@ -307,6 +307,7 @@ const ComponentBaseSchema = z
307
307
  theming: z.unknown().optional(),
308
308
  playground: z.unknown().optional(),
309
309
  examples: z.array(z.unknown()).optional(),
310
+ replaces: z.string().min(1).optional(),
310
311
  })
311
312
  .passthrough();
312
313
 
@@ -414,6 +415,9 @@ export const GenericDocKindSchema = z
414
415
  ...BaseDocFields,
415
416
  type: z.literal('generic'),
416
417
  title: nonEmptyString.optional(),
418
+ // Search terms the title and sections do not use; `astryx search` matches
419
+ // them as keywords of the whole topic (ReferenceDoc `keywords`).
420
+ keywords: z.array(z.string()).optional(),
417
421
  sections: z.array(ReferenceSectionSchema).min(1).optional(),
418
422
  replaces: nonEmptyString.optional(),
419
423
  extends: nonEmptyString.optional(),
@@ -730,6 +734,8 @@ const LegacyBaseDocSchema = z.object({
730
734
  const LegacyReferenceDocSchema = LegacyBaseDocSchema.extend({
731
735
  title: nonEmptyString,
732
736
  description: z.string(),
737
+ // As on the stamped schema: search terms for the whole topic.
738
+ keywords: z.array(z.string()).optional(),
733
739
  sections: z.array(ReferenceSectionSchema).min(1),
734
740
  replaces: nonEmptyString.optional(),
735
741
  extends: nonEmptyString.optional(),
@@ -12,7 +12,7 @@ export const doc = {
12
12
  displayName: 'Authored doc graph fields',
13
13
  namespace: 'authoring',
14
14
  description:
15
- "Placement, compatibility aliases, and audience: fields every authored doc kind declares for the docs tree. The docs tree reads `placement` for every guide, the CLI's and each integration's; aliases and audience are not built yet. A reference topic outside the docs tree that sets one fails to load, and other doc kinds accept them and ignore them.",
15
+ "Fields every authored doc kind can declare for the docs tree: `placement`, plus two reserved fields, `aliases` and `audience`. The docs tree reads `placement` for every guide, the CLI's and each integration's. Nothing reads `aliases` or `audience` today: a reference topic outside the docs tree that sets one fails to load, and other doc kinds accept them and ignore them.",
16
16
  appliesTo: 'Every supported .doc.mjs object',
17
17
  fields: [
18
18
  {
@@ -45,13 +45,13 @@ export const doc = {
45
45
  name: 'aliases',
46
46
  type: 'string[]',
47
47
  description:
48
- 'Prior names or routes the docs tree will keep resolving to this doc, without creating another identity. Not read yet: a topic that sets it fails to load.',
48
+ 'Reserved: prior names or routes the docs tree will keep resolving to this doc, without creating another identity. Nothing reads it today, and a topic that sets it fails to load.',
49
49
  },
50
50
  {
51
51
  name: 'audience',
52
52
  type: "'public' | 'internal'",
53
53
  description:
54
- "Which docs bundle includes this doc ('public' when omitted). Not read yet: a topic that sets it fails to load.",
54
+ "Reserved: which docs bundle includes this doc ('public' when omitted). Nothing reads it today, and a topic that sets it fails to load.",
55
55
  default: "'public'",
56
56
  },
57
57
  ],
@@ -39,9 +39,11 @@ export interface DocPlacement {
39
39
  export interface AuthoredDocGraphFields {
40
40
  /** The doc's one parent in the docs tree: a namespace of its own package. */
41
41
  placement?: DocPlacement;
42
- /** Prior routes or names the docs tree will keep resolving. Not read yet. */
42
+ /** Reserved: prior routes or names the docs tree will keep resolving.
43
+ * Nothing reads it yet. */
43
44
  aliases?: string[];
44
- /** Docs bundle audience; omit for public docs. Not read yet. */
45
+ /** Reserved: docs bundle audience; omit for public docs. Nothing reads it
46
+ * yet. */
45
47
  audience?: DocAudience;
46
48
  }
47
49
 
@@ -52,6 +52,12 @@ export const doc = {
52
52
  description:
53
53
  'Exact public package specifier consumers use to import an integration-owned component. The packed-package gate resolves this specifier and verifies it exports the component name.',
54
54
  },
55
+ {
56
+ name: 'replaces',
57
+ type: 'string',
58
+ description:
59
+ "Integration components only: the exact `name` of the Core ComponentDoc this component takes over for unqualified lookup, so every app that loads the integration gets it from component detail, lists, search, swizzle, and issue routing. The Core original stays reachable with `--package @astryxdesign/core`. Set it only to intentionally own a Core identity; give an alternative or variant its own name instead.",
60
+ },
55
61
  {
56
62
  name: 'keywords',
57
63
  type: 'string[]',
@@ -48,6 +48,14 @@ export interface ComponentBaseDoc extends AuthoredDocGraphFields {
48
48
  displayName: string;
49
49
  /** Exact consumer import specifier for integration-owned components. */
50
50
  import?: string;
51
+ /** Integration components only: the exact `name` of the Core ComponentDoc
52
+ * this component takes over for unqualified lookup, so every app that loads
53
+ * the integration gets this component from component detail, lists, search,
54
+ * swizzle, and issue routing. The Core original stays reachable with
55
+ * `--package @astryxdesign/core`. Set it only to intentionally own a Core
56
+ * identity; give an alternative or variant its own name instead. Older CLIs
57
+ * that do not read `replaces` keep the component under its own name. */
58
+ replaces?: string;
51
59
  /** Search keywords for CLI discovery. Terms a developer might type when
52
60
  * looking for this component: synonyms, related UI concepts, and common
53
61
  * names from other design systems (MUI, Chakra, Radix, and others).
@@ -51,6 +51,13 @@ export const doc = {
51
51
  type: 'string',
52
52
  description: "Navigation category: 'guide' or 'foundations'.",
53
53
  },
54
+ {
55
+ name: 'keywords',
56
+ type: 'string[]',
57
+ description:
58
+ "Words a reader may search for that the title and sections do not use: a synonym, a task, or another library's name for the same thing. `astryx search` matches each as a keyword of the whole topic, so an exact one ranks the topic like its own title does.",
59
+ example: "['dark mode', 'color scheme']",
60
+ },
54
61
  {
55
62
  name: 'replaces',
56
63
  type: 'string',
@@ -127,6 +127,11 @@ export interface ReferenceDoc extends AuthoredDocGraphFields {
127
127
  description: string;
128
128
  /** Navigation category: 'guide' or 'foundations'. */
129
129
  category?: string;
130
+ /** Words a reader may search for that the title and sections do not use:
131
+ * a synonym, a task ("dark mode"), or another library's name for the same
132
+ * thing. `astryx search` matches each as a keyword of the whole topic, so
133
+ * an exact one ranks the topic like its own title does. */
134
+ keywords?: string[];
130
135
  /** Name of an existing topic this doc takes the place of. Authored by an
131
136
  * integration whose guide should be served instead of the built-in one —
132
137
  * `replaces: 'getting-started'` on a doc named `getting-started` swaps the
@@ -49,7 +49,7 @@ export const doc = {
49
49
  name: 'namespace',
50
50
  type: 'string',
51
51
  description:
52
- "The group that reads this doc: 'authoring' for a file an author writes (a section of `astryx docs authoring`), or 'cli/api' for a shape the CLI returns (the docs tree adopts it by kind, as the leaf `cli/api/schemas/<name>`). Every schema doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
52
+ "The group that reads this doc: 'authoring' for a file an author writes (a section of {@link generic:authoring}), or 'cli/api' for a shape the CLI returns (the docs tree adopts it by kind, as the leaf `cli/api/schemas/<name>`). Every schema doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
53
53
  },
54
54
  {
55
55
  name: 'aliases',
@@ -162,7 +162,7 @@ export const doc = {
162
162
  type: '{ dir: string }',
163
163
  description: 'Where component sources live.',
164
164
  fields: [
165
- {name: 'components.dir', type: 'string', description: 'Glob root for XDS*.tsx files.', required: true},
165
+ {name: 'components.dir', type: 'string', description: 'Glob root for Acme*.tsx files.', required: true},
166
166
  ],
167
167
  },
168
168
  ],
@@ -56,7 +56,7 @@ export const doc = {
56
56
  name: 'replaces',
57
57
  type: 'string',
58
58
  description:
59
- "Integration templates only: the exact id of the Core template this one replaces for unqualified lookup. Find it with `astryx --json template --list --package @astryxdesign/core`; the Core original stays selectable with `--package @astryxdesign/core`. A page replaces only a Core page and a block only a Core block. Needs @astryxdesign/cli 0.7.0 or later: earlier CLIs reject the field and withhold the package's templates and doc topics.",
59
+ "Integration templates only: the exact id of the Core template this one replaces for unqualified lookup. Find it with `astryx --json template --list --package @astryxdesign/core`; the Core original stays selectable with `--package @astryxdesign/core`. A page replaces only a Core page and a block only a Core block. Needs @astryxdesign/cli 0.7.0 or later: earlier CLIs reject the field, drop that template, and hide the package's doc topics.",
60
60
  },
61
61
  {
62
62
  name: 'isReady',
@@ -33,8 +33,8 @@ export interface BaseTemplateDoc extends AuthoredDocGraphFields {
33
33
  * replaces for unqualified lookup (find it with
34
34
  * `astryx --json template --list --package @astryxdesign/core`). The Core
35
35
  * original stays selectable with `--package @astryxdesign/core`. Needs
36
- * `@astryxdesign/cli` 0.7.0 or later: earlier CLIs reject the field and
37
- * withhold the package's templates and doc topics. */
36
+ * `@astryxdesign/cli` 0.7.0 or later: earlier CLIs reject the field,
37
+ * drop that template, and hide the package's doc topics. */
38
38
  replaces?: string;
39
39
  /** Whether this template is ready for use. Templates with
40
40
  * isReady: false show as "(WIP)" in the gallery and CLI. */
@@ -3,6 +3,7 @@
3
3
 
4
4
  export { parseConfig } from "./config/parse.mjs";
5
5
  export { parseIntegration } from "./integration/parse.mjs";
6
+ export { parseDiscoverCatalog } from "./discover/parse.mjs";
6
7
  export { parseCodemod } from "./codemod/parse.mjs";
7
8
  export { parseDebugEvent } from "./debug/parse.mjs";
8
9
  export { parseDoc } from "./doctypes/parse.mjs";
@@ -44,6 +44,15 @@ export type {
44
44
  GapReportTarget,
45
45
  GapReportHandlerReceipt,
46
46
  } from './gap-report/type.js'; // gap-report handler contract
47
+ export type {
48
+ DiscoverSource,
49
+ DiscoverSourceContext,
50
+ DiscoverCatalog,
51
+ DiscoverPackage,
52
+ DiscoverVersion,
53
+ DiscoverContribution,
54
+ DiscoverKind,
55
+ } from './discover/type.js'; // discover source contract
47
56
  export type {AstryxCodemod, AstryxConfigCodemod} from './codemod/type.js'; // codemods/*
48
57
 
49
58
  // ═══════════════════════════════════════════════════════════════════════
@@ -67,6 +76,7 @@ export {
67
76
  parseGapReportHandler,
68
77
  parseGapReportReceipt,
69
78
  } from './gap-report/parse.mjs';
79
+ export {parseDiscoverCatalog} from './discover/parse.mjs';
70
80
  export {parseCodemod} from './codemod/parse.mjs';
71
81
  export {parseDebugEvent} from './debug/parse.mjs';
72
82
 
@@ -20,6 +20,7 @@ export {
20
20
  parseGapReportHandler,
21
21
  parseGapReportReceipt,
22
22
  } from './gap-report/parse.mjs';
23
+ export {parseDiscoverCatalog} from './discover/parse.mjs';
23
24
  export {parseCodemod} from './codemod/parse.mjs';
24
25
  export {parseDebugEvent} from './debug/parse.mjs';
25
26
  export {parseDoc} from './doctypes/parse.mjs';
@@ -23,48 +23,49 @@ export const doc = {
23
23
  name: 'providerId',
24
24
  type: 'string',
25
25
  description:
26
- 'Stable logical provider ID. Omit to use package.json#name; set it to the prior package name only when an explicit rename must preserve artifact IDs. If two packages claim the same ID, the package being authored is used, otherwise the first-loaded one, and the CLI warns about the other.',
26
+ 'The name that marks this package as the source of everything it contributes. Leave it out to use the package name from package.json. Set it to the old name only during a rename, so the IDs of what the package already contributed stay the same. If two packages use the same name here, the one you are working on wins; otherwise the one the CLI reads first wins, and the CLI warns about the other.',
27
27
  example: "'@acme/widgets'",
28
28
  },
29
29
  {
30
30
  name: 'components',
31
31
  type: 'string',
32
32
  description:
33
- 'Relative path to the components/docs root (resolved to absolute).',
33
+ 'The folder that holds your components and their docs, relative to package.json.',
34
34
  example: "'./src/components'",
35
35
  },
36
36
  {
37
37
  name: 'templates',
38
38
  type: 'string',
39
39
  description:
40
- 'Relative path to the templates root (resolved to absolute).',
40
+ 'The folder that holds your templates, relative to package.json.',
41
41
  example: "'./src/templates'",
42
42
  },
43
43
  {
44
44
  name: 'codemods',
45
45
  type: 'string',
46
- description: 'Relative path to the codemods root (resolved to absolute).',
46
+ description:
47
+ 'The folder that holds your codemods, relative to package.json.',
47
48
  example: "'./codemods'",
48
49
  },
49
50
  {
50
51
  name: 'docs',
51
52
  type: 'string',
52
53
  description:
53
- 'Relative path to the reference-docs (topics) root (resolved to absolute). Every {topic}.doc.{ts,mjs,js} under it is served by `astryx docs` beside the built-in topics; a topic may also declare `replaces` or `extends` to take the place of a built-in one or merge onto it.',
54
+ 'The folder that holds your doc topics, relative to package.json. Every {topic}.doc.{ts,mjs,js} in it shows up in `astryx docs` next to the built-in topics; a topic can also set `replaces` or `extends` to take over a built-in topic or add to it.',
54
55
  example: "'./docs'",
55
56
  },
56
57
  {
57
58
  name: 'themes',
58
59
  type: 'string',
59
60
  description:
60
- 'Relative path to a source-theme root with one directory per theme slug. Each directory contains a source module and mandatory same-stem, strongly typed .doc.mjs descriptor. Installed themes appear in `astryx theme list` and can be copied with `astryx theme add`.',
61
+ 'The folder that holds your themes, relative to package.json, with one folder per theme. Each theme folder has the theme source and a matching .doc.mjs file with the same name. Installed themes show up in `astryx theme list` and can be copied with `astryx theme add`.',
61
62
  example: "'./themes'",
62
63
  },
63
64
  {
64
65
  name: 'agentDocs',
65
66
  type: '{ append?: readonly string[] }',
66
67
  description:
67
- 'Static package guidance appended to the end of the managed agent block. The CLI owns the section heading, package labels, bullets, target files, and writes.',
68
+ 'Lines of guidance your package adds to the end of the agent instructions the CLI manages. The CLI owns the heading, labels, bullets, and which files it writes.',
68
69
  example: "{ append: ['Run acme verify.'] }",
69
70
  },
70
71
  {
@@ -94,9 +95,10 @@ export const doc = {
94
95
  {
95
96
  type: 'prose',
96
97
  text:
97
- 'Provider identity defaults to package.json#name. During an explicit ' +
98
- 'package rename, set `providerId` to the prior canonical package name so ' +
99
- 'existing artifact IDs remain stable. Package version always comes from package.json.',
98
+ 'The provider name defaults to the package name in package.json. ' +
99
+ 'During a rename, set `providerId` to the old package name so the IDs ' +
100
+ 'of what the package already contributed stay the same. The package ' +
101
+ 'version always comes from package.json.',
100
102
  },
101
103
  {
102
104
  type: 'prose',