@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.
- package/README.md +15 -14
- package/api/build/help/help.mjs +1 -1
- package/api/component/_adapter.d.mts +14 -0
- package/api/component/_adapter.mjs +48 -0
- package/api/component/component.mjs +10 -2
- package/api/component/integration-export-name.test.mjs +233 -8
- package/api/docs/_adapter.d.mts +11 -0
- package/api/docs/_adapter.mjs +244 -1
- package/api/docs/integrationDocs.test.mjs +124 -0
- package/api/doctor/doctor.mjs +27 -3
- package/api/doctor/doctor.test.mjs +43 -0
- package/api/doctor/theme-checks.mjs +1 -1
- package/api/gap-report/gap-report.mjs +2 -1
- package/api/index.d.mts +2 -0
- package/api/index.mjs +2 -0
- package/api/init/run/run.mjs +2 -2
- package/api/integration/_adapter.d.mts +12 -0
- package/api/integration/_adapter.mjs +54 -0
- package/api/integration/add-contribution.component-names.test.mjs +66 -0
- package/api/integration/add-contribution.mjs +8 -4
- package/api/integration/add-contribution.test.mjs +4 -2
- package/api/integration/authoring-checks.mjs +11 -2
- package/api/integration/authoring-checks.test.mjs +39 -0
- package/api/integration/authoring-checks.type.d.mts +9 -0
- package/api/integration/authoring-checks.type.mjs +14 -1
- package/api/integration/check/check.d.mts +96 -0
- package/api/integration/check/check.mjs +357 -0
- package/api/integration/check/check.test.mjs +489 -0
- package/api/integration/integration-check.type.d.mts +118 -0
- package/api/integration/integration-check.type.mjs +84 -0
- package/api/integration/integrationCheck.doc.d.mts +10 -0
- package/api/integration/integrationCheck.doc.mjs +73 -0
- package/api/integration/integrationComponentConflicts.doc.mjs +36 -5
- package/api/integration/pack-check.mjs +48 -3
- package/api/integration/pack-check.test.mjs +247 -0
- package/api/integration/validate-integration.mjs +8 -0
- package/api/integration/validate-integration.test.mjs +11 -0
- package/api/integration/validate-integration.type.d.mts +8 -0
- package/api/integration/validate-integration.type.mjs +12 -1
- package/api/integration/validateIntegration.doc.mjs +17 -3
- package/api/search/search.d.mts +13 -6
- package/api/search/search.domain-priority.test.mjs +108 -18
- package/api/search/search.integration-check.test.mjs +24 -0
- package/api/search/search.mjs +53 -17
- package/api/theme/build/build.family.test.mjs +54 -6
- package/api/theme/build/build.mjs +114 -17
- package/api/theme/themeBuild.doc.mjs +4 -4
- package/assets/docs/README.md +10 -0
- package/assets/docs/author-a-theme.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +3 -3
- package/assets/docs/styling-overview.doc.mjs +1 -1
- package/assets/docs/theme.doc.dense.mjs +1 -1
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/docs/theme.doc.zh.mjs +1 -1
- package/assets/docs/tree/add-a-component.doc.mjs +11 -1
- package/assets/docs/tree/add-a-theme.doc.mjs +1 -1
- package/assets/docs/tree/add-a-topic.doc.mjs +10 -7
- package/assets/docs/tree/agent-guidance.doc.mjs +2 -2
- package/assets/docs/tree/block-template.doc.mjs +8 -20
- package/assets/docs/tree/build-the-template.doc.mjs +1 -1
- package/assets/docs/tree/check-the-props.doc.mjs +196 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +51 -5
- package/assets/docs/tree/checks.doc.mjs +24 -16
- package/assets/docs/tree/codemods.doc.mjs +4 -4
- package/assets/docs/tree/component-family.doc.mjs +8 -6
- package/assets/docs/tree/component-imports.doc.mjs +3 -3
- package/assets/docs/tree/components.doc.mjs +1 -1
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +7 -18
- package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
- package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
- package/assets/docs/tree/docs.doc.mjs +3 -3
- package/assets/docs/tree/document-the-template.doc.mjs +1 -1
- package/assets/docs/tree/document-the-theme.doc.mjs +1 -1
- package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
- package/assets/docs/tree/extend-or-replace.doc.mjs +6 -6
- package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
- package/assets/docs/tree/generate-a-palette.doc.mjs +5 -3
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +1 -1
- package/assets/docs/tree/integrations.doc.mjs +8 -0
- package/assets/docs/tree/links.doc.mjs +6 -5
- package/assets/docs/tree/migration-setup.doc.mjs +1 -0
- package/assets/docs/tree/migration-verification.doc.mjs +0 -1
- package/assets/docs/tree/migration.doc.mjs +0 -1
- package/assets/docs/tree/package-and-test.doc.mjs +1 -1
- package/assets/docs/tree/page-template.doc.mjs +4 -8
- package/assets/docs/tree/publishing.doc.mjs +1 -1
- package/assets/docs/tree/quick-start.doc.mjs +37 -21
- package/assets/docs/tree/replace-a-core-component.doc.mjs +4 -6
- package/assets/docs/tree/replace-a-core-template.doc.mjs +6 -8
- package/assets/docs/tree/sections-and-placement.doc.mjs +4 -6
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +4 -2
- package/assets/docs/tree/short-and-findable.doc.mjs +6 -5
- package/assets/docs/tree/single-component.doc.mjs +15 -6
- package/assets/docs/tree/start-a-template.doc.mjs +3 -3
- package/assets/docs/tree/subcomponent.doc.mjs +6 -6
- package/assets/docs/tree/template-assets.doc.mjs +2 -2
- package/assets/docs/tree/template-doc-overview.doc.mjs +4 -15
- package/assets/docs/tree/template-fonts.doc.mjs +1 -1
- package/assets/docs/tree/template-icons.doc.mjs +1 -1
- package/assets/docs/tree/template-images-media.doc.mjs +1 -1
- package/assets/docs/tree/template-styles.doc.mjs +2 -2
- package/assets/docs/tree/templates.doc.mjs +1 -1
- package/assets/docs/tree/test-in-an-app.doc.mjs +3 -3
- package/assets/docs/tree/test-template-in-app.doc.mjs +1 -1
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- package/assets/docs/tree/troubleshooting.doc.mjs +13 -5
- package/assets/docs/tree/type-scale.doc.mjs +3 -3
- package/assets/docs/tree/upgrading.doc.mjs +3 -3
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +3 -1
- package/assets/docs/tree/verify-packed-template.doc.mjs +1 -1
- package/assets/docs/tree/versioning.doc.mjs +7 -6
- package/assets/docs/tree/write-the-template-file.doc.mjs +4 -3
- package/assets/docs/use-a-theme.doc.mjs +2 -2
- package/assets/theme.template.ts +1 -1
- package/authoring/codemod/codemod.doc.mjs +7 -3
- package/authoring/config/config.doc.mjs +9 -6
- package/authoring/config/type.ts +4 -2
- package/authoring/discover/discover.doc.mjs +1 -1
- package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
- package/authoring/doctypes/command/command.doc.mjs +14 -12
- package/authoring/doctypes/component/component.doc.mjs +29 -26
- package/authoring/doctypes/component/type.ts +7 -5
- package/authoring/doctypes/enum/enum.doc.mjs +7 -4
- package/authoring/doctypes/function/function.doc.mjs +9 -8
- package/authoring/doctypes/hook/hook.doc.mjs +5 -4
- package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
- package/authoring/doctypes/reference/reference.doc.mjs +11 -10
- package/authoring/doctypes/schema/schema.doc.mjs +9 -9
- package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
- package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
- package/authoring/doctypes/template/parse.d.mts +6 -2
- package/authoring/doctypes/template/parse.mjs +3 -1
- package/authoring/doctypes/template/template.doc.mjs +3 -3
- package/authoring/doctypes/template/type.ts +22 -0
- package/authoring/doctypes/theme/theme.doc.mjs +2 -2
- package/authoring/gap-report/gap-report.doc.mjs +2 -2
- package/authoring/identity/identity.doc.mjs +3 -3
- package/authoring/index.d.ts +1 -0
- package/authoring/integration/integration.doc.mjs +12 -4
- package/authoring/integration/parse.test.mjs +10 -0
- package/authoring/integration/schema.d.mts +2 -0
- package/authoring/integration/schema.mjs +1 -0
- package/authoring/integration/type.ts +4 -0
- package/clients/cli/commands/build-theme.batch-report.test.mjs +3 -1
- package/clients/cli/commands/build-theme.mjs +1 -1
- package/clients/cli/commands/build-theme.path-safety.test.mjs +155 -21
- package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +15 -4
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +11 -2
- package/clients/cli/commands/doctor-integration.test.mjs +837 -0
- package/clients/cli/commands/doctor.mjs +190 -0
- package/clients/cli/commands/integration-check.doc.mjs +85 -0
- package/clients/cli/commands/integration-check.test.mjs +267 -0
- package/clients/cli/commands/integration.doc.mjs +6 -2
- package/clients/cli/commands/integration.mjs +107 -1
- package/clients/cli/commands/setup-nudge.test.mjs +79 -1
- package/clients/cli/commands/swizzle.mjs +5 -3
- package/clients/cli/commands/swizzle.routing.test.mjs +18 -1
- package/clients/cli/commands/text-json-parity.test.mjs +5 -0
- package/clients/cli/commands/theme-build.doc.mjs +2 -2
- package/clients/cli/index.mjs +30 -5
- package/foundation/agent-docs/agent-doc-state.d.mts +14 -0
- package/foundation/agent-docs/agent-doc-state.mjs +38 -0
- package/foundation/agent-docs/agent-docs.d.mts +2 -1
- package/foundation/agent-docs/agent-docs.mjs +8 -6
- package/foundation/config/project.mjs +82 -0
- package/foundation/discovery/authoring-self-docs.mjs +2 -1
- package/foundation/discovery/component-discovery.d.mts +108 -17
- package/foundation/discovery/component-discovery.export-names.test.mjs +469 -2
- package/foundation/discovery/component-discovery.mjs +380 -47
- package/foundation/discovery/component-replacement.test.mjs +20 -0
- package/foundation/discovery/doc-types.d.mts +157 -0
- package/foundation/discovery/doc-types.mjs +1224 -0
- package/foundation/discovery/doc-types.test.mjs +652 -0
- package/foundation/discovery/docs-discovery.d.mts +81 -0
- package/foundation/discovery/docs-discovery.mjs +57 -0
- package/foundation/discovery/integration-doc-files.d.mts +22 -0
- package/foundation/discovery/integration-doc-files.mjs +231 -0
- package/foundation/discovery/integration-doc-files.test.mjs +246 -0
- package/foundation/discovery/module-exports.d.mts +6 -0
- package/foundation/discovery/module-exports.mjs +15 -2
- package/foundation/discovery/package-tsconfig.d.mts +14 -0
- package/foundation/discovery/package-tsconfig.mjs +228 -0
- package/foundation/discovery/package-tsconfig.test.mjs +210 -0
- package/foundation/discovery/project-typescript.d.mts +23 -0
- package/foundation/discovery/project-typescript.mjs +61 -0
- package/foundation/discovery/prop-drift.d.mts +278 -0
- package/foundation/discovery/prop-drift.mjs +2263 -0
- package/foundation/discovery/prop-drift.test.mjs +2219 -0
- package/foundation/discovery/type-match.d.mts +53 -0
- package/foundation/discovery/type-match.mjs +660 -0
- package/foundation/discovery/type-match.test.mjs +169 -0
- package/foundation/discovery/type-text.d.mts +68 -0
- package/foundation/discovery/type-text.mjs +658 -0
- package/foundation/discovery/type-text.test.mjs +196 -0
- package/foundation/discovery/unresolved-references.d.mts +62 -0
- package/foundation/discovery/unresolved-references.mjs +790 -0
- package/foundation/discovery/unresolved-references.test.mjs +567 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +6 -0
- package/foundation/doc-compiler/links.d.mts +9 -5
- package/foundation/doc-compiler/links.mjs +4 -2
- package/foundation/integrations/contribution-inventory.mjs +6 -1
- package/foundation/response/response-types.doc.mjs +7 -2
- package/package.json +9 -9
- package/scripts/postinstall.mjs +3 -3
|
@@ -30,7 +30,7 @@ export const doc = {
|
|
|
30
30
|
name: 'name',
|
|
31
31
|
type: 'string',
|
|
32
32
|
description:
|
|
33
|
-
"Stable machine identity
|
|
33
|
+
"Stable machine identity without the Astryx prefix, PascalCase. e.g. 'Button', 'TextInput', 'AppShell'. For an integration component it is the export apps import: the doc sits beside the file that exports it, and when that file exports nothing under its own name, `name` may name the export it does have. Change `displayName`, not `name`, to edit the visible label; registry URLs derive from this identity by default.",
|
|
34
34
|
required: true,
|
|
35
35
|
},
|
|
36
36
|
{
|
|
@@ -62,19 +62,19 @@ export const doc = {
|
|
|
62
62
|
name: 'keywords',
|
|
63
63
|
type: 'string[]',
|
|
64
64
|
description:
|
|
65
|
-
'Search keywords for CLI discovery: synonyms and related UI concepts from other design systems (MUI, Chakra, Radix, and others). Lowercase.
|
|
65
|
+
'Search keywords for CLI discovery: synonyms and related UI concepts from other design systems (MUI, Chakra, Radix, and others). Lowercase. `astryx search` matches them; `astryx component <term>` also suggests Core components by keyword.',
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
name: 'hiddenComponents',
|
|
69
69
|
type: 'string[]',
|
|
70
70
|
description:
|
|
71
|
-
|
|
71
|
+
"Sub-component names to hide from human-facing UI (CLI listings, docs catalogs). They stay public and importable; agents and tooling can still discover them via source. In an integration it hides only full entries in this doc's `components`, which the CLI then neither lists nor opens; hide a sub-component that has its own doc with `hidden` in that doc.",
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
name: 'hidden',
|
|
75
75
|
type: 'boolean',
|
|
76
76
|
description:
|
|
77
|
-
'Hide this entire component from human-facing UI. It stays public and importable. Use for shared
|
|
77
|
+
'Hide this entire component from human-facing UI. It stays public and importable. Use for a shared primitive that only makes sense inside its parent.',
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
name: 'group',
|
|
@@ -98,13 +98,13 @@ export const doc = {
|
|
|
98
98
|
name: 'theming',
|
|
99
99
|
type: '{ container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[] }',
|
|
100
100
|
description:
|
|
101
|
-
'Theming configuration: the stable selector surface (
|
|
101
|
+
'Theming configuration: the stable selector surface (astryx-* classes + data-attribute reflections) that themes target via @scope selectors in defineTheme.',
|
|
102
102
|
fields: [
|
|
103
103
|
{
|
|
104
104
|
name: 'theming.container',
|
|
105
105
|
type: 'boolean',
|
|
106
106
|
description:
|
|
107
|
-
|
|
107
|
+
"Marks a container component. Nothing reads it today: the theme pipeline maps `padding` to container tokens from a `theming.derived` entry `{property: 'padding', expand: 'container'}`.",
|
|
108
108
|
},
|
|
109
109
|
{
|
|
110
110
|
name: 'theming.targets',
|
|
@@ -122,7 +122,7 @@ export const doc = {
|
|
|
122
122
|
name: 'theming.derived',
|
|
123
123
|
type: 'ComponentThemingDerivedVar[]',
|
|
124
124
|
description:
|
|
125
|
-
|
|
125
|
+
"Maps standard CSS properties to internal vars for theme-pipeline expansion. Ordered by priority: earlier entries emit first. The pipeline reads only Core components' entries, so an integration's have no effect.",
|
|
126
126
|
},
|
|
127
127
|
],
|
|
128
128
|
},
|
|
@@ -187,13 +187,13 @@ export const doc = {
|
|
|
187
187
|
name: 'components',
|
|
188
188
|
type: '(ComponentEntry | ComponentRef)[]',
|
|
189
189
|
description:
|
|
190
|
-
'MultiComponentDoc variant (required there): one entry per public component/hook exported from the directory. Each entry is a full ComponentEntry (inline: name, displayName, description, props | params+returns) or a name-only ComponentRef pointing at a sibling {Name}.doc.mjs.',
|
|
190
|
+
'MultiComponentDoc variant (required there): one entry per public component/hook exported from the directory. Each entry is a full ComponentEntry (inline: name, displayName, description, props | params+returns) or a name-only ComponentRef pointing at a sibling {Name}.doc.mjs. In an integration, each full entry the module named by `import` exports is a component under its own name.',
|
|
191
191
|
},
|
|
192
192
|
{
|
|
193
193
|
name: 'subComponentOf',
|
|
194
194
|
type: 'string',
|
|
195
195
|
description:
|
|
196
|
-
"SubComponentDoc variant (required there): the parent component's `name` (e.g. 'Chat'). Marks this file as a sub-component doc
|
|
196
|
+
"SubComponentDoc variant (required there): the parent component's `name` (e.g. 'Chat'). Marks this file as a sub-component doc. The CLI does not copy family fields (group, category, keywords, theming, playground) from the parent to an integration's sub-component: its detail, list group and search use only what its own doc sets. Set any the child needs in its own doc.",
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
199
|
name: 'description',
|
|
@@ -206,9 +206,10 @@ export const doc = {
|
|
|
206
206
|
{
|
|
207
207
|
label: 'SingleComponentDoc (props on the doc)',
|
|
208
208
|
code: `/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
209
|
-
export
|
|
210
|
-
|
|
211
|
-
|
|
209
|
+
export default {
|
|
210
|
+
type: 'component',
|
|
211
|
+
name: 'AcmeSwitch',
|
|
212
|
+
displayName: 'Acme Switch',
|
|
212
213
|
category: 'Form Controls',
|
|
213
214
|
keywords: ['toggle', 'switch', 'on off'],
|
|
214
215
|
usage: {
|
|
@@ -229,17 +230,18 @@ export const docs = {
|
|
|
229
230
|
{
|
|
230
231
|
label: 'MultiComponentDoc (a components array)',
|
|
231
232
|
code: `/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
232
|
-
export
|
|
233
|
-
|
|
234
|
-
|
|
233
|
+
export default {
|
|
234
|
+
type: 'component',
|
|
235
|
+
name: 'AcmeTable',
|
|
236
|
+
displayName: 'Acme Table',
|
|
235
237
|
category: 'Table & List',
|
|
236
238
|
usage: {description: 'Displays rows and columns of data. Compose the sub-components to build headers, rows, and cells.'},
|
|
237
239
|
components: [
|
|
238
|
-
{name: '
|
|
239
|
-
{name: '
|
|
240
|
+
{name: 'AcmeTable', displayName: 'Acme Table', description: 'The table container.', props: []},
|
|
241
|
+
{name: 'AcmeTableRow', displayName: 'Acme Table Row', description: 'A row within the table body.', props: [
|
|
240
242
|
{name: 'isSelected', type: 'boolean', description: 'Highlights the row as selected.'},
|
|
241
243
|
]},
|
|
242
|
-
{name: '
|
|
244
|
+
{name: 'useAcmeTableSelection', displayName: 'useAcmeTableSelection', description: 'Manages row selection state.',
|
|
243
245
|
params: [{name: 'rows', type: 'T[]', description: 'The rows to track.', required: true}],
|
|
244
246
|
returns: [{name: 'selectedIds', type: 'Set<string>', description: 'Currently selected row ids.'}]},
|
|
245
247
|
],
|
|
@@ -249,7 +251,7 @@ export const docs = {
|
|
|
249
251
|
notes: [
|
|
250
252
|
{
|
|
251
253
|
type: 'prose',
|
|
252
|
-
text: "When it loads, a stamped component doc is checked as loosely as an unstamped one, so adding `type: 'component'` to
|
|
254
|
+
text: "When it loads, a stamped component doc is checked about as loosely as an unstamped one, so adding `type: 'component'` to a doc that follows the type never breaks it: `displayName` may be missing, `category` may be any string, `usage`, `theming` and `playground` are not checked, and `examples` need only be an array. Unlike an unstamped doc, each entry in a group doc's `components` must have a `name`, and `import` and `replaces`, when set, must be non-empty strings. Write to the type anyway; it is the contract.",
|
|
253
255
|
},
|
|
254
256
|
{
|
|
255
257
|
type: 'prose',
|
|
@@ -261,7 +263,7 @@ export const docs = {
|
|
|
261
263
|
items: [
|
|
262
264
|
'SingleComponentDoc: one primary component; put props directly on the doc via `props`. Use for Switch, Badge, Spinner, TextInput.',
|
|
263
265
|
'MultiComponentDoc: a directory exporting several components/hooks; list them in `components` (inline ComponentEntry or name-only ComponentRef). Use for Table, Dialog, TabList.',
|
|
264
|
-
|
|
266
|
+
"SubComponentDoc: a single sub-component in its own {Name}.doc.mjs inside the parent directory; set `subComponentOf` to the parent name. It does not take the parent's family fields, and it may omit `usage`.",
|
|
265
267
|
],
|
|
266
268
|
},
|
|
267
269
|
{
|
|
@@ -269,11 +271,12 @@ export const docs = {
|
|
|
269
271
|
lang: 'js',
|
|
270
272
|
label: 'SubComponentDoc',
|
|
271
273
|
code: `/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
272
|
-
export
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
274
|
+
export default {
|
|
275
|
+
type: 'component',
|
|
276
|
+
name: 'AcmeChatComposer',
|
|
277
|
+
displayName: 'Acme Chat Composer',
|
|
278
|
+
subComponentOf: 'AcmeChat',
|
|
279
|
+
description: 'The message input row within an Acme Chat, with an editor and send affordance.',
|
|
277
280
|
props: [
|
|
278
281
|
{name: 'onSend', type: '(text: string) => void', description: 'Called when the user submits a message.', required: true},
|
|
279
282
|
],
|
|
@@ -281,7 +284,7 @@ export const docs = {
|
|
|
281
284
|
},
|
|
282
285
|
{
|
|
283
286
|
type: 'prose',
|
|
284
|
-
text: "The stamped format is `export default { type: 'component', ... }
|
|
287
|
+
text: "The stamped format is `export default { type: 'component', ... }`, which `astryx integration add component` writes; legacy docs use `export const docs = {...}` and omit `type` (the parser shape-sniffs). A hook that is part of a component API is listed in a MultiComponentDoc `components` array: inline as a ComponentEntry (with `params`/`returns`), or by name with its own SubComponentDoc file, as Core's useTableSelection is.",
|
|
285
288
|
},
|
|
286
289
|
],
|
|
287
290
|
};
|
|
@@ -338,15 +338,17 @@ export interface SingleComponentDoc extends ComponentBaseDoc {
|
|
|
338
338
|
* `subComponentOf` field, which names the parent component.
|
|
339
339
|
*
|
|
340
340
|
* A sub-component owns its `description`, `props`, and (optionally) its own
|
|
341
|
-
* `usage`.
|
|
342
|
-
* `playground`)
|
|
343
|
-
*
|
|
344
|
-
*
|
|
341
|
+
* `usage`. The CLI does not copy family-level fields (`group`, `category`,
|
|
342
|
+
* `keywords`, `theming`, `playground`) from the parent to an integration's
|
|
343
|
+
* sub-component: its detail, list group and search use only what its own doc
|
|
344
|
+
* sets. Set any the child needs in its own doc. The generated registry entry
|
|
345
|
+
* is identical to the legacy inline `components[]` expansion — this is purely
|
|
346
|
+
* a file-structure change.
|
|
345
347
|
*/
|
|
346
348
|
export interface SubComponentDoc extends Omit<ComponentBaseDoc, 'usage'> {
|
|
347
349
|
/** Name of the parent component this sub-component belongs to, matching the
|
|
348
350
|
* parent doc's `name` (e.g. `"Chat"`). Marks this file as a sub-component
|
|
349
|
-
* doc
|
|
351
|
+
* doc. The CLI does not copy the parent's family fields to it. */
|
|
350
352
|
subComponentOf: string;
|
|
351
353
|
/** One-sentence description of what this sub-component does and its role
|
|
352
354
|
* within the parent composition. */
|
|
@@ -16,13 +16,15 @@ export const doc = {
|
|
|
16
16
|
description:
|
|
17
17
|
'The doc-type for a closed vocabulary: a fixed set of literal values such as ' +
|
|
18
18
|
'error codes or response-type discriminants. Colocated as a `.doc.mjs` next to ' +
|
|
19
|
-
'the source of truth it documents.'
|
|
19
|
+
'the source of truth it documents. Only the CLI reads enum docs, from its own ' +
|
|
20
|
+
"source: one in an integration's docs directory fails to load, and so do that package's other docs.",
|
|
20
21
|
appliesTo: '<enum>.doc.mjs',
|
|
21
22
|
fields: [
|
|
22
23
|
{
|
|
23
24
|
name: 'type',
|
|
24
25
|
type: "'enum'",
|
|
25
|
-
description:
|
|
26
|
+
description:
|
|
27
|
+
'Doc-kind discriminant. Optional in the type, but the CLI reads a doc as an enum doc only when it is set; without it the doc drops out of the docs tree.',
|
|
26
28
|
},
|
|
27
29
|
{
|
|
28
30
|
name: 'name',
|
|
@@ -54,7 +56,8 @@ export const doc = {
|
|
|
54
56
|
{
|
|
55
57
|
name: 'aliases',
|
|
56
58
|
type: 'string[]',
|
|
57
|
-
description:
|
|
59
|
+
description:
|
|
60
|
+
'Reserved: alternate slugs for this doc. Nothing reads it today, so `astryx docs <alias>` does not open it.',
|
|
58
61
|
},
|
|
59
62
|
{
|
|
60
63
|
name: 'members',
|
|
@@ -91,7 +94,7 @@ export const doc = {
|
|
|
91
94
|
type: 'enum',
|
|
92
95
|
name: 'error-codes',
|
|
93
96
|
displayName: 'Error Codes',
|
|
94
|
-
namespace: 'cli',
|
|
97
|
+
namespace: 'cli/api',
|
|
95
98
|
description: 'Stable error codes thrown by the CLI/API and surfaced in the JSON envelope.',
|
|
96
99
|
members: [
|
|
97
100
|
{value: 'ERR_UNKNOWN_TOPIC', description: 'The requested docs topic does not exist.'},
|
|
@@ -18,7 +18,7 @@ export const doc = {
|
|
|
18
18
|
'functions. A hook (HookDoc) is the hook-flavored view of this same kind; FunctionDoc ' +
|
|
19
19
|
'adds the fields an API function needs (a {type, data} return envelope, thrown error ' +
|
|
20
20
|
'codes, the wrapping CLI command). The CLI binding itself lives in a separate CommandDoc.',
|
|
21
|
-
appliesTo: 'api/<
|
|
21
|
+
appliesTo: 'api/<dir>/<name>.doc.mjs',
|
|
22
22
|
fields: [
|
|
23
23
|
{
|
|
24
24
|
name: 'type',
|
|
@@ -41,7 +41,7 @@ export const doc = {
|
|
|
41
41
|
name: 'kind',
|
|
42
42
|
type: "'hook' | 'api'",
|
|
43
43
|
description:
|
|
44
|
-
|
|
44
|
+
"Which flavor. Nothing reads it today: no reader sections docs by it or infers it from `importPath`. The CLI's API function docs set 'api'.",
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
name: 'summary',
|
|
@@ -57,12 +57,13 @@ export const doc = {
|
|
|
57
57
|
name: 'namespace',
|
|
58
58
|
type: 'string',
|
|
59
59
|
description:
|
|
60
|
-
"Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's API functions use 'cli/api', which the docs tree adopts by kind: each is the leaf `cli/api/functions/<name
|
|
60
|
+
"Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's API functions use 'cli/api', which the docs tree adopts by kind: each is the leaf `cli/api/functions/<name>`, the name in kebab case (`themeUse` is `theme-use`). Every function doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
name: 'aliases',
|
|
64
64
|
type: 'string[]',
|
|
65
|
-
description:
|
|
65
|
+
description:
|
|
66
|
+
'Reserved: other names for this doc. Nothing reads it today, so they do not resolve to it.',
|
|
66
67
|
},
|
|
67
68
|
{
|
|
68
69
|
name: 'keywords',
|
|
@@ -231,11 +232,11 @@ export const doc = {
|
|
|
231
232
|
displayName: 'search()',
|
|
232
233
|
namespace: 'cli/api',
|
|
233
234
|
importPath: '@astryxdesign/cli/api',
|
|
234
|
-
summary: 'Find components, hooks, docs, and
|
|
235
|
+
summary: 'Find components, hooks, docs, templates, and themes by term.',
|
|
235
236
|
signature: 'search(query, options?): Promise<SearchResponse>',
|
|
236
237
|
params: [
|
|
237
238
|
{name: 'query', type: 'string', description: 'The search term.', required: true},
|
|
238
|
-
{name: 'options.type', type: "'component' | 'hook' | 'doc' | 'template'", description: 'Restrict results to one domain.'},
|
|
239
|
+
{name: 'options.type', type: "'component' | 'hook' | 'doc' | 'template' | 'theme'", description: 'Restrict results to one domain.'},
|
|
239
240
|
],
|
|
240
241
|
returns: [
|
|
241
242
|
{type: 'search', description: 'Envelope with the query and ranked results[].'},
|
|
@@ -253,11 +254,11 @@ export const doc = {
|
|
|
253
254
|
notes: [
|
|
254
255
|
{
|
|
255
256
|
type: 'prose',
|
|
256
|
-
text: '
|
|
257
|
+
text: '`parseDoc` accepts a stamped function doc without `displayName` and does not check its `usage`, and the CLI reads its own function docs without checking them. Write to the type anyway; it is the contract.',
|
|
257
258
|
},
|
|
258
259
|
{
|
|
259
260
|
type: 'prose',
|
|
260
|
-
text: "The `type` discriminant is 'function' for both flavors.
|
|
261
|
+
text: "The `type` discriminant is 'function' for both flavors. `kind: 'hook'` or `kind: 'api'` names the flavor; nothing reads it today.",
|
|
261
262
|
},
|
|
262
263
|
{
|
|
263
264
|
type: 'prose',
|
|
@@ -16,7 +16,8 @@ export const doc = {
|
|
|
16
16
|
'The doc-type for a standalone React hook (e.g. useMediaQuery, useFocusTrap, ' +
|
|
17
17
|
'useOverflow) that gets its own `.doc.mjs`. Hooks that are part of a component API ' +
|
|
18
18
|
"(e.g. useImperativeDialog) belong in that component's MultiComponentDoc `components` " +
|
|
19
|
-
"array instead. `HookDoc` is the hook-flavored view of the shared `type: 'function'` kind."
|
|
19
|
+
"array instead. `HookDoc` is the hook-flavored view of the shared `type: 'function'` kind. " +
|
|
20
|
+
"`astryx hook` reads Core's hook docs only; an integration lists its hooks in a component doc's `components` array.",
|
|
20
21
|
appliesTo: '{useX}.doc.mjs',
|
|
21
22
|
fields: [
|
|
22
23
|
{
|
|
@@ -195,14 +196,14 @@ export const docs = {
|
|
|
195
196
|
description:
|
|
196
197
|
'Subscribes to a CSS media query and re-renders when it changes. Use for responsive behavior that CSS alone cannot express, such as swapping components by breakpoint.',
|
|
197
198
|
},
|
|
198
|
-
relatedHooks: ['
|
|
199
|
+
relatedHooks: ['useImageMode'],
|
|
199
200
|
};`,
|
|
200
201
|
},
|
|
201
202
|
],
|
|
202
203
|
notes: [
|
|
203
204
|
{
|
|
204
205
|
type: 'prose',
|
|
205
|
-
text: '
|
|
206
|
+
text: '`parseDoc` accepts a stamped hook doc without `displayName` and does not check its `usage`, and `astryx hook` prints a hook doc without checking it at all. Write to the type anyway; it is the contract.',
|
|
206
207
|
},
|
|
207
208
|
{
|
|
208
209
|
type: 'prose',
|
|
@@ -210,7 +211,7 @@ export const docs = {
|
|
|
210
211
|
},
|
|
211
212
|
{
|
|
212
213
|
type: 'prose',
|
|
213
|
-
text: "
|
|
214
|
+
text: "A hook that is part of a component API is listed in that component's MultiComponentDoc `components` array: inline with `params`/`returns`, or by name with its own SubComponentDoc file, as Core's useTableSelection is.",
|
|
214
215
|
},
|
|
215
216
|
],
|
|
216
217
|
};
|
|
@@ -55,7 +55,8 @@ export const doc = {
|
|
|
55
55
|
{
|
|
56
56
|
name: 'audience',
|
|
57
57
|
type: "'public' | 'internal'",
|
|
58
|
-
description:
|
|
58
|
+
description:
|
|
59
|
+
"Reserved: bundle audience. Nothing reads it yet: a namespace that sets 'internal' still shows in `astryx docs`.",
|
|
59
60
|
default: "'public'",
|
|
60
61
|
},
|
|
61
62
|
{
|
|
@@ -67,7 +68,7 @@ export const doc = {
|
|
|
67
68
|
name: 'slots',
|
|
68
69
|
type: 'Record<string, NamespaceSlot>',
|
|
69
70
|
description:
|
|
70
|
-
|
|
71
|
+
"Named placement and collection targets. Each slot declares a title and the doc kinds it accepts. `accepts.providers` is not read yet: only docs of the namespace's own package can be placed in a slot.",
|
|
71
72
|
required: true,
|
|
72
73
|
},
|
|
73
74
|
{
|
|
@@ -80,7 +81,7 @@ export const doc = {
|
|
|
80
81
|
name: 'blocks',
|
|
81
82
|
type: '(ReferenceContentBlock | GraphContentBlock)[]',
|
|
82
83
|
description:
|
|
83
|
-
'Ordered layout content for the namespace page. Graph-only workflow, collection, and reference blocks are available here without widening the stable ReferenceContentBlock union used by existing topic renderers.
|
|
84
|
+
'Ordered layout content for the namespace page. Graph-only workflow, collection, and reference blocks are available here without widening the stable ReferenceContentBlock union used by existing topic renderers. `astryx docs <route>` prints the prose, heading, code, table, and list blocks above the slots, and `--json` returns every block with its links resolved. A collection block is not rendered yet, and `astryx doctor` warns on one.',
|
|
84
85
|
},
|
|
85
86
|
],
|
|
86
87
|
examples: [
|
|
@@ -100,7 +101,7 @@ export const docs = {
|
|
|
100
101
|
},
|
|
101
102
|
},
|
|
102
103
|
adopts: [{
|
|
103
|
-
source: {group: 'cli
|
|
104
|
+
source: {group: 'cli/commands', kinds: ['command']},
|
|
104
105
|
into: 'reference',
|
|
105
106
|
}],
|
|
106
107
|
};`,
|
|
@@ -109,11 +110,11 @@ export const docs = {
|
|
|
109
110
|
notes: [
|
|
110
111
|
{
|
|
111
112
|
type: 'prose',
|
|
112
|
-
text: "The docs tree reads namespace docs from the CLI and from every configured integration. An integration's namespace doc is a top-level level of the tree, and its guides name it with `placement`; a doc can be placed only in a namespace of its own package. When two packages claim one route, the CLI's own docs win, then integrations in configured order, and `astryx doctor` names the loser.",
|
|
113
|
+
text: "The docs tree reads namespace docs from the CLI and from every configured integration. An integration's namespace doc without a `placement` is a top-level level of the tree, and its guides name it with `placement`; a doc can be placed only in a namespace of its own package. When two packages claim one route, the CLI's own docs win, then integrations in configured order, and `astryx doctor` names the loser.",
|
|
113
114
|
},
|
|
114
115
|
{
|
|
115
116
|
type: 'prose',
|
|
116
|
-
text: 'Child docs request one canonical home with placement.
|
|
117
|
+
text: 'Child docs request one canonical home with placement. A collection block refers to those docs by stable reference and never creates a second identity or parent. It is not rendered yet: `astryx doctor` warns on one.',
|
|
117
118
|
},
|
|
118
119
|
{
|
|
119
120
|
type: 'list',
|
|
@@ -18,7 +18,8 @@ export const doc = {
|
|
|
18
18
|
'accessibility, migration guides. Unlike ComponentDoc it is not tied to a component: ' +
|
|
19
19
|
'drop a `.doc.mjs` in the docs directory and it shows up in `astryx docs`. Content is ' +
|
|
20
20
|
'built from ordered sections of mixed content blocks.',
|
|
21
|
-
appliesTo:
|
|
21
|
+
appliesTo:
|
|
22
|
+
"<topic>.doc.{ts,mjs,js} in the folder the integration manifest's `docs` names",
|
|
22
23
|
fields: [
|
|
23
24
|
{
|
|
24
25
|
name: 'type',
|
|
@@ -69,7 +70,7 @@ export const doc = {
|
|
|
69
70
|
name: 'extends',
|
|
70
71
|
type: 'string',
|
|
71
72
|
description:
|
|
72
|
-
"Name of an existing topic this doc merges onto, section by section
|
|
73
|
+
"Name of an existing topic this doc merges onto, section by section. A section replaces the base section with the same `id`, or else the one with exactly its title when either of the two has no `id`. A key derived from a title counts only against an `id`: a section without an `id` also matches a base section whose `id` is the key its title derives, and a section with an `id` also matches a base section without one whose title derives that `id`. Two different `id`s never match, two sections without an `id` whose titles differ only in case or punctuation stay separate, and a section that matches none is appended. The topic keeps the base's title and description. For correcting or adding to a topic rather than owning it. Exclusive with `replaces`.",
|
|
73
74
|
example: "'theme'",
|
|
74
75
|
},
|
|
75
76
|
{
|
|
@@ -83,7 +84,7 @@ export const doc = {
|
|
|
83
84
|
name: 'sections[].id',
|
|
84
85
|
type: 'string',
|
|
85
86
|
description:
|
|
86
|
-
'Stable section anchor. New docs should set this instead of relying on a mutable title.',
|
|
87
|
+
'Stable section anchor. New docs should set this instead of relying on a mutable title. Published @astryxdesign/cli 0.6.3 and earlier reject the field and hide every doc topic the package ships, so `astryx integration verify` fails an integration that sets one until it declares an `@astryxdesign/cli` peer of `>=0.6.4`.',
|
|
87
88
|
},
|
|
88
89
|
{
|
|
89
90
|
name: 'sections[].title',
|
|
@@ -109,7 +110,7 @@ export const doc = {
|
|
|
109
110
|
name: 'sections[].previewType',
|
|
110
111
|
type: 'ReferenceTokenPreviewType',
|
|
111
112
|
description:
|
|
112
|
-
|
|
113
|
+
'Preview type for token tables in this section. The CLI rejects a value not in the list below and returns the value in `astryx docs --json`, but draws no preview from it. Omit for non-token sections.',
|
|
113
114
|
},
|
|
114
115
|
],
|
|
115
116
|
},
|
|
@@ -117,17 +118,17 @@ export const doc = {
|
|
|
117
118
|
name: 'tokenCategory',
|
|
118
119
|
type: 'string',
|
|
119
120
|
description:
|
|
120
|
-
"Token category for foundational docs that map to a token section (e.g. 'color').
|
|
121
|
+
"Token category for foundational docs that map to a token section (e.g. 'color'). `astryx docs --json` returns it as authored; no tokens page links to the doc through it.",
|
|
121
122
|
},
|
|
122
123
|
],
|
|
123
124
|
examples: [
|
|
124
125
|
{
|
|
125
126
|
label: 'A reference doc with one section',
|
|
126
127
|
code: `/** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
|
|
127
|
-
export
|
|
128
|
+
export default {
|
|
128
129
|
type: 'generic',
|
|
129
|
-
name: 'spacing',
|
|
130
|
-
title: 'Spacing',
|
|
130
|
+
name: 'acme-spacing',
|
|
131
|
+
title: 'Acme Spacing',
|
|
131
132
|
description: 'Spacing tokens for gap, margin, and padding.',
|
|
132
133
|
category: 'foundations',
|
|
133
134
|
tokenCategory: 'spacing',
|
|
@@ -194,7 +195,7 @@ type ReferenceDocBlock = {
|
|
|
194
195
|
|
|
195
196
|
type GraphContentBlock =
|
|
196
197
|
| { type: 'workflow'; title?: string; steps: WorkflowStep[] }
|
|
197
|
-
| { type: 'collection'; source: {slot: string}; presentation?: 'list' | 'cards' | 'compact'; whenEmpty?: 'show' | 'omit' }
|
|
198
|
+
| { type: 'collection'; title?: string; source: {slot: string}; presentation?: 'list' | 'cards' | 'compact'; whenEmpty?: 'show' | 'omit' }
|
|
198
199
|
| ReferenceDocBlock;`,
|
|
199
200
|
},
|
|
200
201
|
{
|
|
@@ -203,7 +204,7 @@ type GraphContentBlock =
|
|
|
203
204
|
},
|
|
204
205
|
{
|
|
205
206
|
type: 'prose',
|
|
206
|
-
text: "A section may set `previewType
|
|
207
|
+
text: "A section may set `previewType`, a hint for previewing its token table, to one of 'swatch' | 'shadow-box' | 'radius-box' | 'spacing-bar' | 'size-bar' | 'border-line' | 'duration-bar' | 'easing-curve' | 'font-sample'; the CLI rejects any other value.",
|
|
207
208
|
},
|
|
208
209
|
],
|
|
209
210
|
};
|
|
@@ -55,7 +55,7 @@ export const doc = {
|
|
|
55
55
|
name: 'aliases',
|
|
56
56
|
type: 'string[]',
|
|
57
57
|
description:
|
|
58
|
-
'
|
|
58
|
+
'Reserved: alternate slugs for this doc. Nothing reads it yet: `astryx docs` finds a schema doc by its `name` only.',
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
name: 'appliesTo',
|
|
@@ -141,7 +141,7 @@ export const doc = {
|
|
|
141
141
|
name: 'notes',
|
|
142
142
|
type: 'ReferenceContentBlock[]',
|
|
143
143
|
description:
|
|
144
|
-
'Freeform prose/notes rendered after the field table.
|
|
144
|
+
'Freeform prose/notes rendered after the field table and examples. The stable ReferenceContentBlock union (prose, heading, code, table, list, token-ref), without the reference block a ReferenceDoc section also takes; a token-ref note is accepted but not rendered.',
|
|
145
145
|
},
|
|
146
146
|
],
|
|
147
147
|
examples: [
|
|
@@ -152,17 +152,17 @@ export const doc = {
|
|
|
152
152
|
type: 'schema',
|
|
153
153
|
name: 'integration',
|
|
154
154
|
displayName: 'Astryx Integration',
|
|
155
|
-
namespace: '
|
|
156
|
-
description: 'The astryx.integration.* manifest that
|
|
155
|
+
namespace: 'authoring',
|
|
156
|
+
description: 'The astryx.integration.* manifest that points the CLI at what a package contributes.',
|
|
157
157
|
appliesTo: 'astryx.integration.{ts,mjs,js}',
|
|
158
158
|
fields: [
|
|
159
|
-
{name: '
|
|
159
|
+
{name: 'docs', type: 'string', description: 'The folder that holds your doc topics, relative to package.json.'},
|
|
160
160
|
{
|
|
161
|
-
name: '
|
|
162
|
-
type: '{
|
|
163
|
-
description: '
|
|
161
|
+
name: 'agentDocs',
|
|
162
|
+
type: '{ append?: readonly string[] }',
|
|
163
|
+
description: 'Guidance your package adds to the agent instructions the CLI manages.',
|
|
164
164
|
fields: [
|
|
165
|
-
{name: '
|
|
165
|
+
{name: 'agentDocs.append', type: 'readonly string[]', description: 'Lines added at the end, at most eight.'},
|
|
166
166
|
],
|
|
167
167
|
},
|
|
168
168
|
],
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file SchemaDoc for the `IntegrationTemplateDoc` doc-type — the template
|
|
6
|
+
* metadata an integration package ships: TemplateDoc, with the package's own
|
|
7
|
+
* `category`. Colocated with the type it describes (`type.ts`).
|
|
8
|
+
* @position packages/cli/authoring/doctypes/template — doc-type documentation
|
|
9
|
+
*/
|
|
10
|
+
/** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
|
|
11
|
+
export const doc: import("@astryxdesign/cli/authoring").SchemaDoc;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file SchemaDoc for the `IntegrationTemplateDoc` doc-type — the template
|
|
5
|
+
* metadata an integration package ships: TemplateDoc, with the package's own
|
|
6
|
+
* `category`. Colocated with the type it describes (`type.ts`).
|
|
7
|
+
* @position packages/cli/authoring/doctypes/template — doc-type documentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
|
|
11
|
+
export const doc = {
|
|
12
|
+
type: 'schema',
|
|
13
|
+
name: 'integration-template-doc',
|
|
14
|
+
displayName: 'IntegrationTemplateDoc',
|
|
15
|
+
namespace: 'authoring',
|
|
16
|
+
description:
|
|
17
|
+
"The doc-type for an integration package's template metadata. It has every " +
|
|
18
|
+
"TemplateDoc field and rule, except that `category` is the package's own " +
|
|
19
|
+
'string instead of a TemplateCategory value.',
|
|
20
|
+
appliesTo: '<Name>.doc.mjs',
|
|
21
|
+
fields: [
|
|
22
|
+
{
|
|
23
|
+
name: 'category',
|
|
24
|
+
type: 'string',
|
|
25
|
+
description:
|
|
26
|
+
"The package's own category. Bare `astryx template` groups the package's templates by it.",
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
examples: [
|
|
30
|
+
{
|
|
31
|
+
label: 'Block template in an integration package',
|
|
32
|
+
code: `/** @type {import('@astryxdesign/cli/authoring').IntegrationTemplateDoc} */
|
|
33
|
+
export default {
|
|
34
|
+
type: 'block',
|
|
35
|
+
name: 'acme-pricing-table',
|
|
36
|
+
displayName: 'Pricing Table',
|
|
37
|
+
description: 'Plans side by side, with the chosen plan highlighted.',
|
|
38
|
+
aspectRatio: 16 / 9,
|
|
39
|
+
category: 'Acme - Commerce',
|
|
40
|
+
};`,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
notes: [
|
|
44
|
+
{
|
|
45
|
+
type: 'prose',
|
|
46
|
+
text: "Every other field, and the page and block variants, are TemplateDoc's. Core's own templates use TemplateDoc, whose `category` is a TemplateCategory value. `astryx doctor integration validate` checks an integration's template docs against IntegrationTemplateDoc.",
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
@@ -18,7 +18,9 @@ export type BlockTemplateDoc = import("./type.js").BlockTemplateDoc;
|
|
|
18
18
|
* Templates as they load. Integration templates already published omit
|
|
19
19
|
* `displayName` and `aspectRatio` and group themselves under their own
|
|
20
20
|
* `category`, so the loader accepts those (template discovery falls back to an
|
|
21
|
-
* aspect ratio of 1). The published
|
|
21
|
+
* aspect ratio of 1). The published `TemplateDoc` keeps asking authors for all
|
|
22
|
+
* three; `IntegrationTemplateDoc`, for an integration package's templates,
|
|
23
|
+
* takes the package's own `category`.
|
|
22
24
|
*/
|
|
23
25
|
export type LoadedPageTemplateDoc = Omit<PageTemplateDoc, "displayName" | "category"> & {
|
|
24
26
|
displayName?: string;
|
|
@@ -28,7 +30,9 @@ export type LoadedPageTemplateDoc = Omit<PageTemplateDoc, "displayName" | "categ
|
|
|
28
30
|
* Templates as they load. Integration templates already published omit
|
|
29
31
|
* `displayName` and `aspectRatio` and group themselves under their own
|
|
30
32
|
* `category`, so the loader accepts those (template discovery falls back to an
|
|
31
|
-
* aspect ratio of 1). The published
|
|
33
|
+
* aspect ratio of 1). The published `TemplateDoc` keeps asking authors for all
|
|
34
|
+
* three; `IntegrationTemplateDoc`, for an integration package's templates,
|
|
35
|
+
* takes the package's own `category`.
|
|
32
36
|
*/
|
|
33
37
|
export type LoadedBlockTemplateDoc = Omit<BlockTemplateDoc, "displayName" | "aspectRatio" | "category"> & {
|
|
34
38
|
displayName?: string;
|
|
@@ -78,7 +78,9 @@ const blockTemplateSchema = z
|
|
|
78
78
|
* Templates as they load. Integration templates already published omit
|
|
79
79
|
* `displayName` and `aspectRatio` and group themselves under their own
|
|
80
80
|
* `category`, so the loader accepts those (template discovery falls back to an
|
|
81
|
-
* aspect ratio of 1). The published
|
|
81
|
+
* aspect ratio of 1). The published `TemplateDoc` keeps asking authors for all
|
|
82
|
+
* three; `IntegrationTemplateDoc`, for an integration package's templates,
|
|
83
|
+
* takes the package's own `category`.
|
|
82
84
|
*
|
|
83
85
|
* @typedef {Omit<PageTemplateDoc, 'displayName' | 'category'>
|
|
84
86
|
* & {displayName?: string, category?: string}} LoadedPageTemplateDoc
|
|
@@ -31,14 +31,14 @@ export const doc = {
|
|
|
31
31
|
name: 'name',
|
|
32
32
|
type: 'string',
|
|
33
33
|
description:
|
|
34
|
-
|
|
34
|
+
"Stable identifier for block templates; change `displayName`, not `name`, to edit their visible label in the gallery. For page templates it is a human-readable label, while the existing template-directory/CLI slug owns the default registry path. `astryx template --list` and `astryx search` print `name` as the label of both, and `astryx template <id>` finds a template by its id, never by `name`: an integration template's id is its path under the templates folder without the `.doc.*` suffix.",
|
|
35
35
|
required: true,
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
name: 'displayName',
|
|
39
39
|
type: 'string',
|
|
40
40
|
description:
|
|
41
|
-
"Human-readable label for the gallery
|
|
41
|
+
"Human-readable label for the gallery. The CLI prints `name` instead; `astryx template --list --json` also returns an integration template's `displayName`. Spaces out block names that mirror a PascalCase component ('ChatMessageMetadata' → 'Chat Message Metadata').",
|
|
42
42
|
required: true,
|
|
43
43
|
},
|
|
44
44
|
{
|
|
@@ -162,7 +162,7 @@ export default {
|
|
|
162
162
|
notes: [
|
|
163
163
|
{
|
|
164
164
|
type: 'prose',
|
|
165
|
-
text: 'When it loads, a template may leave out `displayName` and `aspectRatio` and use its own `category`, as integration templates already published do; a block with no `aspectRatio` previews at 1. Write to the type anyway; it is the contract
|
|
165
|
+
text: 'When it loads, a template may leave out `displayName` and `aspectRatio` and use its own `category`, as integration templates already published do; a block with no `aspectRatio` previews at 1. Write to the type anyway; it is the contract, and `astryx doctor integration validate` warns about an integration template that leaves out `displayName` or `aspectRatio`.',
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
type: 'prose',
|