@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.ee13359
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 +114 -76
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/build.doc.mjs +4 -3
- package/api/build/build.test.mjs +14 -3
- package/api/build/build.type.d.mts +36 -2
- package/api/build/build.type.mjs +25 -4
- package/api/build/help/help.d.mts +8 -5
- package/api/build/help/help.mjs +56 -6
- package/api/component/_adapter.d.mts +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/discover.doc.mjs +2 -1
- package/api/discover/discover.type.d.mts +4 -4
- package/api/discover/discover.type.mjs +10 -10
- package/api/docs/_adapter.d.mts +230 -41
- package/api/docs/_adapter.mjs +734 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +54 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +164 -4
- package/api/docs/docs.type.d.mts +205 -5
- package/api/docs/docs.type.mjs +137 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +547 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/doctor/doctor.d.mts +99 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +544 -1
- package/api/doctor/doctor.test.mjs +610 -1
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +1 -1
- package/api/index.mjs +1 -0
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +108 -31
- package/api/integration/authoring-checks.test.mjs +171 -6
- package/api/integration/authoring-checks.type.d.mts +3 -1
- package/api/integration/authoring-checks.type.mjs +3 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.mjs +7 -5
- package/api/integration/pack-check.mjs +83 -7
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +29 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +337 -41
- package/api/search/search.test.mjs +124 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/template-integration.test.mjs +1022 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +20 -3
- package/api/theme/add/add.staging.test.mjs +66 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.mjs +133 -42
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +27 -11
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +350 -102
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/next/index.mjs +19 -1
- package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +3 -3
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +4 -4
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +124 -25
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +1 -1
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +2 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +13 -13
- package/authoring/config/parse.mjs +8 -8
- package/authoring/config/type.ts +18 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/doctypes/_schema.d.mts +718 -23
- package/authoring/doctypes/_schema.mjs +519 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +5 -4
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +208 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +20 -5
- package/authoring/doctypes/reference/type.ts +53 -5
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +52 -17
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +5 -2
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +37 -49
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +40 -0
- package/clients/cli/commands/component/index.mjs +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +5 -3
- package/clients/cli/commands/discover.mjs +4 -4
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +238 -24
- package/clients/cli/commands/docs.test.mjs +193 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +83 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +30 -25
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +719 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -30
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +36 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +4 -0
- package/foundation/agent-docs/agent-docs.mjs +70 -3
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +10 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +75 -0
- package/foundation/discovery/authoring-self-docs.mjs +224 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +165 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +116 -11
- package/foundation/discovery/docs-discovery.mjs +389 -108
- package/foundation/discovery/docs-discovery.test.mjs +325 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +774 -83
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +34 -0
- package/foundation/doc-compiler/lenses.mjs +128 -0
- package/foundation/doc-compiler/links.d.mts +135 -0
- package/foundation/doc-compiler/links.mjs +253 -0
- package/foundation/doc-compiler/links.test.mjs +139 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +598 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +109 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +49 -2
- package/foundation/integrations/integrations.mjs +81 -8
- package/foundation/integrations/integrations.test.mjs +384 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.mjs +26 -16
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.mjs +22 -10
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
|
@@ -10,27 +10,37 @@ export const doc = {
|
|
|
10
10
|
type: 'command',
|
|
11
11
|
name: 'gap-report',
|
|
12
12
|
displayName: 'astryx gap-report',
|
|
13
|
-
namespace: 'cli',
|
|
13
|
+
namespace: 'cli/commands',
|
|
14
14
|
summary: 'Route a design-system gap to its owning package',
|
|
15
15
|
description:
|
|
16
16
|
'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability. The command selects an explicit package first, then a unique component owner, then Core. The report fans out to every effective handler: project config first, then each loaded integration in config order. Public handlers require --confirm-public per handler; internal handlers always run. A handler failure is isolated and does not prevent later handlers.',
|
|
17
17
|
fn: 'gapReport',
|
|
18
|
-
args: [
|
|
18
|
+
args: [
|
|
19
|
+
{
|
|
20
|
+
name: 'component',
|
|
21
|
+
param: 'component',
|
|
22
|
+
required: false,
|
|
23
|
+
description:
|
|
24
|
+
'Component or design-system area the gap is about, up to 120 characters. Required unless --list-categories is set.',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
19
27
|
options: [
|
|
20
28
|
{
|
|
21
29
|
flag: '--category <category>',
|
|
22
30
|
param: 'options.category',
|
|
23
|
-
description:
|
|
31
|
+
description:
|
|
32
|
+
'Gap category (run --list-categories for values). Required unless --list-categories is set.',
|
|
24
33
|
},
|
|
25
34
|
{
|
|
26
35
|
flag: '--reason <reason>',
|
|
27
36
|
param: 'options.reason',
|
|
28
|
-
description:
|
|
37
|
+
description:
|
|
38
|
+
'What capability was missing or difficult, up to 2000 characters. Required unless --list-categories is set.',
|
|
29
39
|
},
|
|
30
40
|
{
|
|
31
41
|
flag: '--additional-context <text>',
|
|
32
42
|
param: 'options.detail',
|
|
33
|
-
description: 'Optional additional context',
|
|
43
|
+
description: 'Optional additional context, up to 8000 characters',
|
|
34
44
|
},
|
|
35
45
|
{
|
|
36
46
|
flag: '--package <pkg>',
|
|
@@ -45,7 +55,8 @@ export const doc = {
|
|
|
45
55
|
{
|
|
46
56
|
flag: '--list-categories',
|
|
47
57
|
param: 'options.listCategories',
|
|
48
|
-
description:
|
|
58
|
+
description:
|
|
59
|
+
'List valid report categories without filing; the component and the other gap-report options are ignored',
|
|
49
60
|
},
|
|
50
61
|
],
|
|
51
62
|
examples: [
|
|
@@ -196,3 +196,75 @@ export default {};\n`,
|
|
|
196
196
|
});
|
|
197
197
|
});
|
|
198
198
|
});
|
|
199
|
+
|
|
200
|
+
describe('gap-report control docs', () => {
|
|
201
|
+
const REQUIRED = 'Required unless --list-categories is set.';
|
|
202
|
+
|
|
203
|
+
it('help and manifest say which inputs are required and how long they may be', async () => {
|
|
204
|
+
const help = await runCli(['gap-report', '--help']);
|
|
205
|
+
expect(help.status).toBe(0);
|
|
206
|
+
const manifest = JSON.parse((await runCli(['manifest', '--json'])).stdout);
|
|
207
|
+
const entry = manifest.data.commands.find(
|
|
208
|
+
(/** @type {{name: string}} */ command) => command.name === 'gap-report',
|
|
209
|
+
);
|
|
210
|
+
/** @param {string} flag @returns {string} */
|
|
211
|
+
const option = flag =>
|
|
212
|
+
entry.options.find(
|
|
213
|
+
(/** @type {{flag: string}} */ item) => item.flag.split(' ')[0] === flag,
|
|
214
|
+
)?.description ?? '';
|
|
215
|
+
const component = entry.arguments[0].description;
|
|
216
|
+
|
|
217
|
+
for (const text of [component, option('--category'), option('--reason')]) {
|
|
218
|
+
expect(text).toContain(REQUIRED);
|
|
219
|
+
expect(help.stdout).toContain(text);
|
|
220
|
+
}
|
|
221
|
+
expect(option('--list-categories')).toContain(
|
|
222
|
+
'the component and the other gap-report options are ignored',
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-gap-limits-'));
|
|
226
|
+
try {
|
|
227
|
+
fs.writeFileSync(
|
|
228
|
+
path.join(cwd, 'package.json'),
|
|
229
|
+
JSON.stringify({name: 'fixture-app'}),
|
|
230
|
+
);
|
|
231
|
+
const base = {cwd, category: /** @type {const} */ ('docs_gap'), reason: 'x'};
|
|
232
|
+
/** @type {Array<[string, (value: string) => Promise<unknown>]>} */
|
|
233
|
+
const limits = [
|
|
234
|
+
[component, value => gapReport(value, base)],
|
|
235
|
+
[option('--reason'), value => gapReport('Button', {...base, reason: value})],
|
|
236
|
+
[
|
|
237
|
+
option('--additional-context'),
|
|
238
|
+
value => gapReport('Button', {...base, detail: value}),
|
|
239
|
+
],
|
|
240
|
+
];
|
|
241
|
+
for (const [text, call] of limits) {
|
|
242
|
+
const limit = Number(/up to (\d+) characters/.exec(text)?.[1]);
|
|
243
|
+
expect(limit, text).toBeGreaterThan(0);
|
|
244
|
+
await expect(call('x'.repeat(limit))).resolves.toMatchObject({
|
|
245
|
+
type: 'gap-report.file',
|
|
246
|
+
});
|
|
247
|
+
await expect(call('x'.repeat(limit + 1))).rejects.toMatchObject({
|
|
248
|
+
code: 'ERR_INVALID_ARGUMENT',
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
} finally {
|
|
252
|
+
fs.rmSync(cwd, {recursive: true, force: true});
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it('enforces the documented requirement', async () => {
|
|
257
|
+
for (const [component, options] of [
|
|
258
|
+
[undefined, {category: 'docs_gap', reason: 'x'}],
|
|
259
|
+
['Button', {reason: 'x'}],
|
|
260
|
+
['Button', {category: 'docs_gap'}],
|
|
261
|
+
]) {
|
|
262
|
+
await expect(gapReport(component, options)).rejects.toMatchObject({
|
|
263
|
+
code: 'ERR_MISSING_ARGUMENT',
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
await expect(
|
|
267
|
+
gapReport(undefined, {listCategories: true, category: 'not_real', package: 'nope'}),
|
|
268
|
+
).resolves.toMatchObject({type: 'gap-report.categories'});
|
|
269
|
+
});
|
|
270
|
+
});
|
|
@@ -20,7 +20,6 @@ import {defineCommand} from '../../lib/define-command.mjs';
|
|
|
20
20
|
import {resultSet} from '../../../../foundation/debug/index.mjs';
|
|
21
21
|
import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
|
|
22
22
|
import {hook as hookApi} from '../../../../api/hook/hook.mjs';
|
|
23
|
-
import {findRelatedBlocks} from '../../../../api/template/template.mjs';
|
|
24
23
|
import {doc as hookCommand} from '../hook.doc.mjs';
|
|
25
24
|
import {doc as hookFn} from '../../../../api/hook/hook.doc.mjs';
|
|
26
25
|
|
|
@@ -169,24 +168,15 @@ export function registerHook(program) {
|
|
|
169
168
|
)
|
|
170
169
|
: formatHookFull(result.data);
|
|
171
170
|
|
|
172
|
-
//
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const allBlocks = [];
|
|
176
|
-
for (const comp of relatedComps) {
|
|
177
|
-
const blocks = await findRelatedBlocks(comp);
|
|
178
|
-
for (const b of blocks) {
|
|
179
|
-
if (!allBlocks.some(existing => existing.dirName === b.dirName)) {
|
|
180
|
-
allBlocks.push(b);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
171
|
+
// Text projects the envelope only. Block templates are JSON-backed
|
|
172
|
+
// under `component <name> --blocks`.
|
|
173
|
+
const related = result.data.relatedComponents ?? [];
|
|
185
174
|
emit(
|
|
186
175
|
code(doc),
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
176
|
+
related.length > 0 &&
|
|
177
|
+
text(
|
|
178
|
+
`Block templates: ${run} component <name> --blocks for ${related.join(', ')}`,
|
|
179
|
+
),
|
|
190
180
|
);
|
|
191
181
|
break;
|
|
192
182
|
}
|
|
@@ -12,7 +12,7 @@ export const doc = {
|
|
|
12
12
|
type: 'command',
|
|
13
13
|
name: 'hook',
|
|
14
14
|
displayName: 'astryx hook',
|
|
15
|
-
namespace: 'cli',
|
|
15
|
+
namespace: 'cli/commands',
|
|
16
16
|
summary: 'List hooks or print hook docs',
|
|
17
17
|
description:
|
|
18
18
|
'Resolves a hook by name and prints its authored doc, or lists the catalog grouped ' +
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file `astryx hook <name>` text is a projection of `hook.detail`: it shows
|
|
5
|
+
* nothing the JSON envelope does not carry.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {describe, it, expect} from 'vitest';
|
|
9
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
10
|
+
import {findRelatedBlocks} from '../../../api/template/template.mjs';
|
|
11
|
+
|
|
12
|
+
const HOOK = 'useAnnounce';
|
|
13
|
+
|
|
14
|
+
describe('hook detail text projection', () => {
|
|
15
|
+
it('prints no block templates that the JSON envelope lacks', async () => {
|
|
16
|
+
const json = await runCli(['--json', 'hook', HOOK]);
|
|
17
|
+
expect(json.status).toBe(0);
|
|
18
|
+
const envelope = JSON.parse(json.stdout);
|
|
19
|
+
expect(envelope.type).toBe('hook.detail');
|
|
20
|
+
const related = envelope.data.relatedComponents;
|
|
21
|
+
expect(related.length).toBeGreaterThan(0);
|
|
22
|
+
|
|
23
|
+
const blockNames = [];
|
|
24
|
+
for (const component of related) {
|
|
25
|
+
for (const block of await findRelatedBlocks(component)) {
|
|
26
|
+
blockNames.push(block.dirName);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
expect(blockNames.length).toBeGreaterThan(0);
|
|
30
|
+
|
|
31
|
+
const text = await runCli(['hook', HOOK]);
|
|
32
|
+
expect(text.status).toBe(0);
|
|
33
|
+
const shownButNotInJson = blockNames.filter(
|
|
34
|
+
name => text.stdout.includes(name) && !json.stdout.includes(name),
|
|
35
|
+
);
|
|
36
|
+
expect(shownButNotInJson).toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('points at the JSON-backed block lookup for each related component', async () => {
|
|
40
|
+
const text = await runCli(['hook', HOOK]);
|
|
41
|
+
expect(text.stdout).toMatch(/component <name> --blocks/);
|
|
42
|
+
expect(text.stdout).toContain('VisuallyHidden');
|
|
43
|
+
expect(text.stdout).toContain('Toast');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -12,43 +12,51 @@ export const doc = {
|
|
|
12
12
|
type: 'command',
|
|
13
13
|
name: 'init',
|
|
14
14
|
displayName: 'astryx init',
|
|
15
|
-
namespace: 'cli',
|
|
15
|
+
namespace: 'cli/commands',
|
|
16
16
|
summary: 'Initialize the design system in your project',
|
|
17
17
|
description:
|
|
18
18
|
'Non-interactive project setup (no prompts, so it behaves the same for humans, ' +
|
|
19
19
|
'agents, and CI). By default it installs the AGENTS.md/CLAUDE.md agent-docs, ' +
|
|
20
20
|
'including guidance from configured integrations, and prints getting-started ' +
|
|
21
21
|
'guidance; features/--all add theme and page-building ' +
|
|
22
|
-
'guidance and
|
|
22
|
+
'guidance and write an annotated theme template.',
|
|
23
23
|
fn: 'init',
|
|
24
24
|
options: [
|
|
25
25
|
{
|
|
26
26
|
flag: '--features <list>',
|
|
27
27
|
param: 'options.features',
|
|
28
28
|
description:
|
|
29
|
-
'Comma-separated features to install (agents, theme, template)'
|
|
29
|
+
'Comma-separated features to install (agents, theme, template). An unknown feature exits 1 with ERR_UNKNOWN_FEATURE. ' +
|
|
30
|
+
'Ignored with --all or --remove-agents',
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
33
|
flag: '--all',
|
|
33
34
|
param: 'options.all',
|
|
34
|
-
description: 'Install all features,
|
|
35
|
+
description: 'Install all features (agents, theme, template); overrides --features',
|
|
35
36
|
},
|
|
36
37
|
{
|
|
37
38
|
flag: '--remove-agents',
|
|
38
39
|
param: 'options.removeAgents',
|
|
39
|
-
description:
|
|
40
|
+
description:
|
|
41
|
+
'Remove the managed block from AGENTS.md, CLAUDE.md, .claude/CLAUDE.md, .cursorrules, .hermes.md and HERMES.md ' +
|
|
42
|
+
"(deleting AGENTS.md or .claude/CLAUDE.md when only init's heading is left) and do nothing else. " +
|
|
43
|
+
'--features, --all, --agent and --agent-docs-path are ignored; a file written with --agent-docs-path keeps its block',
|
|
40
44
|
},
|
|
41
45
|
{
|
|
42
46
|
flag: '--agent <tool>',
|
|
43
47
|
param: 'options.agent',
|
|
44
48
|
choices: ['claude', 'cursor', 'codex', 'hermes', 'muse', 'all'],
|
|
45
49
|
description:
|
|
46
|
-
'Target AI tool for agent docs: claude, cursor, codex, hermes, muse, all'
|
|
50
|
+
'Target AI tool for agent docs: claude, cursor, codex, hermes, muse, all. An unknown tool exits 1 with ERR_UNKNOWN_AGENT. ' +
|
|
51
|
+
'Used only when agent docs are installed (the default, --all, or --features agents); --agent-docs-path takes precedence',
|
|
47
52
|
},
|
|
48
53
|
{
|
|
49
54
|
flag: '--agent-docs-path <path...>',
|
|
50
55
|
param: 'options.agentDocsPath',
|
|
51
|
-
description:
|
|
56
|
+
description:
|
|
57
|
+
'Explicit file path(s) for agent docs, inside the project; takes precedence over --agent. ' +
|
|
58
|
+
'If any path is outside the project, no agent docs are written and the command exits 1. ' +
|
|
59
|
+
'Used only when agent docs are installed',
|
|
52
60
|
},
|
|
53
61
|
],
|
|
54
62
|
examples: [
|
|
@@ -57,10 +65,13 @@ export const doc = {
|
|
|
57
65
|
{label: 'Machine-readable receipt', cli: 'astryx init --json'},
|
|
58
66
|
],
|
|
59
67
|
exitCodes: [
|
|
60
|
-
{
|
|
68
|
+
{
|
|
69
|
+
code: 0,
|
|
70
|
+
when: 'success, including agent docs that could not be written for a reason other than a path escape (reported as docsError)',
|
|
71
|
+
},
|
|
61
72
|
{
|
|
62
73
|
code: 1,
|
|
63
|
-
when: 'unknown --agent
|
|
74
|
+
when: 'an unknown --agent or feature, or an --agent-docs-path outside the project',
|
|
64
75
|
},
|
|
65
76
|
],
|
|
66
77
|
related: ['doctor', 'upgrade', 'build', 'theme'],
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file `astryx init` documents how its flags interact and when it exits 1, and
|
|
5
|
+
* behaves as documented. Option text is read from the generated manifest (the
|
|
6
|
+
* same strings `--help` prints); exit codes from the CommandDoc.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {describe, it, expect, beforeEach, afterEach} from 'vitest';
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
14
|
+
import {doc as initDoc} from './init.doc.mjs';
|
|
15
|
+
|
|
16
|
+
const MARKER_START = '<!-- ASTRYX:START -->';
|
|
17
|
+
|
|
18
|
+
/** @type {string} */
|
|
19
|
+
let tmpDir;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-init-flags-'));
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/** @param {string} rel */
|
|
30
|
+
const exists = rel => fs.existsSync(path.join(tmpDir, rel));
|
|
31
|
+
/** @param {string} rel */
|
|
32
|
+
const read = rel => fs.readFileSync(path.join(tmpDir, rel), 'utf8');
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* init's option descriptions from the manifest, keyed by long flag.
|
|
36
|
+
* @returns {Promise<Record<string, string>>}
|
|
37
|
+
*/
|
|
38
|
+
async function initOptions() {
|
|
39
|
+
const {stdout} = await runCli(['--json', 'manifest'], tmpDir);
|
|
40
|
+
const init = JSON.parse(stdout).data.commands.find(
|
|
41
|
+
(/** @type {{name: string}} */ c) => c.name === 'init',
|
|
42
|
+
);
|
|
43
|
+
return Object.fromEntries(
|
|
44
|
+
init.options.map((/** @type {{flag: string, description: string}} */ o) => [
|
|
45
|
+
o.flag.match(/--[a-z-]+/)?.[0],
|
|
46
|
+
o.description,
|
|
47
|
+
]),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** @param {string[]} args */
|
|
52
|
+
async function initJson(args) {
|
|
53
|
+
const result = await runCli(['--json', 'init', ...args], tmpDir);
|
|
54
|
+
return {status: result.status, envelope: JSON.parse(result.stdout)};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** @param {number} code */
|
|
58
|
+
const exitWhen = code => initDoc.exitCodes?.find(e => e.code === code)?.when ?? '';
|
|
59
|
+
|
|
60
|
+
describe('astryx init flag interactions', () => {
|
|
61
|
+
it('--remove-agents: help says it only removes the block, and it ignores every install flag', async () => {
|
|
62
|
+
const help = (await initOptions())['--remove-agents'];
|
|
63
|
+
for (const flag of ['--features', '--all', '--agent', '--agent-docs-path']) {
|
|
64
|
+
expect(help).toContain(flag);
|
|
65
|
+
}
|
|
66
|
+
for (const file of ['AGENTS.md', '.claude/CLAUDE.md', '.cursorrules', '.hermes.md', 'HERMES.md']) {
|
|
67
|
+
expect(help).toContain(file);
|
|
68
|
+
}
|
|
69
|
+
expect(help).toMatch(/--agent-docs-path keeps its block/);
|
|
70
|
+
|
|
71
|
+
await initJson(['--agent-docs-path', 'docs/AI.md']);
|
|
72
|
+
await initJson([]);
|
|
73
|
+
expect(exists('AGENTS.md')).toBe(true);
|
|
74
|
+
|
|
75
|
+
const removed = await initJson([
|
|
76
|
+
'--remove-agents',
|
|
77
|
+
'--features',
|
|
78
|
+
'bogus',
|
|
79
|
+
'--all',
|
|
80
|
+
'--agent',
|
|
81
|
+
'bogus',
|
|
82
|
+
'--agent-docs-path',
|
|
83
|
+
'docs/AI.md',
|
|
84
|
+
]);
|
|
85
|
+
expect(removed.status).toBe(0);
|
|
86
|
+
expect(removed.envelope.type).toBe('init.remove');
|
|
87
|
+
expect(exists('AGENTS.md')).toBe(false);
|
|
88
|
+
expect(exists('theme.template.ts')).toBe(false);
|
|
89
|
+
expect(read('docs/AI.md')).toContain(MARKER_START);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('--all: help says it overrides --features, and an unknown feature beside it is not checked', async () => {
|
|
93
|
+
const options = await initOptions();
|
|
94
|
+
expect(options['--all']).toMatch(/overrides --features/);
|
|
95
|
+
expect(options['--features']).toMatch(/Ignored with --all or --remove-agents/);
|
|
96
|
+
expect(options['--features']).toContain('ERR_UNKNOWN_FEATURE');
|
|
97
|
+
|
|
98
|
+
const {status, envelope} = await initJson(['--all', '--features', 'bogus']);
|
|
99
|
+
expect(status).toBe(0);
|
|
100
|
+
expect(envelope.data.features).toEqual(['agents', 'theme', 'template']);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('--agent and --agent-docs-path: help states their scope and precedence, and the CLI follows it', async () => {
|
|
104
|
+
const options = await initOptions();
|
|
105
|
+
expect(options['--agent']).toMatch(/Used only when agent docs are installed/);
|
|
106
|
+
expect(options['--agent']).toMatch(/--agent-docs-path takes precedence/);
|
|
107
|
+
expect(options['--agent']).toContain('ERR_UNKNOWN_AGENT');
|
|
108
|
+
expect(options['--agent-docs-path']).toMatch(/takes precedence over --agent/);
|
|
109
|
+
expect(options['--agent-docs-path']).toMatch(/outside the project.*exits 1/);
|
|
110
|
+
expect(options['--agent-docs-path']).toMatch(/Used only when agent docs are installed/);
|
|
111
|
+
|
|
112
|
+
const unused = await initJson([
|
|
113
|
+
'--features',
|
|
114
|
+
'theme',
|
|
115
|
+
'--agent',
|
|
116
|
+
'bogus',
|
|
117
|
+
'--agent-docs-path',
|
|
118
|
+
'../outside.md',
|
|
119
|
+
]);
|
|
120
|
+
expect(unused.status).toBe(0);
|
|
121
|
+
expect(unused.envelope.data.docsWritten).toEqual([]);
|
|
122
|
+
|
|
123
|
+
const explicit = await initJson(['--agent', 'claude', '--agent-docs-path', 'docs/AI.md']);
|
|
124
|
+
expect(explicit.status).toBe(0);
|
|
125
|
+
expect(explicit.envelope.data.docsWritten).toEqual(['docs/AI.md']);
|
|
126
|
+
expect(exists('CLAUDE.md') || exists('.claude/CLAUDE.md')).toBe(false);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
describe('astryx init exit codes', () => {
|
|
131
|
+
it('exit 1: the CommandDoc lists an --agent-docs-path escape, which exits 1 in both modes and writes nothing', async () => {
|
|
132
|
+
expect(exitWhen(1)).toMatch(/--agent-docs-path outside the project/);
|
|
133
|
+
// The CLI never scaffolds a page template, so no template case can exit 1.
|
|
134
|
+
expect(exitWhen(1)).not.toMatch(/template/);
|
|
135
|
+
|
|
136
|
+
const text = await runCli(['init', '--agent-docs-path', 'ok.md', '../outside.md'], tmpDir);
|
|
137
|
+
const json = await initJson(['--agent-docs-path', 'ok.md', '../outside.md']);
|
|
138
|
+
expect(text.status).toBe(1);
|
|
139
|
+
expect(json.status).toBe(1);
|
|
140
|
+
expect(json.envelope.data.docsError.kind).toBe('path-safety');
|
|
141
|
+
expect(exists('ok.md')).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('exit 0: the CommandDoc says a soft agent-docs failure still exits 0, and it does', async () => {
|
|
145
|
+
expect(exitWhen(0)).toMatch(/docsError/);
|
|
146
|
+
|
|
147
|
+
// A directory where AGENTS.md belongs makes the write fail without a path escape.
|
|
148
|
+
fs.mkdirSync(path.join(tmpDir, 'AGENTS.md'));
|
|
149
|
+
const {status, envelope} = await initJson([]);
|
|
150
|
+
expect(status).toBe(0);
|
|
151
|
+
expect(envelope.data.docsError).toEqual({kind: 'install-failed'});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import {createProgram} from '../index.mjs';
|
|
7
|
+
import {buildManifest} from '../lib/manifest.mjs';
|
|
8
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
9
|
+
import {doc as fnDoc} from '../../../api/integration/integrationAdd.doc.mjs';
|
|
10
|
+
|
|
11
|
+
let tmpDir;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
tmpDir = fs.mkdtempSync(
|
|
15
|
+
path.join(process.cwd(), '.astryx-integration-add-controls-'),
|
|
16
|
+
);
|
|
17
|
+
fs.writeFileSync(
|
|
18
|
+
path.join(tmpDir, 'package.json'),
|
|
19
|
+
`${JSON.stringify({name: '@acme/widgets', version: '1.0.0'})}\n`,
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/** What each `integration add` control must define on the discovery surfaces. */
|
|
28
|
+
const DEFINITIONS = {
|
|
29
|
+
name: [
|
|
30
|
+
'PascalCase for component',
|
|
31
|
+
'lowercase kebab-case for template, codemod, and theme',
|
|
32
|
+
'letters, digits, _ and - for doc',
|
|
33
|
+
'literal guidance line for agent-doc',
|
|
34
|
+
],
|
|
35
|
+
'--type <type>': ['page (default) or block', 'only valid for template'],
|
|
36
|
+
'--replaces <topic>': ['only valid for doc', 'not with --extends'],
|
|
37
|
+
'--extends <topic>': ['only valid for doc', 'not with --replaces'],
|
|
38
|
+
'--to <version>': ['Exact semver', 'required for codemod and only valid there'],
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
describe('integration add control definitions', () => {
|
|
42
|
+
it('defines accepted values, defaults, and interactions in help', async () => {
|
|
43
|
+
const program = await createProgram();
|
|
44
|
+
const add = program.commands
|
|
45
|
+
.find(command => command.name() === 'integration')
|
|
46
|
+
?.commands.find(command => command.name() === 'add');
|
|
47
|
+
const help = add?.helpInformation() ?? '';
|
|
48
|
+
|
|
49
|
+
for (const phrases of Object.values(DEFINITIONS)) {
|
|
50
|
+
for (const phrase of phrases) expect(help).toContain(phrase);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('defines the same controls in the manifest', async () => {
|
|
55
|
+
const manifest = buildManifest(await createProgram());
|
|
56
|
+
const add = manifest.commands
|
|
57
|
+
.find(command => command.name === 'integration')
|
|
58
|
+
?.subcommands?.find(command => command.name === 'integration add');
|
|
59
|
+
/** @type {Record<string, string>} */
|
|
60
|
+
const described = {};
|
|
61
|
+
for (const arg of add?.arguments ?? []) described[arg.name] = arg.description;
|
|
62
|
+
for (const option of add?.options ?? []) {
|
|
63
|
+
described[option.flag] = option.description;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const [control, phrases] of Object.entries(DEFINITIONS)) {
|
|
67
|
+
for (const phrase of phrases) {
|
|
68
|
+
expect(described[control], control).toContain(phrase);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('defines the same controls for integrationAdd()', () => {
|
|
74
|
+
/** @param {string} name */
|
|
75
|
+
const param = name => fnDoc.params?.find(item => item.name === name);
|
|
76
|
+
|
|
77
|
+
for (const phrase of DEFINITIONS.name.slice(0, 3)) {
|
|
78
|
+
expect(param('name')?.description).toContain(phrase);
|
|
79
|
+
}
|
|
80
|
+
expect(param('options.templateType')?.default).toBe("'page'");
|
|
81
|
+
expect(param('options.replaces')?.description).toContain(
|
|
82
|
+
'not with options.extends',
|
|
83
|
+
);
|
|
84
|
+
expect(param('options.extends')?.description).toContain(
|
|
85
|
+
'not with options.replaces',
|
|
86
|
+
);
|
|
87
|
+
expect(param('options.to')?.description).toContain('Exact target semver');
|
|
88
|
+
expect(param('options.to')?.description).toContain('only valid there');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('behaves as the definitions say', async () => {
|
|
92
|
+
const both = await runCli(
|
|
93
|
+
[
|
|
94
|
+
'integration',
|
|
95
|
+
'add',
|
|
96
|
+
'doc',
|
|
97
|
+
'acme-guide',
|
|
98
|
+
'--replaces',
|
|
99
|
+
'getting-started',
|
|
100
|
+
'--extends',
|
|
101
|
+
'theme',
|
|
102
|
+
'--json',
|
|
103
|
+
],
|
|
104
|
+
tmpDir,
|
|
105
|
+
);
|
|
106
|
+
expect(both.status).toBe(1);
|
|
107
|
+
expect(JSON.parse(both.stdout).code).toBe('ERR_INVALID_ARGUMENT');
|
|
108
|
+
|
|
109
|
+
const looseVersion = await runCli(
|
|
110
|
+
['integration', 'add', 'codemod', 'rename-prop', '--to', '1.2', '--json'],
|
|
111
|
+
tmpDir,
|
|
112
|
+
);
|
|
113
|
+
expect(looseVersion.status).toBe(1);
|
|
114
|
+
expect(JSON.parse(looseVersion.stdout).code).toBe('ERR_INVALID_ARGUMENT');
|
|
115
|
+
|
|
116
|
+
const typeElsewhere = await runCli(
|
|
117
|
+
['integration', 'add', 'component', 'AcmeWidget', '--type', 'page', '--json'],
|
|
118
|
+
tmpDir,
|
|
119
|
+
);
|
|
120
|
+
expect(typeElsewhere.status).toBe(1);
|
|
121
|
+
expect(JSON.parse(typeElsewhere.stdout).code).toBe('ERR_INVALID_ARGUMENT');
|
|
122
|
+
|
|
123
|
+
const page = await runCli(
|
|
124
|
+
['integration', 'add', 'template', 'acme-page', '--json'],
|
|
125
|
+
tmpDir,
|
|
126
|
+
);
|
|
127
|
+
expect(page.status).toBe(0);
|
|
128
|
+
expect(
|
|
129
|
+
fs.readFileSync(path.join(tmpDir, 'templates', 'acme-page.doc.mjs'), 'utf-8'),
|
|
130
|
+
).toContain("type: 'page'");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -5,7 +5,7 @@ export const doc = {
|
|
|
5
5
|
type: 'command',
|
|
6
6
|
name: 'integration add',
|
|
7
7
|
displayName: 'astryx integration add',
|
|
8
|
-
namespace: 'cli',
|
|
8
|
+
namespace: 'cli/commands',
|
|
9
9
|
summary: 'Add one working contribution to an integration package',
|
|
10
10
|
description:
|
|
11
11
|
'Writes the complete minimum shape the selected contribution needs, creates the integration manifest on first use, declares the root only after a valid contribution exists, and verifies the result through the same discovery contract the packed-package check uses.',
|
|
@@ -22,7 +22,7 @@ export const doc = {
|
|
|
22
22
|
param: 'name',
|
|
23
23
|
required: true,
|
|
24
24
|
description:
|
|
25
|
-
'Contribution name; for
|
|
25
|
+
'Contribution name: PascalCase for component (AcmeWidget); lowercase kebab-case for template, codemod, and theme (account-card); letters, digits, _ and - for doc; the literal guidance line for agent-doc',
|
|
26
26
|
},
|
|
27
27
|
],
|
|
28
28
|
options: [
|
|
@@ -35,22 +35,32 @@ export const doc = {
|
|
|
35
35
|
flag: '--type <type>',
|
|
36
36
|
param: 'options.templateType',
|
|
37
37
|
choices: ['page', 'block'],
|
|
38
|
-
description:
|
|
38
|
+
description:
|
|
39
|
+
'Template type: page (default) or block; only valid for template',
|
|
39
40
|
},
|
|
40
41
|
{
|
|
41
42
|
flag: '--replaces <topic>',
|
|
42
43
|
param: 'options.replaces',
|
|
43
|
-
description:
|
|
44
|
+
description:
|
|
45
|
+
'Existing doc topic this one replaces (letters, digits, _ and -); only valid for doc and not with --extends',
|
|
44
46
|
},
|
|
45
47
|
{
|
|
46
48
|
flag: '--extends <topic>',
|
|
47
49
|
param: 'options.extends',
|
|
48
|
-
description:
|
|
50
|
+
description:
|
|
51
|
+
'Existing doc topic this one extends (letters, digits, _ and -); only valid for doc and not with --replaces',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
flag: '--parent <namespace>',
|
|
55
|
+
param: 'options.parent',
|
|
56
|
+
description:
|
|
57
|
+
"Namespace of this package to place the doc in, as a guide in its `guides` slot; writes the namespace doc when it is missing, and declares the CLI that reads it as an optional `@astryxdesign/cli` peer. Only valid for doc, and not with --replaces or --extends",
|
|
49
58
|
},
|
|
50
59
|
{
|
|
51
60
|
flag: '--to <version>',
|
|
52
61
|
param: 'options.to',
|
|
53
|
-
description:
|
|
62
|
+
description:
|
|
63
|
+
'Exact semver the codemod migrates to (e.g. 1.2.0); required for codemod and only valid there',
|
|
54
64
|
},
|
|
55
65
|
],
|
|
56
66
|
examples: [
|
|
@@ -63,6 +73,22 @@ export const doc = {
|
|
|
63
73
|
label: 'Add a page template',
|
|
64
74
|
cli: 'astryx integration add template dashboard',
|
|
65
75
|
},
|
|
76
|
+
{
|
|
77
|
+
label: 'Add a block template',
|
|
78
|
+
cli: 'astryx integration add template account-card --type block',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
label: 'Replace a doc topic',
|
|
82
|
+
cli: 'astryx integration add doc acme-getting-started --replaces getting-started',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
label: 'Extend a doc topic',
|
|
86
|
+
cli: 'astryx integration add doc acme-theming --extends theme',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
label: 'Add a guide to the package\'s own docs section',
|
|
90
|
+
cli: 'astryx integration add doc deploying --parent acme',
|
|
91
|
+
},
|
|
66
92
|
{
|
|
67
93
|
label: 'Add a codemod',
|
|
68
94
|
cli: 'astryx integration add codemod rename-widget --to 1.2.0',
|