@astryxdesign/cli 0.7.2-canary.f16dc9f → 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 +41 -1
- package/api/component/_adapter.mjs +93 -7
- package/api/component/component.mjs +22 -5
- package/api/component/component.test.mjs +420 -167
- package/api/component/integration-export-name.test.mjs +644 -0
- package/api/component/list/list.mjs +42 -4
- 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 +67 -4
- 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 +61 -107
- package/api/integration/pack-check.test.mjs +359 -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 +22 -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 +141 -25
- package/api/search/search.test.mjs +36 -0
- package/api/swizzle/copy/copy.mjs +28 -14
- package/api/template/template.test.mjs +120 -3
- package/api/theme/build/build.family.test.mjs +64 -0
- package/api/theme/build/build.mjs +180 -24
- package/api/theme/themeBuild.doc.mjs +4 -4
- package/assets/codemods/transforms/next/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
- package/assets/codemods/transforms/next/index.mjs +11 -1
- package/assets/codemods/transforms/next/migrate-list-edge-compensation-to-edge.mjs +198 -0
- 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 +10 -2
- 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/docs/working-with-ai.doc.mjs +43 -4
- package/assets/templates/blocks/components/Drawer/DrawerForm.doc.mjs +24 -0
- package/assets/templates/blocks/components/Drawer/DrawerForm.tsx +62 -0
- package/assets/templates/blocks/components/Drawer/DrawerScrim.doc.mjs +22 -0
- package/assets/templates/blocks/components/Drawer/DrawerScrim.tsx +68 -0
- package/assets/templates/blocks/components/Drawer/DrawerShowcase.doc.mjs +22 -0
- package/assets/templates/blocks/components/Drawer/DrawerShowcase.tsx +41 -0
- package/assets/templates/blocks/components/Drawer/DrawerStart.doc.mjs +21 -0
- package/assets/templates/blocks/components/Drawer/DrawerStart.tsx +41 -0
- package/assets/templates/blocks/components/Drawer/DrawerWidths.doc.mjs +22 -0
- package/assets/templates/blocks/components/Drawer/DrawerWidths.tsx +54 -0
- package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderShowcase.tsx +73 -0
- package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderSubtitleEndContent.doc.mjs +22 -0
- package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderSubtitleEndContent.tsx +49 -0
- package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderWithCloseButton.doc.mjs +21 -0
- package/assets/templates/blocks/components/DrawerHeader/DrawerHeaderWithCloseButton.tsx +42 -0
- package/assets/templates/pages/detail-page/page.tsx +3 -3
- package/assets/templates/pages/table-inbox/page.tsx +10 -8
- 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/base/type.ts +6 -0
- package/authoring/doctypes/command/command.doc.mjs +14 -12
- package/authoring/doctypes/component/component.doc.mjs +31 -28
- package/authoring/doctypes/component/type.ts +13 -8
- 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 +224 -6
- package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
- 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/clients/cli/lib/component-format.mjs +5 -1
- 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 +190 -10
- package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
- package/foundation/discovery/component-discovery.mjs +864 -56
- package/foundation/discovery/component-discovery.test.mjs +96 -0
- package/foundation/discovery/component-replacement.mjs +18 -0
- package/foundation/discovery/component-replacement.test.mjs +40 -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 +27 -0
- package/foundation/discovery/module-exports.mjs +356 -31
- package/foundation/discovery/module-exports.test.mjs +172 -0
- 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/template-adapter.mjs +74 -5
- 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 +11 -1
- package/foundation/doc-compiler/inputs.mjs +23 -0
- package/foundation/doc-compiler/inputs.test.mjs +0 -1
- 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/foundation/xle/registry.mjs +4 -0
- package/foundation/xle/registry.test.mjs +28 -0
- package/package.json +10 -10
- package/scripts/postinstall.mjs +3 -3
|
@@ -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:
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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,
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
};
|
package/authoring/config/type.ts
CHANGED
|
@@ -115,8 +115,10 @@ export interface AstryxConfig {
|
|
|
115
115
|
/** Experimental XLE (layout expression) configuration. */
|
|
116
116
|
xle?: {
|
|
117
117
|
/**
|
|
118
|
-
*
|
|
119
|
-
*
|
|
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
|
|
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
|
|
16
|
-
appliesTo:
|
|
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
|
|
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:
|
|
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
|
},
|
|
@@ -383,6 +383,12 @@ export interface ComponentPropDoc {
|
|
|
383
383
|
* ```
|
|
384
384
|
*/
|
|
385
385
|
slotElements?: ComponentSlotElement[];
|
|
386
|
+
/** Lifecycle marker for a prop outside the stable compatibility promise
|
|
387
|
+
* (spec:AST-017 FR21). Set `'experimental'` on a stable component's
|
|
388
|
+
* optional `experimental` prop object, and say in `description` that its
|
|
389
|
+
* contents may change or be removed in a patch release. Omit for stable
|
|
390
|
+
* props. */
|
|
391
|
+
stability?: 'experimental';
|
|
386
392
|
}
|
|
387
393
|
|
|
388
394
|
/**
|
|
@@ -48,18 +48,20 @@ export const doc = {
|
|
|
48
48
|
{
|
|
49
49
|
name: 'description',
|
|
50
50
|
type: 'string',
|
|
51
|
-
description:
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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. --
|
|
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
|
|
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: '--
|
|
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
|
|
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
|
};
|
|
@@ -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
|
{
|
|
@@ -56,25 +56,25 @@ export const doc = {
|
|
|
56
56
|
name: 'replaces',
|
|
57
57
|
type: 'string',
|
|
58
58
|
description:
|
|
59
|
-
|
|
59
|
+
'Integration components only: the exact `name` of the Core ComponentDoc this component takes over for unqualified lookup, so every app that loads the integration gets it from component detail, component lists, search, `swizzle <Name>`, and issue routing; `swizzle --list` keeps listing Core names. The Core original stays reachable with `--package @astryxdesign/core`. It takes effect only when the package\'s peer range starts at the release that applies it, `"@astryxdesign/cli": ">=0.6.7"` or later; without such a range the component keeps its own name and `doctor integration components` warns. Set it only to intentionally own a Core identity; give an alternative or variant its own name instead.',
|
|
60
60
|
},
|
|
61
61
|
{
|
|
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
|
},
|
|
@@ -181,19 +181,19 @@ export const doc = {
|
|
|
181
181
|
name: 'props',
|
|
182
182
|
type: 'ComponentPropDoc[]',
|
|
183
183
|
description:
|
|
184
|
-
'SingleComponentDoc variant (required there): all public props for the one primary component. Each prop is {name, type, description, default?, required?, slotElements?}. Skip styling props like xstyle/className/style. Also present on SubComponentDoc.',
|
|
184
|
+
'SingleComponentDoc variant (required there): all public props for the one primary component. Each prop is {name, type, description, default?, required?, slotElements?, stability?}. Skip styling props like xstyle/className/style. Also present on SubComponentDoc.',
|
|
185
185
|
},
|
|
186
186
|
{
|
|
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
|
};
|
|
@@ -33,9 +33,12 @@ export interface ComponentBaseDoc extends AuthoredDocGraphFields {
|
|
|
33
33
|
type?: 'component';
|
|
34
34
|
/**
|
|
35
35
|
* Stable machine identity and directory name without the Astryx prefix,
|
|
36
|
-
* PascalCase (for example `Button`, `Table`, or `AppShell`).
|
|
37
|
-
*
|
|
38
|
-
*
|
|
36
|
+
* PascalCase (for example `Button`, `Table`, or `AppShell`). For an
|
|
37
|
+
* integration component it is the export apps import: the doc sits beside
|
|
38
|
+
* the file that exports it, and when that file exports nothing under its own
|
|
39
|
+
* name, `name` may name the export it does have. Do not change this to edit
|
|
40
|
+
* the visible label; use `displayName` for that. Registry URLs derive from
|
|
41
|
+
* this value by default.
|
|
39
42
|
*/
|
|
40
43
|
name: string;
|
|
41
44
|
/** Human-readable display name with spaces between words, used by the
|
|
@@ -335,15 +338,17 @@ export interface SingleComponentDoc extends ComponentBaseDoc {
|
|
|
335
338
|
* `subComponentOf` field, which names the parent component.
|
|
336
339
|
*
|
|
337
340
|
* A sub-component owns its `description`, `props`, and (optionally) its own
|
|
338
|
-
* `usage`.
|
|
339
|
-
* `playground`)
|
|
340
|
-
*
|
|
341
|
-
*
|
|
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.
|
|
342
347
|
*/
|
|
343
348
|
export interface SubComponentDoc extends Omit<ComponentBaseDoc, 'usage'> {
|
|
344
349
|
/** Name of the parent component this sub-component belongs to, matching the
|
|
345
350
|
* parent doc's `name` (e.g. `"Chat"`). Marks this file as a sub-component
|
|
346
|
-
* doc
|
|
351
|
+
* doc. The CLI does not copy the parent's family fields to it. */
|
|
347
352
|
subComponentOf: string;
|
|
348
353
|
/** One-sentence description of what this sub-component does and its role
|
|
349
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
|
};
|