@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
@@ -58,13 +58,13 @@ export const doc = {
58
58
  name: 'options.out',
59
59
  type: 'string',
60
60
  description:
61
- 'Override the output CSS path, relative or absolute; it must resolve inside cwd. The .js, .d.ts and any .variants.d.ts are written in the same directory, named after the theme (<name>.js), not after the CSS file.',
61
+ 'Override the output CSS path, relative or absolute; a build refuses a path outside cwd, and check mode refuses only a relative path that escapes cwd. The .js, .d.ts and any .variants.d.ts are written in the same directory, named after the theme (<name>.js), not after the CSS file.',
62
62
  },
63
63
  {
64
64
  name: 'options.check',
65
65
  type: 'boolean',
66
66
  description:
67
- 'Compile in memory and compare each output against what is on disk instead of writing: the CI drift guard.',
67
+ 'Compile in memory and compare each output against what is on disk instead of writing: the CI drift guard. Because it writes nothing, it also compares outputs outside cwd; when those are stale, the report names the directory that contains them and the build and check commands to run from there, since a build refuses them and each output records the directory it was built from.',
68
68
  default: 'false',
69
69
  },
70
70
  {
@@ -77,7 +77,7 @@ export const doc = {
77
77
  name: 'ctx.cwd',
78
78
  type: 'string',
79
79
  description:
80
- 'Directory the theme file, a relative out path, and the returned output paths resolve against. Every output is written inside it, including the default outputs beside the theme file.',
80
+ 'Directory the theme file, a relative out path, and the returned output paths resolve against. Every output a build writes is inside it, including the default outputs beside the theme file.',
81
81
  default: 'process.cwd()',
82
82
  },
83
83
  ],
@@ -105,7 +105,7 @@ export const doc = {
105
105
  },
106
106
  {
107
107
  code: 'ERR_PATH_TRAVERSAL',
108
- when: 'the theme name contains a path separator or traversal marker, or an output resolves outside cwd (including through a symlink): an `out` path, relative or absolute, or the default outputs beside a theme file outside cwd (also rejected in check mode)',
108
+ when: 'the theme name contains a path separator or traversal marker, or a written output resolves outside cwd (including through a symlink): an `out` path, relative or absolute, or the default outputs beside a theme file outside cwd. Check mode writes nothing, so it refuses only a relative `out` path that escapes cwd',
109
109
  },
110
110
  {
111
111
  code: 'ERR_CORE_NOT_FOUND',
@@ -51,6 +51,16 @@ The material is usually good; the finding is placement, not quality. It goes in
51
51
 
52
52
  Worked example: a responsive-and-interaction readiness rubric is grading criteria → **Component-Audit-Rubric**, or **Component-Lifecycle** if it is a promotion gate.
53
53
 
54
+ ## Imports in code samples
55
+
56
+ Import each Core export from the path `astryx component <Name>` prints: the
57
+ component's own entry when Core has one (`@astryxdesign/core/VStack`,
58
+ `@astryxdesign/core/Heading`), and `@astryxdesign/core/theme` for `Theme`,
59
+ `defineTheme` and the rest of the theme API. A reader copies one sample and then
60
+ reads `astryx component`, and two paths for one export read as two different
61
+ things. The no-build CDN page is the exception: its import map names only the
62
+ package root.
63
+
54
64
  ## Sections are read one at a time
55
65
 
56
66
  `astryx docs <topic> --index` lists a topic's sections, and readers then open
@@ -120,7 +120,7 @@ export const docs = {
120
120
  ['ocean.variants.d.ts', "(Optional) Module augmentations for custom component prop values"],
121
121
  ]},
122
122
  {type: 'prose', text: 'The `__built: true` flag tells Theme to skip runtime `<style>` injection; the CSS file handles it. Load the generated CSS wherever you load the module.'},
123
- {type: 'code', lang: 'tsx', label: 'Using a custom built theme', code: "import {Theme} from '@astryxdesign/core';\nimport {oceanTheme} from './themes/ocean';\nimport './themes/ocean.css';\n\n<Theme theme={oceanTheme}>\n <App />\n</Theme>"},
123
+ {type: 'code', lang: 'tsx', label: 'Using a custom built theme', code: "import {Theme} from '@astryxdesign/core/theme';\nimport {oceanTheme} from './themes/ocean';\nimport './themes/ocean.css';\n\n<Theme theme={oceanTheme}>\n <App />\n</Theme>"},
124
124
  {type: 'prose', text: "After upgrading Astryx, rerun `astryx theme build` for every custom prebuilt theme. Deploy the regenerated files together. The runtime intentionally trusts `__built: true` and will not repair stale CSS from an older build. The build also warns when the theme names font families it does not load. See {@link generic:font-setup} for the full recipe."},
125
125
  {type: 'prose', text: 'For the runtime vs built tradeoff, see the Runtime vs Built section of {@link generic:use-a-theme}.'},
126
126
  ],
@@ -86,7 +86,7 @@ export const docs = {
86
86
  type: 'code',
87
87
  lang: 'tsx',
88
88
  label: 'App root',
89
- code: `import {Theme} from '@astryxdesign/core';
89
+ code: `import {Theme} from '@astryxdesign/core/theme';
90
90
  import {themes, defaultThemeSlug} from './astryx-themes';
91
91
 
92
92
  <Theme theme={themes[defaultThemeSlug]}><App /></Theme>`,
@@ -119,14 +119,14 @@ import {themes, defaultThemeSlug} from './astryx-themes';
119
119
  content: [
120
120
  {
121
121
  type: 'prose',
122
- text: 'Components are imported from per-category subpath entrypoints. This keeps bundles small and makes intent clear.',
122
+ text: 'Import each component from its own entry, the path `astryx component <Name>` prints. This keeps bundles small and makes intent clear.',
123
123
  },
124
124
  {
125
125
  type: 'code',
126
126
  lang: 'tsx',
127
127
  label: 'app/page.tsx',
128
128
  code: `import {Button} from '@astryxdesign/core/Button';
129
- import {VStack} from '@astryxdesign/core/Layout';
129
+ import {VStack} from '@astryxdesign/core/VStack';
130
130
 
131
131
  export default function Page() {
132
132
  return (
@@ -158,7 +158,7 @@ export const docs = {
158
158
  },
159
159
  {
160
160
  type: 'prose',
161
- text: 'If a swizzled component renders with no styles and no error, a missing compiler is almost always why. See the StyleX Build Setup section of {@link generic:tokens-and-setup} for bundler config examples.',
161
+ text: "If importing a swizzled component throws an error that starts `Unexpected 'stylex.create' call at runtime` and the page does not render, the app is missing a StyleX compiler. See the StyleX Build Setup section of {@link generic:tokens-and-setup} for bundler config examples.",
162
162
  },
163
163
  ],
164
164
  },
@@ -9,7 +9,7 @@ export const docsDense = {
9
9
  section: 'Wrap your app in a theme',
10
10
  title: 'Quick start',
11
11
  content: [
12
- {type: 'prose', text: "Install a theme, wrap in `<Theme>` (`import {Theme} from '@astryxdesign/core'`). {@link generic:use-a-theme} for full guide."},
12
+ {type: 'prose', text: "Install a theme, wrap in `<Theme>` (`import {Theme} from '@astryxdesign/core/theme'`). {@link generic:use-a-theme} for full guide."},
13
13
  ],
14
14
  },
15
15
  {
@@ -23,7 +23,7 @@ export const docs = {
23
23
  type: 'code',
24
24
  lang: 'tsx',
25
25
  label: 'Wire the generated module once',
26
- 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}",
26
+ 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}",
27
27
  },
28
28
  ],
29
29
  },
@@ -11,7 +11,7 @@ export const docsZh = {
11
11
  content: [
12
12
  {
13
13
  type: 'prose',
14
- text: "安装主题包,用 `<Theme>`(`import {Theme} from '@astryxdesign/core'`)包裹应用,选择浅色或深色模式。完整指南——可用主题、集成主题、深色模式、嵌套主题和生产构建——请参阅 {@link generic:use-a-theme}。",
14
+ text: "安装主题包,用 `<Theme>`(`import {Theme} from '@astryxdesign/core/theme'`)包裹应用,选择浅色或深色模式。完整指南——可用主题、集成主题、深色模式、嵌套主题和生产构建——请参阅 {@link generic:use-a-theme}。",
15
15
  },
16
16
  ],
17
17
  },
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/components/add-a-component`: choose a
4
+ * @file `astryx docs cli/integrations/building-blocks/components/add-a-component`: choose a
5
5
  * component name and generate its first source and doc files.
6
6
  */
7
7
 
@@ -71,5 +71,15 @@ Declare component root ./components in astryx.integration.mjs.
71
71
  },
72
72
  ],
73
73
  },
74
+ {
75
+ id: 'document-an-existing-component',
76
+ title: 'Document a component you already have',
77
+ content: [
78
+ {
79
+ type: 'prose',
80
+ text: "To document a component your package already has, write its doc beside the source file and name the doc after that file, such as `acme-gallery.doc.mjs` beside `acme-gallery.tsx`. Set `name` to the export apps import, such as `name: 'AcmeGallery'`, and keep both files inside the components root that `astryx.integration.mjs` declares. The file does not have to be named after the component; {@link generic:component-imports} shows how apps then find it.",
81
+ },
82
+ ],
83
+ },
74
84
  ],
75
85
  };
@@ -44,7 +44,7 @@ Declare theme root ./themes in astryx.integration.mjs.
44
44
  },
45
45
  {
46
46
  type: 'prose',
47
- text: "`oceanTheme.ts` exports `oceanTheme`, a `defineTheme` source. `oceanTheme.doc.mjs` describes it with `type: 'theme'`, `name`, `displayName`, `description`, and `maintained`; `theme list` shows its `name`, `description`, and `maintained`. The command also declares `./themes/ocean` and `./themes/ocean.css` package exports. Every descriptor field is in {@link generic:authoring}.",
47
+ text: '`oceanTheme.ts` exports `oceanTheme`, a `defineTheme` source, and `oceanTheme.doc.mjs` is the descriptor that `theme list` reads. The command also declares `./themes/ocean` and `./themes/ocean.css` package exports. Every field is in {@link schema:theme-doc}.',
48
48
  },
49
49
  {
50
50
  type: 'prose',
@@ -1,9 +1,9 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/docs/add-a-topic`: add a doc topic to an
5
- * integration package, write its sections, and pick the doc kind for each
6
- * thing the package ships.
4
+ * @file `astryx docs cli/integrations/building-blocks/docs/add-a-topic`: add a
5
+ * doc topic to an integration package, write its sections, and pick the doc
6
+ * kind for each thing the package ships.
7
7
  */
8
8
 
9
9
  /** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
@@ -40,7 +40,7 @@ export const docs = {
40
40
  items: [
41
41
  'Name the topic in lowercase kebab-case, such as `deploying`. Readers type the name as a command argument, so it holds only letters, digits, `_`, and `-`.',
42
42
  'Keep the name stable: readers and links find the topic by it.',
43
- 'Pick a name no Core topic uses. To take over or add to a Core topic, see {@link generic:extend-or-replace}.',
43
+ 'Pick a name that `astryx docs` does not already list: no Core topic, and no section such as `tokens` or `layout`. To take over or add to a Core topic, see {@link generic:extend-or-replace}.',
44
44
  ],
45
45
  },
46
46
  ],
@@ -59,13 +59,16 @@ export const docs = {
59
59
  label: 'docs/deploying.doc.mjs',
60
60
  code: "/** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */\nexport default {\n type: 'generic',\n name: 'deploying',\n title: 'Deploying',\n description: 'Ship an app built with Acme widgets.',\n sections: [{\n id: 'build-before-you-ship',\n title: 'Build before you ship',\n content: [\n {type: 'prose', text: 'Build the app, then upload the `dist` folder.'},\n {type: 'code', lang: 'bash', code: 'npm run build'},\n {type: 'list', style: 'unordered', items: ['Keep `dist` out of git.']},\n {type: 'table', headers: ['Variable', 'Value'], rows: [['`NODE_ENV`', '`production`']]},\n ],\n }],\n};",
61
61
  },
62
+ {
63
+ type: 'prose',
64
+ text: 'The sample sets a section `id`, so `package.json` needs the CLI peer `"@astryxdesign/cli": ">=0.6.4"`. Published 0.6.3 and earlier reject `id` and hide every doc topic your package ships, and `integration verify` fails without that peer; see {@link generic:versioning}.',
65
+ },
62
66
  {
63
67
  type: 'list',
64
68
  style: 'unordered',
65
69
  items: [
66
- 'Content blocks are `prose`, `code`, `list`, and `table`, as shown; `heading`, with a `level` from 3 to 6 and a `text`; and `token-ref`, which inlines a token table from another topic.',
67
- '`id` is optional: a stable key for the section. Without it, the key comes from the title. A stable CLI before 0.6.4 cannot read `id`; see {@link generic:versioning}.',
68
- 'Replace the `Overview` placeholder that `integration add` writes. Every field is in {@link generic:authoring}.',
70
+ 'Replace the `Overview` placeholder that `integration add` writes.',
71
+ 'Every field is in {@link schema:reference-doc}.',
69
72
  ],
70
73
  },
71
74
  ],
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/agent-guidance`: add short lines of
4
+ * @file `astryx docs cli/integrations/building-blocks/configuration/agent-guidance`: add short lines of
5
5
  * guidance that apps put in front of their AI agents, within the limits.
6
6
  */
7
7
 
@@ -121,7 +121,7 @@ export default {
121
121
  lang: 'bash',
122
122
  code: `npx astryx init --features agents
123
123
  # Or: --from takes the Core version the app had before
124
- npx astryx upgrade --from 0.7.0 --apply`,
124
+ npx astryx upgrade --from <version> --apply`,
125
125
  },
126
126
  {
127
127
  type: 'code',
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/templates/document-the-template/block-template`:
4
+ * @file `astryx docs cli/integrations/building-blocks/templates/document-the-template/block-template`:
5
5
  * the block-only fields: component relationships and the preview shape.
6
6
  */
7
7
 
@@ -31,7 +31,7 @@ export const docs = {
31
31
  type: 'code',
32
32
  lang: 'javascript',
33
33
  label: 'templates/acme-stat-card.doc.mjs',
34
- code: `/** @type {import('@astryxdesign/cli/authoring').TemplateDoc} */
34
+ code: `/** @type {import('@astryxdesign/cli/authoring').IntegrationTemplateDoc} */
35
35
  export default {
36
36
  type: 'block',
37
37
  name: 'acme-stat-card',
@@ -54,18 +54,8 @@ export default {
54
54
  title: 'Choose the component relationship',
55
55
  content: [
56
56
  {
57
- type: 'reference',
58
- target: 'schema:template-doc',
59
- projection: {
60
- fields: [
61
- 'exampleFor',
62
- 'alsoExampleFor',
63
- 'alsoShowcaseFor',
64
- 'componentsUsed',
65
- 'isShowcase',
66
- ],
67
- },
68
- presentation: 'full',
57
+ type: 'prose',
58
+ text: 'Every field is in {@link schema:template-doc}.',
69
59
  },
70
60
  {
71
61
  type: 'prose',
@@ -75,7 +65,7 @@ export default {
75
65
  type: 'code',
76
66
  lang: 'javascript',
77
67
  label: 'templates/acme-status-card-showcase.doc.mjs',
78
- code: `/** @type {import('@astryxdesign/cli/authoring').TemplateDoc} */
68
+ code: `/** @type {import('@astryxdesign/cli/authoring').IntegrationTemplateDoc} */
79
69
  export default {
80
70
  type: 'block',
81
71
  name: 'acme-status-card-showcase',
@@ -101,14 +91,12 @@ export default {
101
91
  title: 'Choose a useful preview',
102
92
  content: [
103
93
  {
104
- type: 'reference',
105
- target: 'schema:template-doc',
106
- projection: {fields: ['aspectRatio']},
107
- presentation: 'full',
94
+ type: 'prose',
95
+ text: 'Every field is in {@link schema:template-doc}.',
108
96
  },
109
97
  {
110
98
  type: 'prose',
111
- text: 'Start from the value for the closest shape below, render the block at that ratio, and adjust it until it neither clips nor leaves large empty space. These are starting points, not contract defaults.',
99
+ text: 'Set `aspectRatio` from the value for the closest shape below, render the block at that ratio, and adjust it until it neither clips nor leaves large empty space. These are starting points, not contract defaults.',
112
100
  },
113
101
  {
114
102
  type: 'table',
@@ -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`:
4
+ * @file `astryx docs cli/integrations/building-blocks/templates/build-the-template`:
5
5
  * author portable template source and every asset that source needs.
6
6
  */
7
7
 
@@ -0,0 +1,196 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `astryx docs cli/integrations/building-blocks/components/describe-the-component/check-the-props`:
5
+ * compare each component doc's props table with the component's TypeScript
6
+ * props, read each finding, and fix the doc or the code.
7
+ */
8
+
9
+ /** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
10
+ export const docs = {
11
+ type: 'generic',
12
+ name: 'check-the-props',
13
+ placement: {
14
+ parent: 'namespace:describe-the-component',
15
+ slot: 'guides',
16
+ order: 50,
17
+ },
18
+ title: 'Check the props table',
19
+ category: 'guide',
20
+ keywords: [
21
+ 'props table',
22
+ 'documented props',
23
+ 'prop drift',
24
+ 'props not compared',
25
+ ],
26
+ description:
27
+ "Compare each props table with the component's TypeScript props, then fix the doc or the code.",
28
+ sections: [
29
+ {
30
+ id: 'run-the-props-check',
31
+ title: 'Run the props check',
32
+ content: [
33
+ {
34
+ type: 'prose',
35
+ text: "`doctor integration components` compares every props table in your component docs, hidden docs and every family entry included, with the props the component's TypeScript declares. Run it in your package after you change a component or its doc.",
36
+ },
37
+ {
38
+ type: 'code',
39
+ lang: 'bash',
40
+ code: 'npx astryx doctor integration components',
41
+ },
42
+ {
43
+ type: 'code',
44
+ lang: 'text',
45
+ code: `severity: [warn]
46
+ component: AcmeCarousel
47
+ prop: loop
48
+ kind: not_in_code
49
+ message: "loop" is documented, but AcmeCarousel's props have no "loop".
50
+ doc: components/AcmeCarousel.doc.mjs
51
+ source: components/AcmeCarousel.tsx
52
+ docType: boolean
53
+
54
+ 1 prop(s) differ between the docs and the code in 1 of 1 component(s) compared (TypeScript 6.0.3). These are warnings: update the doc, or the code if the doc is right.`,
55
+ },
56
+ {
57
+ type: 'list',
58
+ style: 'unordered',
59
+ items: [
60
+ "A doc's own `props` describe the export its `name` names. In a family doc, each entry describes its own export. A hook entry documents parameters and returns, so it is not compared.",
61
+ "It reads props with the `typescript` your package installs, and reads your package's `tsconfig.json` the way `tsc -p` does. Without TypeScript it prints `[skip] Props not compared` and the reason.",
62
+ 'Every finding is a warning, so the exit code stays 0. Read them before you publish. With `--json`, they are in `data.propDrift.findings`.',
63
+ ],
64
+ },
65
+ ],
66
+ },
67
+ {
68
+ id: 'fix-each-finding',
69
+ title: 'Fix each finding',
70
+ content: [
71
+ {
72
+ type: 'prose',
73
+ text: "Each finding's `kind` says what differs. Fix the doc, or the code if the doc is right.",
74
+ },
75
+ {
76
+ type: 'table',
77
+ headers: ['Kind', 'Means', 'Fix'],
78
+ rows: [
79
+ [
80
+ '`not_in_code`',
81
+ "The doc lists a prop the component's props do not have",
82
+ 'Remove it from the doc, or add it to the code. A name an index signature takes, such as `data-*`, counts as present',
83
+ ],
84
+ [
85
+ '`not_in_doc`',
86
+ "Your package declares a prop the doc does not list, or builds one with a mapped type, such as `Partial<Record<'sm' | 'md', string>>`",
87
+ 'Document it. Props from React, the DOM, or another package are never asked for, and neither are props whose keys another package defines (`keyof CSSProperties`, behind an alias or not), `className`, `style`, `xstyle`, `data-testid`, `ref`, `key`, or a prop whose JSDoc has `@internal`. A deprecated prop is still a prop: document it until you remove it. A prop a mapped type builds from keys the check cannot trace (a template literal, say) is listed under `[info] Props not checked for a doc entry` instead',
88
+ ],
89
+ [
90
+ '`required_mismatch`',
91
+ '`required` disagrees with the code',
92
+ 'Set `required: true` exactly when every caller must pass the prop. One your `defaultProps` fills counts as optional, as it is to JSX callers, and so does one only some members of a union require, since a caller can leave it out: say in its description which variants need it. An entry that names several props (`value / onChange`) makes the same claim about each: give them separate entries when they differ',
93
+ ],
94
+ [
95
+ '`type_mismatch`',
96
+ "The documented `type` differs from the code's, where both read exactly",
97
+ 'Copy the type from the source, or fix the code. The next section says which types are judged',
98
+ ],
99
+ ],
100
+ },
101
+ ],
102
+ },
103
+ {
104
+ id: 'write-types-the-check-can-judge',
105
+ title: 'Write types the check can judge',
106
+ content: [
107
+ {
108
+ type: 'prose',
109
+ text: 'For a prop your package declares, the check also compares the documented `type`, but only where both sides read exactly. It never guesses, so a type it cannot judge is listed, not reported. It needs TypeScript 4.8 or later: with an older one it prints `[skip] Prop types not judged` and judges none.',
110
+ },
111
+ {
112
+ type: 'code',
113
+ lang: 'text',
114
+ code: `severity: [warn]
115
+ component: AcmeCarousel
116
+ prop: interval
117
+ kind: type_mismatch
118
+ message: "interval" is documented as string, but the code declares number.
119
+ doc: components/AcmeCarousel.doc.mjs
120
+ source: components/AcmeCarousel.tsx
121
+ docType: string
122
+ codeType: number`,
123
+ },
124
+ {
125
+ type: 'list',
126
+ style: 'unordered',
127
+ items: [
128
+ "Write the type as the source writes it, such as `ReactNode[]` or `(index: number) => void`. Parameter names, member order, quotes and whitespace may differ. Text that writes `readonly` must match exactly, parameter names included; only whitespace may differ. `React.X` names React's own `X` where the prop is declared, so it matches a bare `X` only where that name is React's: `React.KeyboardEvent` is not the DOM's `KeyboardEvent`.",
129
+ "Name a type as the file that declares the prop names it, so an import renamed there (`Item as BaseItem`) is written as that file writes it. A field (`cfg.level`) takes its prop's file, even when the field's own type is declared in another file.",
130
+ 'A type written another way is judged only when both sides are built from exact parts: primitives such as `string` and `number`, string, number and boolean literals, string enum members, arrays and unions of these, and type names that stand for them. Union members may come in any order, and a member another covers adds nothing, as TypeScript passes it there: `undefined` beside `void`, or `string[]` beside `(string | number)[]`.',
131
+ 'A mutable array type matches a readonly one, because callers can pass it. A readonly one documented for a mutable array is a mismatch.',
132
+ "When a prop's variants give a field different types, as `{value: string} | {value: number}` does, document every variant's type (`string | number`). The types of only some variants are listed: the prop's variants give this field different types. With more than six variant types, any other type is listed too.",
133
+ "To name an alias and show its values, write `AcmeSize = 'sm' | 'md'` or `AcmeSize ('sm' | 'md')`. Both parts must match.",
134
+ "An optional prop's `undefined` is set aside on both sides. With `exactOptionalPropertyTypes`, the doc shows `undefined` exactly when the code declares it.",
135
+ 'Anything else, such as an object, a tuple, a generic with arguments, `keyof`, an intersection, or a mapped or conditional type written another way, is not compared.',
136
+ ],
137
+ },
138
+ {
139
+ type: 'prose',
140
+ text: "The check prints how many documented types it judged, then lists the rest by reason: not a form the check judges exactly, a field the prop's variants give different types, a standard prop, or a prop declared outside the package. With `--json`, they are in `data.propDrift.typesNotCompared`.",
141
+ },
142
+ {
143
+ type: 'code',
144
+ lang: 'text',
145
+ code: '[info] Documented prop types judged: 2; not compared: 0. A type is judged when the doc writes it the same as the source (exactly, if it contains `readonly`), or when both are primitives, literals, arrays and unions of those, or names for them.',
146
+ },
147
+ ],
148
+ },
149
+ {
150
+ id: 'when-a-component-is-not-compared',
151
+ title: 'When a component is not compared',
152
+ content: [
153
+ {
154
+ type: 'prose',
155
+ text: "When the check cannot read a component's props exactly, it lists the component under `[info] Props not compared`, with the reason, instead of reporting findings that might be wrong.",
156
+ },
157
+ {
158
+ type: 'code',
159
+ lang: 'text',
160
+ code: `[info] Props not compared for 1 documented component(s):
161
+
162
+ component: AcmeCarousel
163
+ doc: components/AcmeCarousel.doc.mjs
164
+ reason: AcmeCarousel depends on \`@acme/motion\` (imported in AcmeCarousel.tsx), which the compiler could not resolve, usually a dependency that is not installed. Install the package's dependencies and run this check again`,
165
+ },
166
+ {
167
+ type: 'table',
168
+ headers: ['Reason', 'Fix'],
169
+ rows: [
170
+ [
171
+ 'It depends on a package or file the compiler could not resolve',
172
+ "Install the package's dependencies, then run the check again",
173
+ ],
174
+ [
175
+ "It depends on a type the compiler can't work out",
176
+ 'Make the types compile with `npx tsc --noEmit`, then run the check again',
177
+ ],
178
+ [
179
+ "The package's TypeScript config has an error",
180
+ 'Fix `tsconfig.json` until `npx tsc -p .` reads it',
181
+ ],
182
+ ['Its props are typed `any`', 'Give the component a props type'],
183
+ [
184
+ 'Some prop names come from a type parameter',
185
+ 'Nothing to fix: a component that renders an element the caller picks takes props known only where it is used',
186
+ ],
187
+ [
188
+ "The file has no export named by the doc's `name`",
189
+ 'Change `name` or the export so they agree',
190
+ ],
191
+ ],
192
+ },
193
+ ],
194
+ },
195
+ ],
196
+ };
@@ -1,9 +1,9 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file `astryx docs cli/integrations/docs/check-your-docs`: what each check
5
- * proves about an integration's docs: the docs check, the read size, and the
6
- * CLI peer.
4
+ * @file `astryx docs cli/integrations/building-blocks/docs/check-your-docs`:
5
+ * what each check proves about an integration's docs: the docs check, each
6
+ * doc's fields, the read size, and the CLI peer.
7
7
  */
8
8
 
9
9
  /** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
@@ -13,7 +13,8 @@ export const docs = {
13
13
  placement: {parent: 'namespace:docs', slot: 'guides', order: 60},
14
14
  title: 'Check your docs',
15
15
  category: 'guide',
16
- description: 'Check the docs tree, links, overlaps, read size, and CLI peer.',
16
+ description:
17
+ 'Check the docs tree, links, overlaps, doc fields, read size, and CLI peer.',
17
18
  sections: [
18
19
  {
19
20
  id: 'run-the-docs-check',
@@ -45,7 +46,7 @@ export const docs = {
45
46
  content: [
46
47
  {
47
48
  type: 'prose',
48
- text: 'A doc that does not load, an accidental Core overlap, or a failed namespace or placement fails the check with exit code 1. A link that names no doc only warns, and the exit code stays 0.',
49
+ text: 'A doc that does not load, an accidental Core overlap, a `reference` block that names no doc, or a failed namespace or placement fails the check with exit code 1. A link that names no doc only warns, and the exit code stays 0.',
49
50
  },
50
51
  {
51
52
  type: 'table',
@@ -66,6 +67,11 @@ export const docs = {
66
67
  '`[fail]` `invalid_doc_graph`',
67
68
  '1',
68
69
  ],
70
+ [
71
+ 'A `reference` block whose target names no doc',
72
+ '`[fail]` `invalid_doc_reference`',
73
+ '1',
74
+ ],
69
75
  ['A link that names no doc', '`[warn]` `invalid_doc_graph`', '0'],
70
76
  [
71
77
  'A topic that sets `replaces` or `extends`',
@@ -80,6 +86,46 @@ export const docs = {
80
86
  },
81
87
  ],
82
88
  },
89
+ {
90
+ id: 'check-each-doc-against-its-type',
91
+ title: 'Check each doc against its type',
92
+ content: [
93
+ {
94
+ type: 'prose',
95
+ text: "`doctor integration validate` reads every doc your package ships against the type `@astryxdesign/cli/authoring` publishes for its kind, the way `tsc` would: a `hidden` doc and a second doc for one name too. Test fixtures under `__tests__` in the components or docs root, which those readers skip, are counted, not checked. It reports a field the type does not have (`unknown_field`), a missing required field (`missing_field`), and a value outside the field's type (`wrong_type`).",
96
+ },
97
+ {
98
+ type: 'code',
99
+ lang: 'bash',
100
+ code: 'npx astryx doctor integration validate',
101
+ },
102
+ {
103
+ type: 'code',
104
+ lang: 'text',
105
+ code: `Checking 1 doc(s) against the authoring types (TypeScript 6.0.3)
106
+
107
+ severity: [warn]
108
+ doc: components/AcmeCarousel.doc.mjs
109
+ line: 7
110
+ export: default
111
+ type: ComponentDoc
112
+ field: summary
113
+ problem: unknown_field
114
+ message: Object literal may only specify known properties, and 'summary' does not exist in type 'SingleComponentDoc'.
115
+ fix: Remove \`summary\`: SingleComponentDoc has no field \`summary\`.`,
116
+ },
117
+ {
118
+ type: 'list',
119
+ style: 'unordered',
120
+ items: [
121
+ "The folder decides the type: `ComponentDoc` in your components root, `IntegrationTemplateDoc` in your templates root, `ThemeDoc` in your themes root, and in your docs root the type the doc's `type` names. Keep the `@type` comment above each doc's export too, so your editor shows the same problems as you type.",
122
+ 'Every finding is a warning, so the exit code stays 0. With `--json`, they are in `data.docTypes.findings`.',
123
+ 'It uses the `typescript` your package installs. Without it, it prints `[skip] Docs not type-checked` and the reason.',
124
+ 'Every field of every doc type is in `astryx docs authoring`.',
125
+ ],
126
+ },
127
+ ],
128
+ },
83
129
  {
84
130
  id: 'check-read-size',
85
131
  title: 'Check read size',