@astryxdesign/cli 0.7.2-canary.ebcc404 → 0.7.2-canary.f2b60a0

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 (205) hide show
  1. package/README.md +15 -14
  2. package/api/build/help/help.mjs +1 -1
  3. package/api/component/_adapter.d.mts +14 -0
  4. package/api/component/_adapter.mjs +48 -0
  5. package/api/component/component.mjs +10 -2
  6. package/api/component/integration-export-name.test.mjs +233 -8
  7. package/api/docs/_adapter.d.mts +11 -0
  8. package/api/docs/_adapter.mjs +244 -1
  9. package/api/docs/integrationDocs.test.mjs +124 -0
  10. package/api/doctor/doctor.mjs +27 -3
  11. package/api/doctor/doctor.test.mjs +43 -0
  12. package/api/doctor/theme-checks.mjs +1 -1
  13. package/api/gap-report/gap-report.mjs +2 -1
  14. package/api/index.d.mts +2 -0
  15. package/api/index.mjs +2 -0
  16. package/api/init/run/run.mjs +2 -2
  17. package/api/integration/_adapter.d.mts +12 -0
  18. package/api/integration/_adapter.mjs +54 -0
  19. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  20. package/api/integration/add-contribution.mjs +8 -4
  21. package/api/integration/add-contribution.test.mjs +4 -2
  22. package/api/integration/authoring-checks.mjs +11 -2
  23. package/api/integration/authoring-checks.test.mjs +39 -0
  24. package/api/integration/authoring-checks.type.d.mts +9 -0
  25. package/api/integration/authoring-checks.type.mjs +14 -1
  26. package/api/integration/check/check.d.mts +96 -0
  27. package/api/integration/check/check.mjs +357 -0
  28. package/api/integration/check/check.test.mjs +489 -0
  29. package/api/integration/integration-check.type.d.mts +118 -0
  30. package/api/integration/integration-check.type.mjs +84 -0
  31. package/api/integration/integrationCheck.doc.d.mts +10 -0
  32. package/api/integration/integrationCheck.doc.mjs +73 -0
  33. package/api/integration/integrationComponentConflicts.doc.mjs +36 -5
  34. package/api/integration/pack-check.mjs +48 -3
  35. package/api/integration/pack-check.test.mjs +247 -0
  36. package/api/integration/validate-integration.mjs +8 -0
  37. package/api/integration/validate-integration.test.mjs +11 -0
  38. package/api/integration/validate-integration.type.d.mts +8 -0
  39. package/api/integration/validate-integration.type.mjs +12 -1
  40. package/api/integration/validateIntegration.doc.mjs +17 -3
  41. package/api/search/search.d.mts +13 -6
  42. package/api/search/search.domain-priority.test.mjs +108 -18
  43. package/api/search/search.integration-check.test.mjs +24 -0
  44. package/api/search/search.mjs +53 -17
  45. package/api/theme/build/build.family.test.mjs +54 -6
  46. package/api/theme/build/build.mjs +114 -17
  47. package/api/theme/themeBuild.doc.mjs +4 -4
  48. package/assets/docs/README.md +10 -0
  49. package/assets/docs/author-a-theme.doc.mjs +1 -1
  50. package/assets/docs/getting-started.doc.mjs +3 -3
  51. package/assets/docs/styling-overview.doc.mjs +1 -1
  52. package/assets/docs/theme.doc.dense.mjs +1 -1
  53. package/assets/docs/theme.doc.mjs +1 -1
  54. package/assets/docs/theme.doc.zh.mjs +1 -1
  55. package/assets/docs/tree/add-a-component.doc.mjs +11 -1
  56. package/assets/docs/tree/add-a-theme.doc.mjs +1 -1
  57. package/assets/docs/tree/add-a-topic.doc.mjs +10 -7
  58. package/assets/docs/tree/agent-guidance.doc.mjs +2 -2
  59. package/assets/docs/tree/block-template.doc.mjs +8 -20
  60. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  61. package/assets/docs/tree/check-the-props.doc.mjs +196 -0
  62. package/assets/docs/tree/check-your-docs.doc.mjs +51 -5
  63. package/assets/docs/tree/checks.doc.mjs +24 -16
  64. package/assets/docs/tree/codemods.doc.mjs +4 -4
  65. package/assets/docs/tree/component-family.doc.mjs +8 -6
  66. package/assets/docs/tree/component-imports.doc.mjs +3 -3
  67. package/assets/docs/tree/components.doc.mjs +1 -1
  68. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +7 -18
  69. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  70. package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
  71. package/assets/docs/tree/docs.doc.mjs +3 -3
  72. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  73. package/assets/docs/tree/document-the-theme.doc.mjs +1 -1
  74. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  75. package/assets/docs/tree/extend-or-replace.doc.mjs +6 -6
  76. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  77. package/assets/docs/tree/generate-a-palette.doc.mjs +5 -3
  78. package/assets/docs/tree/grade-template-with-agent.doc.mjs +1 -1
  79. package/assets/docs/tree/integrations.doc.mjs +8 -0
  80. package/assets/docs/tree/links.doc.mjs +6 -5
  81. package/assets/docs/tree/migration-setup.doc.mjs +1 -0
  82. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  83. package/assets/docs/tree/migration.doc.mjs +0 -1
  84. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  85. package/assets/docs/tree/page-template.doc.mjs +4 -8
  86. package/assets/docs/tree/publishing.doc.mjs +1 -1
  87. package/assets/docs/tree/quick-start.doc.mjs +37 -21
  88. package/assets/docs/tree/replace-a-core-component.doc.mjs +4 -6
  89. package/assets/docs/tree/replace-a-core-template.doc.mjs +6 -8
  90. package/assets/docs/tree/sections-and-placement.doc.mjs +4 -6
  91. package/assets/docs/tree/see-it-in-an-app.doc.mjs +4 -2
  92. package/assets/docs/tree/short-and-findable.doc.mjs +6 -5
  93. package/assets/docs/tree/single-component.doc.mjs +15 -6
  94. package/assets/docs/tree/start-a-template.doc.mjs +3 -3
  95. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  96. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  97. package/assets/docs/tree/template-doc-overview.doc.mjs +4 -15
  98. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  99. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  100. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  101. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  102. package/assets/docs/tree/templates.doc.mjs +1 -1
  103. package/assets/docs/tree/test-in-an-app.doc.mjs +3 -3
  104. package/assets/docs/tree/test-template-in-app.doc.mjs +1 -1
  105. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  106. package/assets/docs/tree/troubleshooting.doc.mjs +13 -5
  107. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  108. package/assets/docs/tree/upgrading.doc.mjs +3 -3
  109. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +3 -1
  110. package/assets/docs/tree/verify-packed-template.doc.mjs +1 -1
  111. package/assets/docs/tree/versioning.doc.mjs +7 -6
  112. package/assets/docs/tree/write-the-template-file.doc.mjs +4 -3
  113. package/assets/docs/use-a-theme.doc.mjs +2 -2
  114. package/assets/theme.template.ts +1 -1
  115. package/authoring/codemod/codemod.doc.mjs +7 -3
  116. package/authoring/config/config.doc.mjs +9 -6
  117. package/authoring/config/type.ts +4 -2
  118. package/authoring/discover/discover.doc.mjs +1 -1
  119. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  120. package/authoring/doctypes/command/command.doc.mjs +14 -12
  121. package/authoring/doctypes/component/component.doc.mjs +29 -26
  122. package/authoring/doctypes/component/type.ts +7 -5
  123. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  124. package/authoring/doctypes/function/function.doc.mjs +9 -8
  125. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  126. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  127. package/authoring/doctypes/reference/reference.doc.mjs +11 -10
  128. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  129. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  130. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  131. package/authoring/doctypes/template/parse.d.mts +6 -2
  132. package/authoring/doctypes/template/parse.mjs +3 -1
  133. package/authoring/doctypes/template/template.doc.mjs +3 -3
  134. package/authoring/doctypes/template/type.ts +22 -0
  135. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  136. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  137. package/authoring/identity/identity.doc.mjs +3 -3
  138. package/authoring/index.d.ts +1 -0
  139. package/authoring/integration/integration.doc.mjs +12 -4
  140. package/authoring/integration/parse.test.mjs +10 -0
  141. package/authoring/integration/schema.d.mts +2 -0
  142. package/authoring/integration/schema.mjs +1 -0
  143. package/authoring/integration/type.ts +4 -0
  144. package/clients/cli/commands/build-theme.batch-report.test.mjs +3 -1
  145. package/clients/cli/commands/build-theme.mjs +1 -1
  146. package/clients/cli/commands/build-theme.path-safety.test.mjs +155 -21
  147. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  148. package/clients/cli/commands/doctor-integration-components.doc.mjs +15 -4
  149. package/clients/cli/commands/doctor-integration-validate.doc.mjs +11 -2
  150. package/clients/cli/commands/doctor-integration.test.mjs +837 -0
  151. package/clients/cli/commands/doctor.mjs +190 -0
  152. package/clients/cli/commands/integration-check.doc.mjs +85 -0
  153. package/clients/cli/commands/integration-check.test.mjs +267 -0
  154. package/clients/cli/commands/integration.doc.mjs +6 -2
  155. package/clients/cli/commands/integration.mjs +107 -1
  156. package/clients/cli/commands/setup-nudge.test.mjs +79 -1
  157. package/clients/cli/commands/swizzle.mjs +5 -3
  158. package/clients/cli/commands/swizzle.routing.test.mjs +18 -1
  159. package/clients/cli/commands/text-json-parity.test.mjs +5 -0
  160. package/clients/cli/commands/theme-build.doc.mjs +2 -2
  161. package/clients/cli/index.mjs +30 -5
  162. package/foundation/agent-docs/agent-doc-state.d.mts +14 -0
  163. package/foundation/agent-docs/agent-doc-state.mjs +38 -0
  164. package/foundation/agent-docs/agent-docs.d.mts +2 -1
  165. package/foundation/agent-docs/agent-docs.mjs +8 -6
  166. package/foundation/config/project.mjs +82 -0
  167. package/foundation/discovery/authoring-self-docs.mjs +2 -1
  168. package/foundation/discovery/component-discovery.d.mts +108 -17
  169. package/foundation/discovery/component-discovery.export-names.test.mjs +469 -2
  170. package/foundation/discovery/component-discovery.mjs +380 -47
  171. package/foundation/discovery/component-replacement.test.mjs +20 -0
  172. package/foundation/discovery/doc-types.d.mts +157 -0
  173. package/foundation/discovery/doc-types.mjs +1224 -0
  174. package/foundation/discovery/doc-types.test.mjs +652 -0
  175. package/foundation/discovery/docs-discovery.d.mts +81 -0
  176. package/foundation/discovery/docs-discovery.mjs +57 -0
  177. package/foundation/discovery/integration-doc-files.d.mts +22 -0
  178. package/foundation/discovery/integration-doc-files.mjs +231 -0
  179. package/foundation/discovery/integration-doc-files.test.mjs +246 -0
  180. package/foundation/discovery/module-exports.d.mts +6 -0
  181. package/foundation/discovery/module-exports.mjs +15 -2
  182. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  183. package/foundation/discovery/package-tsconfig.mjs +228 -0
  184. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  185. package/foundation/discovery/project-typescript.d.mts +23 -0
  186. package/foundation/discovery/project-typescript.mjs +61 -0
  187. package/foundation/discovery/prop-drift.d.mts +278 -0
  188. package/foundation/discovery/prop-drift.mjs +2263 -0
  189. package/foundation/discovery/prop-drift.test.mjs +2219 -0
  190. package/foundation/discovery/type-match.d.mts +53 -0
  191. package/foundation/discovery/type-match.mjs +660 -0
  192. package/foundation/discovery/type-match.test.mjs +169 -0
  193. package/foundation/discovery/type-text.d.mts +68 -0
  194. package/foundation/discovery/type-text.mjs +658 -0
  195. package/foundation/discovery/type-text.test.mjs +196 -0
  196. package/foundation/discovery/unresolved-references.d.mts +62 -0
  197. package/foundation/discovery/unresolved-references.mjs +790 -0
  198. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  199. package/foundation/doc-compiler/doc-loads.test.mjs +6 -0
  200. package/foundation/doc-compiler/links.d.mts +9 -5
  201. package/foundation/doc-compiler/links.mjs +4 -2
  202. package/foundation/integrations/contribution-inventory.mjs +6 -1
  203. package/foundation/response/response-types.doc.mjs +7 -2
  204. package/package.json +9 -9
  205. package/scripts/postinstall.mjs +3 -3
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/troubleshooting`: the messages the CLI
4
+ * @file `astryx docs cli/integrations/help/troubleshooting`: the messages the CLI
5
5
  * prints while you build, verify, and install an integration, and the fix
6
6
  * for each.
7
7
  */
@@ -67,7 +67,7 @@ export const docs = {
67
67
  rows: [
68
68
  [
69
69
  '`component_export_missing`: `Component "AcmeCarousel" advertises import "@acme/astryx-widgets/components/AcmeCarousel", but that packed module does not export "AcmeCarousel".`',
70
- "package.json has no `exports` map, or the module does not export the name. Keep `export function AcmeCarousel`, and add the entry: `npm pkg set 'exports[./components/AcmeCarousel]=./components/AcmeCarousel.tsx'`.",
70
+ "package.json has no `exports` map, or the module does not export the name. Keep `export function AcmeCarousel`, and add the entry: `npm pkg set 'exports[./components/AcmeCarousel]=./components/AcmeCarousel.tsx'`. When the quoted name is a file name, such as `acme-carousel`, set the doc's `name` to the component the file exports. A type-only export does not count.",
71
71
  ],
72
72
  [
73
73
  '`template_export_missing`: `Template "acme-dashboard" public import "@acme/astryx-widgets/templates/acme-dashboard" does not have a default export.`',
@@ -103,11 +103,11 @@ export const docs = {
103
103
  ],
104
104
  [
105
105
  '`themes_need_cli`: The package ships a theme but declares no @astryxdesign/cli peer.',
106
- "Run `npm pkg set 'peerDependencies.@astryxdesign/cli=>=0.6.4'` and `npm pkg set 'peerDependenciesMeta.@astryxdesign/cli.optional=true' --json`. A stable CLI before 0.6.4 cannot read typed theme descriptors, so it drops your themes and can hide your doc topics.",
106
+ "Run `npm pkg set 'peerDependencies.@astryxdesign/cli=>=0.6.4'` and `npm pkg set 'peerDependenciesMeta.@astryxdesign/cli.optional=true' --json`. A CLI older than published 0.6.4 cannot read typed theme descriptors, so it drops your themes and can hide your doc topics.",
107
107
  ],
108
108
  [
109
109
  '`section_ids_need_cli`: The package has a doc section that sets `id` but declares no @astryxdesign/cli peer.',
110
- 'The same fix as `themes_need_cli`, or drop the section `id`s: a stable CLI before 0.6.4 rejects them and hides your doc topics.',
110
+ 'The same fix as `themes_need_cli`, or drop the section `id`s: a CLI older than published 0.6.4 rejects them and hides your doc topics.',
111
111
  ],
112
112
  ],
113
113
  },
@@ -125,6 +125,14 @@ export const docs = {
125
125
  type: 'table',
126
126
  headers: ['Symptom', 'Fix'],
127
127
  rows: [
128
+ [
129
+ '`Error: No component named "AcmeCarousel"` for a component your package documents.',
130
+ "Its doc still names its file. Set `name` to the export, such as `name: 'AcmeCarousel'` in `acme-carousel.doc.mjs`. A family member is listed only when the module its family doc imports exports it ({@link generic:component-family}).",
131
+ ],
132
+ [
133
+ '`npx astryx component Dialog` opens Core\'s `Dialog`, not yours.',
134
+ "A name that Core, a legacy docs package, or another package's file already has stays theirs. Run `npx astryx component Dialog --package @acme/astryx-widgets`, or give your component a name of its own.",
135
+ ],
128
136
  [
129
137
  '`Error: Template "dashboard" is ambiguous — narrow it with --type and/or --package.`',
130
138
  "Your template id matches a Core id. Rename it, such as `acme-dashboard`, or set `replaces: 'dashboard'` to take its place. `npx astryx doctor integration templates` warns about this before you publish.",
@@ -143,7 +151,7 @@ export const docs = {
143
151
  ],
144
152
  [
145
153
  'Your docs section, templates, or themes are missing only in some apps',
146
- 'Those apps run a CLI too old to read them: a stable CLI before 0.6.6 for a template that sets `keywords`, or before 0.6.4 for a template that sets `replaces`, a docs section, or a theme. Update `@astryxdesign/cli` there, and keep your optional `@astryxdesign/cli` peer so npm warns about an old CLI.',
154
+ "Those apps run a CLI too old to read them: a stable CLI before 0.6.6 for a template that sets `keywords`, or before 0.6.4 for a template that sets `replaces`, a docs section, or a theme. Update `@astryxdesign/cli` there, and keep your optional `@astryxdesign/cli` peer so npm checks the app's CLI against it when the app installs your package.",
147
155
  ],
148
156
  ],
149
157
  },
@@ -76,7 +76,7 @@ export const docs = {
76
76
  type: 'code',
77
77
  lang: 'tsx',
78
78
  label: 'Heading for document structure',
79
- code: `import {Heading} from '@astryxdesign/core';
79
+ code: `import {Heading} from '@astryxdesign/core/Heading';
80
80
 
81
81
  // Heading levels map to semantic tokens: level 1 → --text-heading-1-*
82
82
  <Heading level={1}>Page Title</Heading>
@@ -96,7 +96,7 @@ export const docs = {
96
96
  type: 'code',
97
97
  lang: 'tsx',
98
98
  label: 'Text for body, label, and display text',
99
- code: `import {Text} from '@astryxdesign/core';
99
+ code: `import {Text} from '@astryxdesign/core/Text';
100
100
 
101
101
  <Text type="body">Body text at the base scale.</Text>
102
102
  <Text type="large">Emphasized body text.</Text>
@@ -121,7 +121,7 @@ export const docs = {
121
121
  type: 'code',
122
122
  lang: 'tsx',
123
123
  label: 'Customizing the type scale via defineTheme',
124
- code: `import {defineTheme} from '@astryxdesign/core';
124
+ code: `import {defineTheme} from '@astryxdesign/core/theme';
125
125
 
126
126
  // Adjust the entire ramp holistically with base and ratio
127
127
  const editorialTheme = defineTheme({
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/upgrading`: update an integration
4
+ * @file `astryx docs cli/integrations/ship/upgrading`: update an integration
5
5
  * package for each Astryx release, and the command apps run to upgrade with
6
6
  * it.
7
7
  */
@@ -57,7 +57,7 @@ export const docs = {
57
57
  {
58
58
  type: 'code',
59
59
  lang: 'text',
60
- code: 'Integrations: @acme/astryx-widgets\n1 codemod to run\nApplying integration codemods...\n Rename AcmeCarousel delay to interval (v0.7.0, @acme/astryx-widgets)\n[ok] [ok] src/Hero.tsx',
60
+ code: 'Integrations: @acme/astryx-widgets\n<n> codemods to run\nApplying integration codemods...\n Rename AcmeCarousel delay to interval (v0.7.0, @acme/astryx-widgets)\n[ok] [ok] src/Hero.tsx',
61
61
  },
62
62
  {
63
63
  type: 'list',
@@ -65,7 +65,7 @@ export const docs = {
65
65
  items: [
66
66
  '`--from` is the `@astryxdesign/core` version the app had before, and the target is the installed Core.',
67
67
  '`--integration` names your package. Without it, or an `integrations` entry in `astryx.config`, the upgrade skips your codemods, even when the app has your package installed.',
68
- "The count includes Core's codemods for the same versions, which run first.",
68
+ "`<n>` includes Core's codemods for the same versions, which run first.",
69
69
  'Put this command in your release notes.',
70
70
  ],
71
71
  },
@@ -34,7 +34,9 @@ export const docs = {
34
34
  code: `import {Theme} from '@astryxdesign/core/theme';
35
35
  import {themes, defaultThemeSlug} from './astryx-themes';
36
36
 
37
- <Theme theme={themes[defaultThemeSlug]}>{/* app */}</Theme>`,
37
+ <Theme theme={themes[defaultThemeSlug]}>
38
+ <App />
39
+ </Theme>`,
38
40
  },
39
41
  {
40
42
  type: 'prose',
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/templates/build-the-template/package-and-test/verify-packed-template`:
4
+ * @file `astryx docs cli/integrations/building-blocks/templates/build-the-template/package-and-test/verify-packed-template`:
5
5
  * what `integration verify` checks for templates, and what it leaves to the
6
6
  * app test.
7
7
  */
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/versioning`: version an integration
4
+ * @file `astryx docs cli/integrations/ship/versioning`: version an integration
5
5
  * package, know which changes break apps, declare peer ranges, keep apps on
6
6
  * older CLIs working, and match codemod folders to versions.
7
7
  */
@@ -106,8 +106,8 @@ export const docs = {
106
106
  ],
107
107
  [
108
108
  '`@astryxdesign/cli`',
109
- 'You ship a docs section, a placed guide, a template that sets `replaces` or `keywords`, a doc section with an `id`, or a theme',
110
- '`>=0.6.6` when you ship a template that sets `keywords`, otherwise `>=0.6.4`. Optional in `peerDependenciesMeta`',
109
+ 'You ship a docs section, a placed guide, a template that sets `replaces` or `keywords`, a component that sets `replaces`, a doc section with an `id`, or a theme',
110
+ '`>=0.6.6` when you ship a template that sets `keywords`, `>=0.6.7` when a component sets `replaces`, otherwise `>=0.6.4`. Optional in `peerDependenciesMeta`',
111
111
  ],
112
112
  ],
113
113
  },
@@ -136,10 +136,11 @@ export const docs = {
136
136
  items: [
137
137
  'An unknown field in `astryx.integration.mjs` is ignored with an `unknown_manifest_key` warning, and the rest of the manifest still loads.',
138
138
  'A named export that the CLI does not know is ignored with no warning, so `debug` and `gapReport` are safe to add.',
139
- 'A stable CLI before 0.7.0 prints each `{@link ...}` as written.',
139
+ 'Published 0.6.3 and earlier print each `{@link ...}` as written.',
140
140
  'Published 0.6.3 and earlier reject a template that sets `replaces` or `keywords`, drop that template, and hide every doc topic your package ships. Published 0.6.4 and 0.6.5 still drop a template that sets `keywords`.',
141
- 'A stable CLI before 0.6.4 cannot read a docs section, a section `id`, or a theme folder that `integration add theme` writes. It can then hide every doc topic your package ships.',
142
- 'Stable 0.6.3 still loads your components, but 0.6.0 cannot read the component docs that `integration add component` writes: `component AcmeCarousel` fails there.',
141
+ 'Published 0.6.3 and earlier cannot read a docs section, a section `id`, or a theme folder that `integration add theme` writes. They can then hide every doc topic your package ships.',
142
+ 'Published 0.6.2 and 0.6.3 still load your components, but published 0.6.0 and 0.6.1 cannot read the component docs that `integration add component` writes: `component AcmeCarousel` fails there.',
143
+ 'An app on an older CLI lists a component whose doc names another export of its file under the file name, and lists no family members, so `component AcmeCarousel` fails there.',
143
144
  ],
144
145
  },
145
146
  {
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/templates/build-the-template/write-the-template-file`:
4
+ * @file `astryx docs cli/integrations/building-blocks/templates/build-the-template/write-the-template-file`:
5
5
  * what gets copied, where the copied file lands, and the imports and
6
6
  * export a copied template needs.
7
7
  */
@@ -91,8 +91,9 @@ npx astryx template acme-stat-card src/features/account/StatusCard.tsx`,
91
91
  lang: 'tsx',
92
92
  code: `import {Button} from '@astryxdesign/core/Button';
93
93
  import {Card} from '@astryxdesign/core/Card';
94
- import {HStack, VStack} from '@astryxdesign/core/Stack';
94
+ import {HStack} from '@astryxdesign/core/HStack';
95
95
  import {Text} from '@astryxdesign/core/Text';
96
+ import {VStack} from '@astryxdesign/core/VStack';
96
97
  import {AcmeStatusCard} from '@acme/astryx-widgets/components/AcmeStatusCard';
97
98
 
98
99
  const metrics = [
@@ -144,7 +145,7 @@ export default function AcmeAccountSummary() {
144
145
  type: 'list',
145
146
  style: 'unordered',
146
147
  items: [
147
- 'Add `use client` as the first statement only when hooks, event handlers, or browser APIs need a client boundary.',
148
+ 'Add `use client` as the first statement only when hooks, event handlers, browser APIs, or a component passed as a prop, such as `icon={BellIcon}`, need a client boundary.',
148
149
  'Keep a static template server-compatible when it needs no client behavior.',
149
150
  ],
150
151
  },
@@ -25,13 +25,13 @@ export const docs = {
25
25
  type: 'code',
26
26
  lang: 'tsx',
27
27
  label: 'Wire the generated module once',
28
- code: "import {Theme} from '@astryxdesign/core';\nimport {themes, defaultThemeSlug} from './astryx-themes';\n\nfunction App() {\n return (\n <Theme theme={themes[defaultThemeSlug]}>\n <YourApp />\n </Theme>\n );\n}",
28
+ code: "import {Theme} from '@astryxdesign/core/theme';\nimport {themes, defaultThemeSlug} from './astryx-themes';\n\nfunction App() {\n return (\n <Theme theme={themes[defaultThemeSlug]}>\n <YourApp />\n </Theme>\n );\n}",
29
29
  },
30
30
  {
31
31
  type: 'code',
32
32
  lang: 'tsx',
33
33
  label: 'Switch among added themes',
34
- code: "import {useState} from 'react';\nimport {Theme} from '@astryxdesign/core';\nimport {themes, type ThemeSlug} from './astryx-themes';\n\nconst [slug, setSlug] = useState<ThemeSlug>('neutral');\nconst app = <Theme theme={themes[slug]}><YourApp /></Theme>;",
34
+ code: "import {useState} from 'react';\nimport {Theme} from '@astryxdesign/core/theme';\nimport {themes, type ThemeSlug} from './astryx-themes';\n\nconst [slug, setSlug] = useState<ThemeSlug>('neutral');\nconst app = <Theme theme={themes[slug]}><YourApp /></Theme>;",
35
35
  },
36
36
  {
37
37
  type: 'prose',
@@ -18,7 +18,7 @@
18
18
  *
19
19
  * 1. WRAP THE APP. A theme does nothing until it is provided.
20
20
  *
21
- * import {Theme} from '@astryxdesign/core';
21
+ * import {Theme} from '@astryxdesign/core/theme';
22
22
  * import {myTheme} from './theme';
23
23
  *
24
24
  * <Theme theme={myTheme} mode="system"> // 'system' | 'light' | 'dark'
@@ -17,7 +17,8 @@ export const doc = {
17
17
  'A codemod module the CLI runs during `astryx upgrade`. Default-export a ' +
18
18
  "plain object with a `type` discriminant: 'code' rewrites source files, " +
19
19
  "'config' rewrites the astryx.config.* file. There is no factory to call.",
20
- appliesTo: 'the codemods/ dir of an integration',
20
+ appliesTo:
21
+ '`<codemods>/<version>/<id>.{ts,mjs,js}` in an integration package: `<codemods>` is the codemods root of astryx.integration.*, and `<version>` is the exact @astryxdesign/core version (such as 0.7.0) whose upgrade runs the codemod. A file directly in the root never runs.',
21
22
  fields: [
22
23
  {
23
24
  name: 'title',
@@ -44,6 +45,7 @@ export const doc = {
44
45
  description:
45
46
  'File extensions this codemod applies to. Code codemods only; a ' +
46
47
  'config codemod always targets astryx.config.*.',
48
+ default: "['.tsx', '.ts', '.jsx', '.js', '.mjs', '.cjs']",
47
49
  example: "['.tsx', '.ts']",
48
50
  },
49
51
  {
@@ -58,6 +60,7 @@ export const doc = {
58
60
  name: 'file',
59
61
  type: 'AstryxCodemodFile',
60
62
  description: 'The source file presented to the transform.',
63
+ required: true,
61
64
  fields: [
62
65
  {
63
66
  name: 'file.path',
@@ -77,6 +80,7 @@ export const doc = {
77
80
  name: 'api',
78
81
  type: 'AstryxCodemodApi',
79
82
  description: 'Helpers and context passed as the second argument.',
83
+ required: true,
80
84
  fields: [
81
85
  {
82
86
  name: 'api.jscodeshift',
@@ -89,14 +93,14 @@ export const doc = {
89
93
  name: 'api.stats',
90
94
  type: '(...args: unknown[]) => void',
91
95
  description:
92
- 'Report a statistic (no-op-friendly; provided for jscodeshift parity).',
96
+ 'Accepted for jscodeshift parity. A call does nothing, and upgrade shows nothing for it.',
93
97
  required: true,
94
98
  },
95
99
  {
96
100
  name: 'api.report',
97
101
  type: '(...args: unknown[]) => void',
98
102
  description:
99
- 'Report progress (no-op-friendly; provided for jscodeshift parity).',
103
+ 'Accepted for jscodeshift parity. A call does nothing, and upgrade shows nothing for it.',
100
104
  required: true,
101
105
  },
102
106
  ],
@@ -15,8 +15,8 @@ export const doc = {
15
15
  description:
16
16
  'The optional astryx.config.* file at your project root. Declares which ' +
17
17
  'integrations to load, where to route issue links, post-codemod hooks, local ' +
18
- 'debug-log and gap-report handlers, and experimental layout components. All ' +
19
- 'optional; {} is valid.',
18
+ 'debug-log and gap-report handlers, a discover source, and experimental ' +
19
+ 'layout components. All optional; {} is valid.',
20
20
  appliesTo: 'astryx.config.{ts,mjs,js}',
21
21
  fields: [
22
22
  {
@@ -29,7 +29,9 @@ export const doc = {
29
29
  {
30
30
  name: 'issuesUrl',
31
31
  type: 'string',
32
- description: 'URL that "report an issue" affordances link to.',
32
+ description:
33
+ "Where reports about Core go: `astryx gap-report` routes a Core report here when no handler is loaded, gapReport handlers receive it as `report.target.issuesUrl`, and `astryx swizzle` prints it as the feedback link for a Core component. A report or swizzle for an integration's component uses that integration's own issuesUrl, never this one. An absolute URL; a value that is not a URL makes the config invalid.",
34
+ default: "'https://github.com/facebook/astryx/issues/new'",
33
35
  },
34
36
  {
35
37
  name: 'hooks',
@@ -40,7 +42,7 @@ export const doc = {
40
42
  name: 'hooks.postCodemod',
41
43
  type: 'PostCodemodHook[]',
42
44
  description:
43
- 'Commands run after an upgrade applies codemods (e.g. re-run your formatter). Each hook returns a command to execute, or null to skip.',
45
+ 'Commands to run after `astryx upgrade` changes files (e.g. re-run your formatter). Each hook is an object `{name?, buildCommand}`: buildCommand gets `{packageDir, files}` and returns `{command, args?, options?}` to run, or null to skip. A dry run prints each command instead of running it.',
44
46
  },
45
47
  ],
46
48
  },
@@ -77,7 +79,7 @@ export const doc = {
77
79
  name: 'experimental.xle.components',
78
80
  type: 'Record<string, XleComponent>',
79
81
  description:
80
- 'Custom components the layout expander (XLE) may emit, keyed by tag.',
82
+ 'Custom components for the removed layout expander, keyed by component name. The CLI still validates the field, so an entry without a string `from` makes `astryx.config` invalid, but nothing reads it.',
81
83
  },
82
84
  ],
83
85
  },
@@ -90,6 +92,7 @@ export const doc = {
90
92
  {
91
93
  label: 'Send every command run somewhere of your own',
92
94
  code:
95
+ "import {appendFileSync} from 'node:fs';\n\n" +
93
96
  'export default {\n' +
94
97
  ' debug: event => appendFileSync("runs.ndjson", JSON.stringify(event) + "\\n"),\n' +
95
98
  '};',
@@ -98,7 +101,7 @@ export const doc = {
98
101
  notes: [
99
102
  {
100
103
  type: 'prose',
101
- text: 'The config is validated at load with a strict schema: unknown keys are errors, so a typo fails fast rather than being silently ignored.',
104
+ text: 'The config is validated at load with a strict schema: an unknown key, a misspelled one included, or a value of the wrong type makes the whole file invalid. `astryx gap-report`, `astryx discover`, and `astryx upgrade` stop with the error, and `astryx doctor` fails its `config` check (exit 1). Reads such as `component`, `docs`, `search`, `template`, and `theme` carry on silently as if there were no config and no integrations, and no debug handler runs, so run `astryx doctor` after editing the file.',
102
105
  },
103
106
  ],
104
107
  };
@@ -115,8 +115,10 @@ export interface AstryxConfig {
115
115
  /** Experimental XLE (layout expression) configuration. */
116
116
  xle?: {
117
117
  /**
118
- * Register app-local components so XLE layout expressions can
119
- * reference them by name via {hint}. Keyed by component name.
118
+ * Custom components for the removed layout expander, keyed by
119
+ * component name. The CLI still validates the field, so an entry
120
+ * without a string `from` makes `astryx.config` invalid, but nothing
121
+ * reads it.
120
122
  */
121
123
  components?: Record<string, XleComponent>;
122
124
  };
@@ -16,7 +16,7 @@ export const doc = {
16
16
  displayName: 'DiscoverSource',
17
17
  namespace: 'authoring',
18
18
  description:
19
- 'A source for `astryx discover`: an async function that returns a catalog of packages a project could add, their versions, and what each version adds. Set it as `discover` in astryx.config, or export it as `discover` from an integration manifest. Discover calls every source, the project one first, and one that throws, runs past 30 seconds, or returns an invalid catalog never hides the others; discover then uses the last good answer it saved for that source. Discover only reads: it prints the command that adds a package and never runs it.',
19
+ 'A source for `astryx discover`: an async function that returns a catalog of packages a project could add, their versions, and what each version adds. Set it as `discover` in astryx.config, or export it as `discover` from an integration manifest. Discover calls every source, the project one first, and one that throws, runs past 30 seconds, or returns an invalid catalog never hides the others; discover then uses the last good answer that source gave for the same request, or reports the source as failed when it saved none. Discover only reads: it prints the command that adds a package and never runs it.',
20
20
  appliesTo:
21
21
  '`discover` in astryx.config.*, or the `discover` named export of astryx.integration.*',
22
22
  fields: [
@@ -12,14 +12,15 @@ export const doc = {
12
12
  displayName: 'Authored doc graph fields',
13
13
  namespace: 'authoring',
14
14
  description:
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
- appliesTo: 'Every supported .doc.mjs object',
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 and namespace doc, the CLI's and each integration's. Nothing reads `aliases` or `audience` today: a reference topic that sets one fails to load, placed in the docs tree or not, and other doc kinds accept them and ignore them.",
16
+ appliesTo:
17
+ "Every authored doc kind's .doc.mjs object. Theme descriptors take none of these fields.",
17
18
  fields: [
18
19
  {
19
20
  name: 'placement',
20
21
  type: 'DocPlacement',
21
22
  description:
22
- "Names the doc's one parent in the docs tree: a namespace of the same package, one of its slots, and an order. Read for every guide, the CLI's and each integration's: a guide with `placement` gets a route in the tree instead of a flat topic name, and cannot also `replaces` or `extends` a topic. In the CLI's own topic directory a topic that sets it fails to load: the CLI keeps its guides in its docs tree directory. Commands, API functions, schemas, and enums do not set it: the tree adopts each by its `namespace`.",
23
+ "Names the doc's one parent in the docs tree: a namespace of the same package, one of its slots, and an order. Read for every guide, the CLI's and each integration's, and for every namespace doc: a guide with `placement` gets a route in the tree instead of a flat topic name, and cannot also set `replaces` or `extends`; a namespace doc with `placement` nests under that parent. In the CLI's own topic directory a topic that sets it fails to load: the CLI keeps its guides in its docs tree directory. Commands, API functions, schemas, and enums do not set it: the tree adopts each by its `namespace`.",
23
24
  fields: [
24
25
  {
25
26
  name: 'placement.parent',
@@ -37,7 +38,8 @@ export const doc = {
37
38
  {
38
39
  name: 'placement.order',
39
40
  type: 'number',
40
- description: 'Integer sibling order within the slot.',
41
+ description:
42
+ "Integer sibling order within the slot. Docs without an order come after the ordered ones, sorted by title. The same order sets each doc's Previous and Next links.",
41
43
  },
42
44
  ],
43
45
  },
@@ -48,18 +48,20 @@ export const doc = {
48
48
  {
49
49
  name: 'description',
50
50
  type: 'string',
51
- description: 'Longer help body / when-to-use.',
51
+ description:
52
+ 'Longer body / when-to-use. `astryx docs` prints it after the summary; `--help` shows only the summary.',
52
53
  },
53
54
  {
54
55
  name: 'namespace',
55
56
  type: 'string',
56
57
  description:
57
- "Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's commands use 'cli/commands', which the docs tree adopts: each is the leaf `cli/commands/<name>`. Every command doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
58
+ "Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's commands use 'cli/commands', which the docs tree adopts: each is the leaf `cli/commands/<name>`, spaces as hyphens (`theme build` is `cli/commands/theme-build`). Every command doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
58
59
  },
59
60
  {
60
61
  name: 'aliases',
61
62
  type: 'string[]',
62
- description: 'Alternate slugs that also resolve to this doc.',
63
+ description:
64
+ 'Reserved: other names for this doc. Nothing reads it today, so they do not resolve to it.',
63
65
  },
64
66
  {
65
67
  name: 'fn',
@@ -83,13 +85,13 @@ export const doc = {
83
85
  name: 'args[].param',
84
86
  type: 'string',
85
87
  description:
86
- 'FunctionDoc param this arg binds to (inherits its description).',
88
+ "FunctionDoc param this arg binds to; `astryx docs` shows that param's description when the arg has none.",
87
89
  },
88
90
  {
89
91
  name: 'args[].description',
90
92
  type: 'string',
91
93
  description:
92
- 'Override description (else inherited from the referenced param).',
94
+ "Override description. `--help` shows an argument's description only when it sets this.",
93
95
  },
94
96
  {
95
97
  name: 'args[].required',
@@ -126,7 +128,7 @@ export const doc = {
126
128
  name: 'options[].description',
127
129
  type: 'string',
128
130
  description:
129
- 'Override/explicit description (required when `cliOnly`).',
131
+ 'Override/explicit description. Nothing requires it: a flag with neither this nor `param` shows no description.',
130
132
  },
131
133
  {
132
134
  name: 'options[].choices',
@@ -143,7 +145,7 @@ export const doc = {
143
145
  name: 'options[].cliOnly',
144
146
  type: 'boolean',
145
147
  description:
146
- 'True for CLI-only flags with no function param (e.g. --json).',
148
+ 'True for CLI-only flags with no function param (e.g. --verbose). Nothing reads it.',
147
149
  },
148
150
  ],
149
151
  },
@@ -220,13 +222,13 @@ export const doc = {
220
222
  type: 'command',
221
223
  name: 'search',
222
224
  displayName: 'astryx search',
223
- summary: 'Find components, hooks, docs, and templates.',
224
- namespace: 'cli',
225
+ summary: 'Find components, hooks, docs, templates, and themes.',
226
+ namespace: 'cli/commands',
225
227
  fn: 'search',
226
228
  args: [{name: 'query', param: 'query', required: true}],
227
229
  options: [
228
- {flag: '--type <domain>', param: 'options.type', choices: ['component', 'hook', 'doc', 'template']},
229
- {flag: '--json', cliOnly: true, description: 'Emit the typed JSON envelope.'},
230
+ {flag: '--type <domain>', param: 'options.type', choices: ['component', 'hook', 'doc', 'template', 'theme']},
231
+ {flag: '--verbose', cliOnly: true, description: "Also print each result's score and match reason."},
230
232
  ],
231
233
  examples: [{label: 'Terminal', cli: 'astryx search button --json'}],
232
234
  exitCodes: [{code: 1, when: 'The --type value is not a known domain.'}],
@@ -241,7 +243,7 @@ export const doc = {
241
243
  },
242
244
  {
243
245
  type: 'prose',
244
- text: "Bind an arg/option to a function param via `param` so it inherits that param's description. Use `cliOnly: true` for flags with no function param (e.g. `--json`); those must supply their own `description`.",
246
+ text: "Bind an arg/option to a function param via `param` so it inherits that param's description: an option's in `--help` and `astryx docs`, an arg's in `astryx docs` only. Mark a flag with no function param (e.g. `--verbose`) `cliOnly: true` and give it its own `description`; nothing checks either. `--json` is a global flag, so a command doc does not declare it.",
245
247
  },
246
248
  ],
247
249
  };