@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
|
@@ -102,7 +102,7 @@ describe('integration-contributed topics', () => {
|
|
|
102
102
|
// The built-in topics keep their own owner.
|
|
103
103
|
expect(listed.data.find(t => t.topic === 'tokens').package).toBe('@astryxdesign/cli');
|
|
104
104
|
|
|
105
|
-
const detail = await docs('deploying', undefined, {cwd: tmpDir});
|
|
105
|
+
const detail = await docs('deploying', undefined, {cwd: tmpDir, full: true});
|
|
106
106
|
expect(detail.type).toBe('docs.detail');
|
|
107
107
|
expect(detail.data.sections[0].content[0].text).toBe('Push the button.');
|
|
108
108
|
|
|
@@ -129,7 +129,7 @@ describe('integration-contributed topics', () => {
|
|
|
129
129
|
}),
|
|
130
130
|
});
|
|
131
131
|
|
|
132
|
-
const detail = await docs('getting-started', undefined, {cwd: tmpDir});
|
|
132
|
+
const detail = await docs('getting-started', undefined, {cwd: tmpDir, full: true});
|
|
133
133
|
expect(detail.data.sections.map(s => s.title)).toEqual(['Install']);
|
|
134
134
|
expect(detail.data.sections[0].content[0].text).toBe('yarn add @acme/widgets');
|
|
135
135
|
|
|
@@ -146,14 +146,14 @@ describe('integration-contributed topics', () => {
|
|
|
146
146
|
scaffold({
|
|
147
147
|
'setup.doc.mjs': topic({name: 'setup', replaces: 'getting-started'}),
|
|
148
148
|
});
|
|
149
|
-
const byOldName = await docs('getting-started', undefined, {cwd: tmpDir});
|
|
150
|
-
const byNewName = await docs('setup', undefined, {cwd: tmpDir});
|
|
149
|
+
const byOldName = await docs('getting-started', undefined, {cwd: tmpDir, full: true});
|
|
150
|
+
const byNewName = await docs('setup', undefined, {cwd: tmpDir, full: true});
|
|
151
151
|
expect(byOldName.data.name).toBe('setup');
|
|
152
152
|
expect(byNewName.data.name).toBe('setup');
|
|
153
153
|
}, SLOW);
|
|
154
154
|
|
|
155
155
|
it('merges an extension into the topic it extends', async () => {
|
|
156
|
-
const builtin = await docs('theme');
|
|
156
|
+
const builtin = await docs('theme', undefined, {full: true});
|
|
157
157
|
const baseSectionTitle = builtin.data.sections[0].title;
|
|
158
158
|
scaffold({
|
|
159
159
|
'theme-internal.doc.mjs': topic({
|
|
@@ -166,7 +166,7 @@ describe('integration-contributed topics', () => {
|
|
|
166
166
|
}),
|
|
167
167
|
});
|
|
168
168
|
|
|
169
|
-
const extended = await docs('theme', undefined, {cwd: tmpDir});
|
|
169
|
+
const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
|
|
170
170
|
// The extension is not a topic of its own.
|
|
171
171
|
expect((await docs(undefined, undefined, {cwd: tmpDir})).data.some(
|
|
172
172
|
t => t.topic === 'theme-internal',
|
|
@@ -177,13 +177,119 @@ describe('integration-contributed topics', () => {
|
|
|
177
177
|
expect(extended.data.sections.length).toBe(builtin.data.sections.length + 1);
|
|
178
178
|
}, SLOW);
|
|
179
179
|
|
|
180
|
+
it('migrates a real built-in section to a stable ID without duplicating it', async () => {
|
|
181
|
+
const builtin = await docs('theme', undefined, {full: true});
|
|
182
|
+
// Readers see a key on every section; the migration case is one whose
|
|
183
|
+
// source authors no id.
|
|
184
|
+
const {docs: authored} = await import('../../assets/docs/theme.doc.mjs');
|
|
185
|
+
const target = authored.sections.find(section => section.id == null);
|
|
186
|
+
expect(target).toBeDefined();
|
|
187
|
+
scaffold({
|
|
188
|
+
'theme-internal.doc.mjs': topic({
|
|
189
|
+
name: 'theme-internal',
|
|
190
|
+
extends: 'theme',
|
|
191
|
+
sections: [
|
|
192
|
+
{
|
|
193
|
+
id: 'acme-theme-setup',
|
|
194
|
+
title: target.title,
|
|
195
|
+
content: [{type: 'prose', text: 'Use the Acme theme.'}],
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
}),
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
|
|
202
|
+
expect(extended.data.sections).toHaveLength(builtin.data.sections.length);
|
|
203
|
+
const matches = extended.data.sections.filter(
|
|
204
|
+
section => section.title === target.title,
|
|
205
|
+
);
|
|
206
|
+
expect(matches).toEqual([
|
|
207
|
+
expect.objectContaining({
|
|
208
|
+
id: 'acme-theme-setup',
|
|
209
|
+
content: [{type: 'prose', text: 'Use the Acme theme.'}],
|
|
210
|
+
}),
|
|
211
|
+
]);
|
|
212
|
+
}, SLOW);
|
|
213
|
+
|
|
214
|
+
it('replaces a real built-in section by the key its index shows', async () => {
|
|
215
|
+
const index = await docs('theme', undefined, {index: true});
|
|
216
|
+
const target = index.data.sections[0];
|
|
217
|
+
scaffold({
|
|
218
|
+
'theme-internal.doc.mjs': topic({
|
|
219
|
+
name: 'theme-internal',
|
|
220
|
+
extends: 'theme',
|
|
221
|
+
sections: [
|
|
222
|
+
{
|
|
223
|
+
id: target.id,
|
|
224
|
+
title: `${target.title} with Acme`,
|
|
225
|
+
content: [{type: 'prose', text: 'Acme first.'}],
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
}),
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
|
|
232
|
+
expect(extended.data.sections).toHaveLength(index.data.sections.length);
|
|
233
|
+
expect(extended.data.sections.filter(s => s.id === target.id)).toEqual([
|
|
234
|
+
expect.objectContaining({content: [{type: 'prose', text: 'Acme first.'}]}),
|
|
235
|
+
]);
|
|
236
|
+
const read = await docs('theme', target.id, {cwd: tmpDir});
|
|
237
|
+
expect(read.data.title).toBe(`${target.title} with Acme`);
|
|
238
|
+
}, SLOW);
|
|
239
|
+
|
|
240
|
+
it.each(['zh', 'dense'])(
|
|
241
|
+
'replaces translated real sections by their authored titles under --%s',
|
|
242
|
+
async lang => {
|
|
243
|
+
const english = await docs('theme', undefined, {full: true});
|
|
244
|
+
const englishTitles = english.data.sections.map(section => section.title);
|
|
245
|
+
expect(englishTitles).toEqual(
|
|
246
|
+
expect.arrayContaining(['Quick Start', 'Theme Props']),
|
|
247
|
+
);
|
|
248
|
+
scaffold({
|
|
249
|
+
'theme-internal.doc.mjs': topic({
|
|
250
|
+
name: 'theme-internal',
|
|
251
|
+
extends: 'theme',
|
|
252
|
+
sections: [
|
|
253
|
+
{
|
|
254
|
+
id: 'acme-quick-start',
|
|
255
|
+
title: 'Quick Start',
|
|
256
|
+
content: [{type: 'prose', text: 'Acme quick start.'}],
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
title: 'Theme Props',
|
|
260
|
+
content: [{type: 'prose', text: 'Acme props.'}],
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
}),
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
const base = await docs('theme', undefined, {lang, full: true});
|
|
267
|
+
expect(base.data.sections.map(section => section.title)).not.toEqual(
|
|
268
|
+
englishTitles,
|
|
269
|
+
);
|
|
270
|
+
const extended = await docs('theme', undefined, {cwd: tmpDir, lang, full: true});
|
|
271
|
+
expect(extended.data.sections).toHaveLength(base.data.sections.length);
|
|
272
|
+
expect(
|
|
273
|
+
extended.data.sections.filter(
|
|
274
|
+
section => section.id === 'acme-quick-start',
|
|
275
|
+
),
|
|
276
|
+
).toHaveLength(1);
|
|
277
|
+
expect(
|
|
278
|
+
extended.data.sections.filter(
|
|
279
|
+
section => section.content[0]?.text === 'Acme props.',
|
|
280
|
+
),
|
|
281
|
+
).toHaveLength(1);
|
|
282
|
+
},
|
|
283
|
+
SLOW,
|
|
284
|
+
);
|
|
285
|
+
|
|
180
286
|
it('offers the contributed topics as suggestions on an unknown one', async () => {
|
|
181
287
|
scaffold({'deploying.doc.mjs': topic()});
|
|
182
|
-
await expect(docs('nope-not-a-topic', undefined, {cwd: tmpDir})).rejects.toBeInstanceOf(
|
|
288
|
+
await expect(docs('nope-not-a-topic', undefined, {cwd: tmpDir, full: true})).rejects.toBeInstanceOf(
|
|
183
289
|
AstryxError,
|
|
184
290
|
);
|
|
185
291
|
try {
|
|
186
|
-
await docs('nope-not-a-topic', undefined, {cwd: tmpDir});
|
|
292
|
+
await docs('nope-not-a-topic', undefined, {cwd: tmpDir, full: true});
|
|
187
293
|
} catch (err) {
|
|
188
294
|
expect(err.suggestions.map(s => s.name)).toContain('deploying');
|
|
189
295
|
}
|
package/api/docs/list/list.mjs
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
* English `description` is read from its file; a contributed topic already
|
|
9
9
|
* carries the one discovery read. The listing never applies --dense/--zh
|
|
10
10
|
* overlays.
|
|
11
|
-
* @output { type: 'docs.list', data: DocsListEntry[] } — one entry per topic
|
|
12
|
-
* read order,
|
|
13
|
-
* `astryx --json docs`.
|
|
11
|
+
* @output { type: 'docs.list', data: DocsListEntry[] } — one entry per topic
|
|
12
|
+
* in read order, then one per top-level docs-tree namespace, each naming the
|
|
13
|
+
* package that owns it, matching `astryx --json docs`.
|
|
14
14
|
* @position Leaf under api/docs. Sibling of detail; both share _adapter.mjs.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
import {loadDocsCatalog} from '../_adapter.mjs';
|
|
17
|
+
import {loadTopicFile} from '../../../foundation/doc-compiler/read.mjs';
|
|
18
|
+
import {holdsOwnName, loadDocsCatalog, projectTree} from '../_adapter.mjs';
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* @param {object} [options]
|
|
@@ -24,17 +24,17 @@ import {loadDocsCatalog} from '../_adapter.mjs';
|
|
|
24
24
|
*/
|
|
25
25
|
export async function list({cwd} = {}) {
|
|
26
26
|
const catalog = await loadDocsCatalog(cwd);
|
|
27
|
+
const tree = await projectTree(catalog);
|
|
27
28
|
/** @type {Array<import('../docs.type.mjs').DocsListEntry>} */
|
|
28
29
|
const entries = [];
|
|
29
30
|
for (const entry of catalog.entries()) {
|
|
31
|
+
// A topic whose name opens another doc is not listed (spec:AST-046
|
|
32
|
+
// FR11); `astryx doctor` names the clash.
|
|
33
|
+
if (!holdsOwnName(tree, catalog, entry)) continue;
|
|
30
34
|
let description = entry.description ?? '';
|
|
31
35
|
if (entry.description == null) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
description = (mod.docs ?? mod.default)?.description ?? '';
|
|
35
|
-
} catch {
|
|
36
|
-
description = '';
|
|
37
|
-
}
|
|
36
|
+
const file = await loadTopicFile(entry.path, null);
|
|
37
|
+
description = file.doc?.description ?? '';
|
|
38
38
|
}
|
|
39
39
|
/** @type {import('../docs.type.mjs').DocsListEntry} */
|
|
40
40
|
const listed = {
|
|
@@ -45,5 +45,21 @@ export async function list({cwd} = {}) {
|
|
|
45
45
|
if (entry.replaces != null) listed.replaces = entry.replaces;
|
|
46
46
|
entries.push(listed);
|
|
47
47
|
}
|
|
48
|
-
|
|
48
|
+
// The docs tree's top-level namespaces, the CLI's and each integration's,
|
|
49
|
+
// each the way into a whole branch (spec:AST-046 FR7). They go in `meta`,
|
|
50
|
+
// so `data` stays the topic list 0.6 returned: every entry reads as a topic.
|
|
51
|
+
const namespaces = tree.roots().map(root => ({
|
|
52
|
+
topic: root.route,
|
|
53
|
+
description: root.summary,
|
|
54
|
+
package: root.provider,
|
|
55
|
+
}));
|
|
56
|
+
/** @type {NonNullable<import('../docs.type.mjs').DocsListResponse['meta']>} */
|
|
57
|
+
const meta = {};
|
|
58
|
+
if (namespaces.length > 0) meta.namespaces = namespaces;
|
|
59
|
+
// A package whose docs did not load is named, so its author knows why its
|
|
60
|
+
// topics are missing.
|
|
61
|
+
if (catalog.issues.length > 0) meta.notLoaded = [...catalog.issues];
|
|
62
|
+
return Object.keys(meta).length === 0
|
|
63
|
+
? {type: 'docs.list', data: entries}
|
|
64
|
+
: {type: 'docs.list', data: entries, meta};
|
|
49
65
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {import('../../../foundation/doc-compiler/tree.mjs').DocsTree} DocsTree
|
|
6
|
+
* @typedef {import('../../../foundation/doc-compiler/tree.mjs').TreeNode} TreeNode
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* The docs.node view of one tree node.
|
|
10
|
+
* @param {import('../../../foundation/discovery/docs-discovery.mjs').DocsCatalog} catalog
|
|
11
|
+
* @param {DocsTree} tree
|
|
12
|
+
* @param {TreeNode} node
|
|
13
|
+
* @returns {Promise<import('../docs.type.mjs').DocsNode>}
|
|
14
|
+
*/
|
|
15
|
+
export function nodeView(catalog: import("../../../foundation/discovery/docs-discovery.mjs").DocsCatalog, tree: DocsTree, node: TreeNode): Promise<import("../docs.type.mjs").DocsNode>;
|
|
16
|
+
/**
|
|
17
|
+
* The typed edges a doc declares (spec:AST-047 FR5), resolved to routes: a
|
|
18
|
+
* function doc's `command` and `related`, and a command doc's `fn` and
|
|
19
|
+
* `related`. A bare name resolves among the kinds its field allows; a name
|
|
20
|
+
* that matches docs of more than one allowed kind is an error, never a silent
|
|
21
|
+
* pick. A `command` resolves to the command doc its leading words name, so
|
|
22
|
+
* `integration add theme` (the `integration add` command with its kind
|
|
23
|
+
* argument) opens `integration add`. Every name that resolves to no doc, or to
|
|
24
|
+
* more than one, is returned in `unresolved`; the graph walk test fails on it,
|
|
25
|
+
* so no edge a doc declares can go stale.
|
|
26
|
+
* @param {DocsTree} tree
|
|
27
|
+
* @param {TreeNode} node
|
|
28
|
+
* @returns {{routes: string[], unresolved: string[]}}
|
|
29
|
+
*/
|
|
30
|
+
export function typedEdges(tree: DocsTree, node: TreeNode): {
|
|
31
|
+
routes: string[];
|
|
32
|
+
unresolved: string[];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* @param {string} route
|
|
36
|
+
* @param {{cwd?: string}} [options]
|
|
37
|
+
* @returns {Promise<import('../docs.type.mjs').DocsNodeResponse>}
|
|
38
|
+
*/
|
|
39
|
+
export function node(route: string, options?: {
|
|
40
|
+
cwd?: string;
|
|
41
|
+
}): Promise<import("../docs.type.mjs").DocsNodeResponse>;
|
|
42
|
+
export type DocsTree = import("../../../foundation/doc-compiler/tree.mjs").DocsTree;
|
|
43
|
+
export type TreeNode = import("../../../foundation/doc-compiler/tree.mjs").TreeNode;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file docs.node leaf — one namespace or typed doc in the docs tree.
|
|
5
|
+
*
|
|
6
|
+
* @input A route the docs tree resolves: a namespace such as `cli/api`, or a
|
|
7
|
+
* typed doc such as `cli/api/functions/search`, plus {cwd}.
|
|
8
|
+
* @output { type: 'docs.node', data: DocsNode } — the node's identity, title
|
|
9
|
+
* and summary, the namespaces above it, and either its slots with their
|
|
10
|
+
* children (a namespace) or its content (a typed doc). A namespace never
|
|
11
|
+
* lists its grandchildren, so a reader goes down one level at a time.
|
|
12
|
+
* Matches `astryx --json docs <route>`.
|
|
13
|
+
* @position Leaf under api/docs, beside the topic leaves. A guide the tree
|
|
14
|
+
* places is a topic: the detail leaf reads it by its route.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
nodeContent,
|
|
19
|
+
placeLinks,
|
|
20
|
+
resolveDocsArgument,
|
|
21
|
+
unknownTopicError,
|
|
22
|
+
} from '../_adapter.mjs';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {import('../../../foundation/doc-compiler/tree.mjs').DocsTree} DocsTree
|
|
26
|
+
* @typedef {import('../../../foundation/doc-compiler/tree.mjs').TreeNode} TreeNode
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The docs.node view of one tree node.
|
|
31
|
+
* @param {import('../../../foundation/discovery/docs-discovery.mjs').DocsCatalog} catalog
|
|
32
|
+
* @param {DocsTree} tree
|
|
33
|
+
* @param {TreeNode} node
|
|
34
|
+
* @returns {Promise<import('../docs.type.mjs').DocsNode>}
|
|
35
|
+
*/
|
|
36
|
+
export async function nodeView(catalog, tree, node) {
|
|
37
|
+
const {content} = await nodeContent(catalog, tree, node);
|
|
38
|
+
return {
|
|
39
|
+
id: node.id,
|
|
40
|
+
route: node.route,
|
|
41
|
+
kind: node.kind,
|
|
42
|
+
package: node.provider,
|
|
43
|
+
title: node.title,
|
|
44
|
+
summary: node.summary,
|
|
45
|
+
breadcrumb: tree
|
|
46
|
+
.ancestors(node)
|
|
47
|
+
.map(ancestor => ({route: ancestor.route, title: ancestor.title})),
|
|
48
|
+
slots: node.slots
|
|
49
|
+
.filter(slot => slot.children.length > 0)
|
|
50
|
+
.map(slot => ({
|
|
51
|
+
name: slot.name,
|
|
52
|
+
title: slot.title,
|
|
53
|
+
children: slot.children.map(route => {
|
|
54
|
+
const child = /** @type {TreeNode} */ (tree.get(route));
|
|
55
|
+
return {
|
|
56
|
+
route: child.route,
|
|
57
|
+
name: child.route.slice(child.route.lastIndexOf('/') + 1),
|
|
58
|
+
kind: child.kind,
|
|
59
|
+
title: child.title,
|
|
60
|
+
summary: child.summary,
|
|
61
|
+
};
|
|
62
|
+
}),
|
|
63
|
+
})),
|
|
64
|
+
content,
|
|
65
|
+
links: nodeLinks(tree, node),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The moves a node offers (spec:AST-047): up to the level it sits in (the
|
|
71
|
+
* topic list, for a top-level namespace), and across to the nodes before and
|
|
72
|
+
* after it in its parent's slot.
|
|
73
|
+
* @param {DocsTree} tree
|
|
74
|
+
* @param {TreeNode} node
|
|
75
|
+
* @returns {import('../docs.type.mjs').DocsLinks}
|
|
76
|
+
*/
|
|
77
|
+
function nodeLinks(tree, node) {
|
|
78
|
+
const links = placeLinks(tree, node);
|
|
79
|
+
const related = typedEdges(tree, node).routes;
|
|
80
|
+
if (related.length > 0) {
|
|
81
|
+
links.related = related.map(
|
|
82
|
+
route =>
|
|
83
|
+
/** @type {import('../docs.type.mjs').DocsCommand} */ (
|
|
84
|
+
`astryx docs ${route}`
|
|
85
|
+
),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return links;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** @type {WeakMap<DocsTree, Map<string, string>>} */
|
|
92
|
+
const routeIndexes = new WeakMap();
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The route of each node, by its kind and name.
|
|
96
|
+
* @param {DocsTree} tree
|
|
97
|
+
* @returns {Map<string, string>}
|
|
98
|
+
*/
|
|
99
|
+
function routeIndex(tree) {
|
|
100
|
+
let routes = routeIndexes.get(tree);
|
|
101
|
+
if (!routes) {
|
|
102
|
+
routes = new Map();
|
|
103
|
+
for (const each of tree.nodes.values()) {
|
|
104
|
+
routes.set(`${each.kind}\u0000${each.name}`, each.route);
|
|
105
|
+
}
|
|
106
|
+
routeIndexes.set(tree, routes);
|
|
107
|
+
}
|
|
108
|
+
return routes;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The kinds of doc each typed field may name. A bare name in one of these
|
|
113
|
+
* fields names a doc of the same provider and one of these kinds, so it is a
|
|
114
|
+
* doc identity (spec:AST-047 FR9).
|
|
115
|
+
*/
|
|
116
|
+
const EDGE_KINDS = {
|
|
117
|
+
function: {command: ['command'], related: ['function']},
|
|
118
|
+
command: {fn: ['function'], related: ['command']},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The typed edges a doc declares (spec:AST-047 FR5), resolved to routes: a
|
|
123
|
+
* function doc's `command` and `related`, and a command doc's `fn` and
|
|
124
|
+
* `related`. A bare name resolves among the kinds its field allows; a name
|
|
125
|
+
* that matches docs of more than one allowed kind is an error, never a silent
|
|
126
|
+
* pick. A `command` resolves to the command doc its leading words name, so
|
|
127
|
+
* `integration add theme` (the `integration add` command with its kind
|
|
128
|
+
* argument) opens `integration add`. Every name that resolves to no doc, or to
|
|
129
|
+
* more than one, is returned in `unresolved`; the graph walk test fails on it,
|
|
130
|
+
* so no edge a doc declares can go stale.
|
|
131
|
+
* @param {DocsTree} tree
|
|
132
|
+
* @param {TreeNode} node
|
|
133
|
+
* @returns {{routes: string[], unresolved: string[]}}
|
|
134
|
+
*/
|
|
135
|
+
export function typedEdges(tree, node) {
|
|
136
|
+
const doc = /** @type {any} */ (node.ref)?.selfDoc;
|
|
137
|
+
/** @type {string[]} */
|
|
138
|
+
const routes = [];
|
|
139
|
+
/** @type {string[]} */
|
|
140
|
+
const unresolved = [];
|
|
141
|
+
const fields = /** @type {Record<string, string[]> | undefined} */ (
|
|
142
|
+
/** @type {any} */ (EDGE_KINDS)[node.kind]
|
|
143
|
+
);
|
|
144
|
+
if (!doc || !fields) return {routes, unresolved};
|
|
145
|
+
const index = routeIndex(tree);
|
|
146
|
+
/** @param {string[]} kinds @param {string} name */
|
|
147
|
+
const among = (kinds, name) =>
|
|
148
|
+
kinds
|
|
149
|
+
.map(kind => index.get(`${kind}\u0000${name}`))
|
|
150
|
+
.filter(route => typeof route === 'string');
|
|
151
|
+
for (const [field, kinds] of Object.entries(fields)) {
|
|
152
|
+
const value = doc[field];
|
|
153
|
+
const names = Array.isArray(value) ? value : value == null ? [] : [value];
|
|
154
|
+
for (const name of names) {
|
|
155
|
+
if (typeof name !== 'string' || name.trim() === '') continue;
|
|
156
|
+
let found = among(kinds, name);
|
|
157
|
+
if (found.length === 0 && field === 'command') {
|
|
158
|
+
const words = name.trim().split(/\s+/);
|
|
159
|
+
for (let n = words.length - 1; n > 0 && found.length === 0; n--) {
|
|
160
|
+
found = among(kinds, words.slice(0, n).join(' '));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (found.length === 1) routes.push(/** @type {string} */ (found[0]));
|
|
164
|
+
else if (found.length === 0) {
|
|
165
|
+
unresolved.push(`${field} "${name}" names no ${kinds.join(' or ')} doc`);
|
|
166
|
+
} else {
|
|
167
|
+
unresolved.push(
|
|
168
|
+
`${field} "${name}" names more than one doc (${found.join(', ')})`,
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
routes: [...new Set(routes)].filter(route => route !== node.route),
|
|
175
|
+
unresolved,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* @param {string} route
|
|
181
|
+
* @param {{cwd?: string}} [options]
|
|
182
|
+
* @returns {Promise<import('../docs.type.mjs').DocsNodeResponse>}
|
|
183
|
+
*/
|
|
184
|
+
export async function node(route, options = {}) {
|
|
185
|
+
const found = await resolveDocsArgument(route, options);
|
|
186
|
+
if (found.kind !== 'node')
|
|
187
|
+
throw await unknownTopicError(route, found.catalog);
|
|
188
|
+
return {
|
|
189
|
+
type: 'docs.node',
|
|
190
|
+
data: await nodeView(found.catalog, found.tree, found.node),
|
|
191
|
+
};
|
|
192
|
+
}
|
package/api/doctor/doctor.d.mts
CHANGED
|
@@ -68,7 +68,13 @@ export function checkAgentDocs(ctx: DoctorContext): DoctorCheck;
|
|
|
68
68
|
*/
|
|
69
69
|
export function checkPeerDeps(ctx: DoctorContext): DoctorCheck;
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
71
|
+
* Summarize the combined integration graph, including cross-package warnings.
|
|
72
|
+
* @param {DoctorContext} ctx
|
|
73
|
+
* @returns {DoctorCheck}
|
|
74
|
+
*/
|
|
75
|
+
export function checkIntegrationIssues(ctx: DoctorContext): DoctorCheck;
|
|
76
|
+
/**
|
|
77
|
+
* Check 10 — report the detected package manager, and say so when the project's
|
|
72
78
|
* own declaration disagrees with what is on disk.
|
|
73
79
|
*
|
|
74
80
|
* Two states are worth surfacing rather than guessing past, because in both the
|
|
@@ -84,6 +90,71 @@ export function checkPeerDeps(ctx: DoctorContext): DoctorCheck;
|
|
|
84
90
|
* @returns {DoctorCheck}
|
|
85
91
|
*/
|
|
86
92
|
export function checkPackageManager(ctx: DoctorContext): DoctorCheck;
|
|
93
|
+
/**
|
|
94
|
+
* Check 6b — every contributing integration owns its provider identity.
|
|
95
|
+
*
|
|
96
|
+
* Artifact and document IDs are provider-scoped, so a package that claims a
|
|
97
|
+
* provider ID an earlier-loaded package already holds is loaded inert: its
|
|
98
|
+
* components, templates, themes, docs, and codemods are withdrawn while the
|
|
99
|
+
* earlier package keeps contributing. That can be a deliberate transition
|
|
100
|
+
* (a renamed package installed beside its predecessor), so it warns rather
|
|
101
|
+
* than fails, but it is never allowed to happen quietly.
|
|
102
|
+
*
|
|
103
|
+
* @param {DoctorContext} ctx
|
|
104
|
+
* @returns {DoctorCheck}
|
|
105
|
+
*/
|
|
106
|
+
export function checkProviderIdentity(ctx: DoctorContext): DoctorCheck;
|
|
107
|
+
/**
|
|
108
|
+
* Every authoring self-doc is reachable from `astryx docs authoring`, loads,
|
|
109
|
+
* and fits in one read, and every type `@astryxdesign/cli/authoring` exports
|
|
110
|
+
* has its doc there: the self-doc beside the module that declares it. The
|
|
111
|
+
* audits are imported here, inside the try, so a malformed self-doc is
|
|
112
|
+
* reported rather than taking Doctor down.
|
|
113
|
+
* @param {DoctorContext} [_ctx]
|
|
114
|
+
* @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
|
|
115
|
+
* Another authoring tree, list, or topic index to audit (for tests).
|
|
116
|
+
* @returns {Promise<DoctorCheck>}
|
|
117
|
+
*/
|
|
118
|
+
export function checkAuthoringDocs(_ctx?: DoctorContext, options?: {
|
|
119
|
+
root?: string;
|
|
120
|
+
sources?: string[];
|
|
121
|
+
topicKeys?: Set<string> | null;
|
|
122
|
+
}): Promise<DoctorCheck>;
|
|
123
|
+
/**
|
|
124
|
+
* Every command, API function, schema, and enum doc the CLI ships declares a
|
|
125
|
+
* namespace, and something reads it: the docs tree under `astryx docs cli`
|
|
126
|
+
* for `cli/commands` and `cli/api`, `astryx docs authoring` for `authoring`.
|
|
127
|
+
* @param {DoctorContext | Partial<DoctorContext>} _ctx
|
|
128
|
+
* @param {{root?: string, sources?: string[], authoringSources?: string[]}} [options]
|
|
129
|
+
* test seams: the CLI root, the docs to audit, and the authoring topic's list
|
|
130
|
+
* @returns {Promise<DoctorCheck>}
|
|
131
|
+
*/
|
|
132
|
+
export function checkCliDocs(_ctx: DoctorContext | Partial<DoctorContext>, options?: {
|
|
133
|
+
root?: string;
|
|
134
|
+
sources?: string[];
|
|
135
|
+
authoringSources?: string[];
|
|
136
|
+
}): Promise<DoctorCheck>;
|
|
137
|
+
/**
|
|
138
|
+
* The docs tree builds with no error, and every CLI typed doc in a `cli/...`
|
|
139
|
+
* group has a route in it (spec:AST-046): each placement names a namespace of
|
|
140
|
+
* its own package and a slot that accepts it, exactly one namespace adopts
|
|
141
|
+
* each doc, and each route belongs to one doc.
|
|
142
|
+
* @param {DoctorContext | Partial<DoctorContext>} _ctx
|
|
143
|
+
* @param {{tree?: import('../../foundation/doc-compiler/tree.mjs').DocsTree}} [options]
|
|
144
|
+
* test seam: a tree to check instead of the CLI's own
|
|
145
|
+
* @returns {Promise<DoctorCheck>}
|
|
146
|
+
*/
|
|
147
|
+
export function checkDocsTree(_ctx: DoctorContext | Partial<DoctorContext>, options?: {
|
|
148
|
+
tree?: import("../../foundation/doc-compiler/tree.mjs").DocsTree;
|
|
149
|
+
}): Promise<DoctorCheck>;
|
|
150
|
+
/**
|
|
151
|
+
* Every topic reads progressively, in every language it ships: it loads, its
|
|
152
|
+
* section index and each of its sections fit in one read, and no contributed
|
|
153
|
+
* doc is invalid.
|
|
154
|
+
* @param {DoctorContext | Partial<DoctorContext>} ctx
|
|
155
|
+
* @returns {Promise<DoctorCheck>}
|
|
156
|
+
*/
|
|
157
|
+
export function checkDocsProgressiveDisclosure(ctx: DoctorContext | Partial<DoctorContext>): Promise<DoctorCheck>;
|
|
87
158
|
/**
|
|
88
159
|
* Run all diagnostic checks and return a structured report.
|
|
89
160
|
*
|
|
@@ -169,9 +240,36 @@ export type DoctorContext = {
|
|
|
169
240
|
* read at all.
|
|
170
241
|
*/
|
|
171
242
|
integrations?: import("../../foundation/integrations/integrations.mjs").LoadedIntegration[] | null | undefined;
|
|
243
|
+
/**
|
|
244
|
+
* - The topics a docs read sees.
|
|
245
|
+
*/
|
|
246
|
+
docsCatalog?: DocsCatalog | null | undefined;
|
|
247
|
+
/**
|
|
248
|
+
* `invalid_doc` issues from the project's contributed docs.
|
|
249
|
+
*/
|
|
250
|
+
docsCatalogIssues?: {
|
|
251
|
+
package?: string;
|
|
252
|
+
code: string;
|
|
253
|
+
message: string;
|
|
254
|
+
}[] | undefined;
|
|
255
|
+
/**
|
|
256
|
+
* - Why the project's docs catalog
|
|
257
|
+
* could not be built, when it could not.
|
|
258
|
+
*/
|
|
259
|
+
docsCatalogError?: string | null | undefined;
|
|
260
|
+
/**
|
|
261
|
+
* Combined project-level integration issues, including cross-package template replacement warnings.
|
|
262
|
+
*/
|
|
263
|
+
integrationIssues?: {
|
|
264
|
+
package: string;
|
|
265
|
+
code: string;
|
|
266
|
+
severity: "warning" | "error";
|
|
267
|
+
message: string;
|
|
268
|
+
}[] | null | undefined;
|
|
172
269
|
/**
|
|
173
270
|
* - Error thrown while resolving the config
|
|
174
271
|
* path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
|
|
175
272
|
*/
|
|
176
273
|
configError?: Error | null | undefined;
|
|
177
274
|
};
|
|
275
|
+
import { DocsCatalog } from '../../foundation/discovery/docs-discovery.mjs';
|