@astryxdesign/cli 0.6.3 → 0.6.4-canary.0e1fbdb
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/CHANGELOG.md +194 -0
- package/README.md +152 -107
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +22 -10
- package/api/build/build.test.mjs +219 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +208 -53
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +49 -19
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -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/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +277 -41
- package/api/docs/_adapter.mjs +993 -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/docOverlays.test.mjs +27 -1
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -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/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +104 -1
- package/api/doctor/doctor.doc.mjs +18 -8
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/doctor/doctor.type.d.mts +1 -1
- package/api/doctor/doctor.type.mjs +1 -1
- package/api/gap-report/gap-report.doc.mjs +27 -14
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +7 -3
- 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 +2 -1
- package/api/index.mjs +6 -3
- package/api/init/init.doc.mjs +22 -12
- 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-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +56 -65
- package/api/integration/add-theme.test.mjs +139 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -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 +5 -4
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
- package/api/integration/pack-check.mjs +160 -11
- package/api/integration/pack-check.test.mjs +477 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +15 -2
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -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 +2 -1
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +2 -1
- 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 +89 -12
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +697 -97
- 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 +8 -5
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +18 -24
- package/api/template/copy/copy.test.mjs +26 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1072 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +32 -9
- 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 +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- 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.rollback.test.mjs +148 -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 +2 -2
- 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 +12 -12
- package/api/theme/themeBuild.doc.mjs +21 -17
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +6 -3
- package/api/theme/themePaletteGenerate.doc.mjs +16 -8
- package/api/theme/themeTargets.doc.mjs +4 -2
- package/api/theme/themeTemplate.doc.mjs +8 -3
- 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/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +358 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +32 -23
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +353 -104
- 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/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/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +12 -1
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/browser-support.doc.mjs +11 -11
- package/assets/docs/color.doc.mjs +8 -2
- package/assets/docs/elevation.doc.mjs +6 -4
- package/assets/docs/getting-started.doc.mjs +6 -17
- package/assets/docs/icons.doc.mjs +2 -21
- package/assets/docs/illustrations.doc.mjs +7 -15
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +132 -84
- package/assets/docs/layout.doc.mjs +134 -78
- package/assets/docs/migration.doc.mjs +19 -21
- package/assets/docs/motion.doc.mjs +16 -3
- package/assets/docs/principles.doc.dense.mjs +5 -5
- package/assets/docs/principles.doc.mjs +14 -6
- package/assets/docs/principles.doc.zh.mjs +6 -6
- package/assets/docs/shape.doc.mjs +8 -3
- package/assets/docs/spacing.doc.mjs +7 -2
- package/assets/docs/styling-libraries.doc.mjs +10 -6
- package/assets/docs/styling.doc.mjs +22 -26
- package/assets/docs/theme.doc.dense.mjs +58 -18
- package/assets/docs/theme.doc.mjs +60 -50
- package/assets/docs/theme.doc.zh.mjs +9 -8
- package/assets/docs/tokens.doc.dense.mjs +2 -2
- package/assets/docs/tokens.doc.mjs +390 -9
- package/assets/docs/tokens.doc.zh.mjs +2 -2
- package/assets/docs/tree/add-a-component.doc.mjs +75 -0
- package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
- package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
- package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/block-template.doc.mjs +130 -0
- package/assets/docs/tree/build-the-template.doc.mjs +28 -0
- package/assets/docs/tree/building-blocks.doc.mjs +46 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
- package/assets/docs/tree/checks.doc.mjs +119 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/codemods.doc.mjs +147 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-family.doc.mjs +113 -0
- package/assets/docs/tree/component-imports.doc.mjs +69 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/tree/components.doc.mjs +23 -0
- package/assets/docs/tree/configuration.doc.mjs +23 -0
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
- package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
- package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
- package/assets/docs/tree/docs.doc.mjs +21 -0
- package/assets/docs/tree/document-the-template.doc.mjs +28 -0
- package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
- package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
- package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
- package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
- package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
- package/assets/docs/tree/help.doc.mjs +16 -0
- package/assets/docs/tree/integrations.doc.mjs +40 -0
- package/assets/docs/tree/links.doc.mjs +98 -0
- package/assets/docs/tree/package-and-test.doc.mjs +32 -0
- package/assets/docs/tree/page-template.doc.mjs +71 -0
- package/assets/docs/tree/publishing.doc.mjs +111 -0
- package/assets/docs/tree/quick-start.doc.mjs +272 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
- package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
- package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
- package/assets/docs/tree/ship.doc.mjs +16 -0
- package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
- package/assets/docs/tree/single-component.doc.mjs +165 -0
- package/assets/docs/tree/start-a-template.doc.mjs +143 -0
- package/assets/docs/tree/subcomponent.doc.mjs +115 -0
- package/assets/docs/tree/template-assets.doc.mjs +64 -0
- package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
- package/assets/docs/tree/template-fonts.doc.mjs +102 -0
- package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
- package/assets/docs/tree/template-icons.doc.mjs +97 -0
- package/assets/docs/tree/template-images-media.doc.mjs +127 -0
- package/assets/docs/tree/template-styles.doc.mjs +93 -0
- package/assets/docs/tree/templates.doc.mjs +34 -0
- package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
- package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
- package/assets/docs/tree/themes.doc.mjs +39 -0
- package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
- package/assets/docs/tree/upgrading.doc.mjs +103 -0
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
- package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
- package/assets/docs/tree/versioning.doc.mjs +161 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
- package/assets/docs/typography.doc.mjs +24 -4
- package/assets/docs/working-with-ai.doc.mjs +34 -26
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.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/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- 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 +11 -3
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +29 -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/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +792 -24
- package/authoring/doctypes/_schema.mjs +549 -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 +43 -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 +12 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +14 -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 +233 -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 +55 -6
- package/authoring/doctypes/reference/type.ts +75 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +2 -2
- 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 +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +22 -13
- 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 +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -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 +28 -10
- 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 +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- 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 +295 -38
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
- 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 +143 -8
- package/clients/cli/commands/doctor.doc.mjs +4 -2
- package/clients/cli/commands/doctor.mjs +108 -37
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +27 -15
- 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 +24 -10
- 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 +39 -13
- package/clients/cli/commands/integration-authoring.test.mjs +74 -19
- package/clients/cli/commands/integration-pack.doc.mjs +6 -10
- package/clients/cli/commands/integration-real-world.test.mjs +4 -10
- package/clients/cli/commands/integration-verify.doc.mjs +22 -0
- package/clients/cli/commands/integration.doc.mjs +5 -5
- package/clients/cli/commands/integration.mjs +75 -43
- 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 +2 -2
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +16 -6
- package/clients/cli/commands/search.mjs +49 -11
- package/clients/cli/commands/search.test.mjs +92 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +4 -3
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +53 -14
- 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 +725 -0
- package/clients/cli/commands/theme-add.doc.mjs +5 -4
- 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 +12 -7
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +2 -3
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +3 -3
- 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 +3 -2
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +83 -12
- 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 +47 -34
- 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 +56 -6
- package/clients/cli/lib/define-command.test.mjs +54 -0
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +113 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- 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 +53 -6
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +83 -13
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- 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 +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +174 -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 +504 -0
- package/foundation/discovery/cli-self-docs.test.mjs +395 -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 +119 -11
- package/foundation/discovery/docs-discovery.mjs +427 -108
- package/foundation/discovery/docs-discovery.test.mjs +386 -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/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -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 +1643 -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 +298 -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 +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -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 +292 -0
- package/foundation/doc-compiler/tree.mjs +881 -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 +65 -0
- package/foundation/integrations/cli-requirement.mjs +189 -0
- package/foundation/integrations/cli-requirement.test.mjs +89 -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 +28 -25
- 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 +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -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/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- 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 +19 -12
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +166 -14
- 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.d.mts +7 -2
- package/foundation/response/response-types.doc.mjs +69 -25
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +12 -11
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -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/api/docs/docs.test.mjs +0 -83
- package/api/docs/integrationDocs.test.mjs +0 -208
- package/api/search/search.test.mjs +0 -389
- package/assets/docs/cli-integrations.doc.mjs +0 -367
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/docs.test.mjs +0 -102
- 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
- package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
|
@@ -2,10 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file Command-level coverage for `astryx doctor integration` authoring checks.
|
|
5
|
+
* @input Integration fixtures and the post-0.7 conflict projection.
|
|
6
|
+
* @output Assertions for human and typed command responses.
|
|
7
|
+
* @position CLI adapter coverage; 0.6.x API shape is verified separately.
|
|
5
8
|
*/
|
|
6
9
|
|
|
7
10
|
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
11
|
+
|
|
12
|
+
vi.mock('../../../foundation/discovery/template-conflict-release.mjs', () => ({
|
|
13
|
+
expandedTemplateConflictSchemaActive: () => true,
|
|
14
|
+
}));
|
|
8
15
|
import * as fs from 'node:fs';
|
|
16
|
+
import * as os from 'node:os';
|
|
9
17
|
import * as path from 'node:path';
|
|
10
18
|
import {Command} from 'commander';
|
|
11
19
|
import {discoverCoreTemplates} from '../../../foundation/discovery/template-adapter.mjs';
|
|
@@ -31,6 +39,8 @@ function writeIntegration({
|
|
|
31
39
|
id,
|
|
32
40
|
name = 'Integration template',
|
|
33
41
|
missingRoot = false,
|
|
42
|
+
replacements,
|
|
43
|
+
type = 'page',
|
|
34
44
|
}) {
|
|
35
45
|
fs.writeFileSync(
|
|
36
46
|
path.join(tmpDir, 'package.json'),
|
|
@@ -44,8 +54,8 @@ function writeIntegration({
|
|
|
44
54
|
const stem = path.join(tmpDir, 'templates', id);
|
|
45
55
|
fs.mkdirSync(path.dirname(stem), {recursive: true});
|
|
46
56
|
fs.writeFileSync(
|
|
47
|
-
`${stem}.
|
|
48
|
-
`export default {type: '
|
|
57
|
+
`${stem}.doc.mjs`,
|
|
58
|
+
`export default {type: '${type}', name: ${JSON.stringify(name)}, description: 'fixture'${replacements?.[id] == null ? '' : `, replaces: ${JSON.stringify(replacements[id])}`}};\n`,
|
|
49
59
|
);
|
|
50
60
|
fs.writeFileSync(
|
|
51
61
|
`${stem}.tsx`,
|
|
@@ -124,7 +134,12 @@ describe('doctor integration — command', () => {
|
|
|
124
134
|
return true;
|
|
125
135
|
});
|
|
126
136
|
|
|
127
|
-
await createProgram().parseAsync([
|
|
137
|
+
await createProgram().parseAsync([
|
|
138
|
+
'node',
|
|
139
|
+
'astryx',
|
|
140
|
+
'doctor',
|
|
141
|
+
'integration',
|
|
142
|
+
]);
|
|
128
143
|
|
|
129
144
|
const output = writes.join('');
|
|
130
145
|
expect(output).toContain('validate [package]');
|
|
@@ -136,7 +151,9 @@ describe('doctor integration — command', () => {
|
|
|
136
151
|
|
|
137
152
|
it('explains the optional package argument in every leaf help', () => {
|
|
138
153
|
const program = createProgram();
|
|
139
|
-
const doctor = program.commands.find(
|
|
154
|
+
const doctor = program.commands.find(
|
|
155
|
+
command => command.name() === 'doctor',
|
|
156
|
+
);
|
|
140
157
|
const integration = doctor?.commands.find(
|
|
141
158
|
command => command.name() === 'integration',
|
|
142
159
|
);
|
|
@@ -152,7 +169,10 @@ describe('doctor integration — command', () => {
|
|
|
152
169
|
});
|
|
153
170
|
|
|
154
171
|
it('templates explains how to check an installed package when no local manifest exists', async () => {
|
|
155
|
-
fs.writeFileSync(
|
|
172
|
+
fs.writeFileSync(
|
|
173
|
+
path.join(tmpDir, 'package.json'),
|
|
174
|
+
JSON.stringify({name: 'plain'}),
|
|
175
|
+
);
|
|
156
176
|
process.chdir(tmpDir);
|
|
157
177
|
|
|
158
178
|
await createProgram().parseAsync([
|
|
@@ -239,6 +259,71 @@ describe('doctor integration — command', () => {
|
|
|
239
259
|
expect(process.exitCode).toBeUndefined();
|
|
240
260
|
});
|
|
241
261
|
|
|
262
|
+
it('templates reports an intentional replacement and the Core-original command', async () => {
|
|
263
|
+
const core = (await discoverCoreTemplates()).find(
|
|
264
|
+
template => template.type === 'page',
|
|
265
|
+
);
|
|
266
|
+
expect(core).toBeDefined();
|
|
267
|
+
writeIntegration({
|
|
268
|
+
id: 'acme-app-shell',
|
|
269
|
+
type: core.type,
|
|
270
|
+
replacements: {'acme-app-shell': core.dirName},
|
|
271
|
+
});
|
|
272
|
+
process.chdir(tmpDir);
|
|
273
|
+
|
|
274
|
+
await createProgram().parseAsync([
|
|
275
|
+
'node',
|
|
276
|
+
'astryx',
|
|
277
|
+
'--json',
|
|
278
|
+
'doctor',
|
|
279
|
+
'integration',
|
|
280
|
+
'templates',
|
|
281
|
+
]);
|
|
282
|
+
|
|
283
|
+
const parsed = JSON.parse(logCalls.join('\n'));
|
|
284
|
+
expect(parsed.data.issues).toEqual([]);
|
|
285
|
+
expect(parsed.data.conflicts).toEqual([
|
|
286
|
+
expect.objectContaining({
|
|
287
|
+
id: 'acme-app-shell',
|
|
288
|
+
relationship: 'replaces',
|
|
289
|
+
replaces: core.dirName,
|
|
290
|
+
severity: 'info',
|
|
291
|
+
}),
|
|
292
|
+
]);
|
|
293
|
+
expect(parsed.data.conflicts[0].command).toContain(
|
|
294
|
+
`--package @astryxdesign/core`,
|
|
295
|
+
);
|
|
296
|
+
expect(process.exitCode).toBeUndefined();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('templates exits 1 for a missing replacement target', async () => {
|
|
300
|
+
writeIntegration({
|
|
301
|
+
id: 'acme-app-shell',
|
|
302
|
+
replacements: {'acme-app-shell': 'missing-core-shell'},
|
|
303
|
+
});
|
|
304
|
+
process.chdir(tmpDir);
|
|
305
|
+
|
|
306
|
+
await createProgram().parseAsync([
|
|
307
|
+
'node',
|
|
308
|
+
'astryx',
|
|
309
|
+
'--json',
|
|
310
|
+
'doctor',
|
|
311
|
+
'integration',
|
|
312
|
+
'templates',
|
|
313
|
+
]);
|
|
314
|
+
|
|
315
|
+
const parsed = JSON.parse(logCalls.join('\n'));
|
|
316
|
+
expect(parsed.data.issues).toEqual(
|
|
317
|
+
expect.arrayContaining([
|
|
318
|
+
expect.objectContaining({
|
|
319
|
+
code: 'missing_template_replacement_target',
|
|
320
|
+
severity: 'error',
|
|
321
|
+
}),
|
|
322
|
+
]),
|
|
323
|
+
);
|
|
324
|
+
expect(process.exitCode).toBe(1);
|
|
325
|
+
});
|
|
326
|
+
|
|
242
327
|
it('templates exits 1 when structural errors prevent a trustworthy check', async () => {
|
|
243
328
|
writeIntegration({missingRoot: true});
|
|
244
329
|
process.chdir(tmpDir);
|
|
@@ -260,6 +345,35 @@ describe('doctor integration — command', () => {
|
|
|
260
345
|
expect(process.exitCode).toBe(1);
|
|
261
346
|
});
|
|
262
347
|
|
|
348
|
+
it('components exits 1 when Core is missing, with no [ok] after the failure', async () => {
|
|
349
|
+
// Outside the repo, so nothing above the package resolves Core.
|
|
350
|
+
const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-no-core-'));
|
|
351
|
+
const previousTmp = tmpDir;
|
|
352
|
+
tmpDir = outside;
|
|
353
|
+
try {
|
|
354
|
+
writeComponentIntegration('AcmeCarousel');
|
|
355
|
+
expect(findCoreDir(outside)).toBeNull();
|
|
356
|
+
process.chdir(outside);
|
|
357
|
+
|
|
358
|
+
await createProgram().parseAsync([
|
|
359
|
+
'node',
|
|
360
|
+
'astryx',
|
|
361
|
+
'doctor',
|
|
362
|
+
'integration',
|
|
363
|
+
'components',
|
|
364
|
+
]);
|
|
365
|
+
|
|
366
|
+
const printed = logCalls.join('\n');
|
|
367
|
+
expect(printed).toContain('core_not_found');
|
|
368
|
+
expect(printed).not.toContain('[ok]');
|
|
369
|
+
expect(process.exitCode).toBe(1);
|
|
370
|
+
} finally {
|
|
371
|
+
tmpDir = previousTmp;
|
|
372
|
+
process.chdir(previousCwd);
|
|
373
|
+
fs.rmSync(outside, {recursive: true, force: true});
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
|
|
263
377
|
it('components warns with the exact package-qualified command', async () => {
|
|
264
378
|
const coreDir = findCoreDir(tmpDir);
|
|
265
379
|
expect(coreDir).not.toBeNull();
|
|
@@ -278,9 +392,7 @@ describe('doctor integration — command', () => {
|
|
|
278
392
|
const output = logCalls.join('\n');
|
|
279
393
|
expect(output).toContain('[warn]');
|
|
280
394
|
expect(output).toContain(core.name);
|
|
281
|
-
expect(output).toContain(
|
|
282
|
-
`component ${core.name} --package @acme/widgets`,
|
|
283
|
-
);
|
|
395
|
+
expect(output).toContain(`component ${core.name} --package @acme/widgets`);
|
|
284
396
|
expect(process.exitCode).toBeUndefined();
|
|
285
397
|
});
|
|
286
398
|
|
|
@@ -351,6 +463,29 @@ describe('doctor integration — command', () => {
|
|
|
351
463
|
expect(process.exitCode).toBeUndefined();
|
|
352
464
|
});
|
|
353
465
|
|
|
466
|
+
it('docs exits 1 for a placement that hides a guide, with no [ok] after the failure', async () => {
|
|
467
|
+
writeDocIntegration({name: 'deploying'});
|
|
468
|
+
fs.writeFileSync(
|
|
469
|
+
path.join(tmpDir, 'docs', 'deploying.doc.mjs'),
|
|
470
|
+
"export default {type: 'generic', name: 'deploying', title: 'Deploying', description: 'Deploy.', placement: {parent: 'namespace:nope', slot: 'guides'}, sections: [{title: 'Deploy', content: [{type: 'prose', text: 'Deploy.'}]}]};\n",
|
|
471
|
+
);
|
|
472
|
+
process.chdir(tmpDir);
|
|
473
|
+
|
|
474
|
+
await createProgram().parseAsync([
|
|
475
|
+
'node',
|
|
476
|
+
'astryx',
|
|
477
|
+
'doctor',
|
|
478
|
+
'integration',
|
|
479
|
+
'docs',
|
|
480
|
+
]);
|
|
481
|
+
|
|
482
|
+
const printed = logCalls.join('\n');
|
|
483
|
+
expect(printed).toContain('[fail]');
|
|
484
|
+
expect(printed).toContain('invalid_doc_graph');
|
|
485
|
+
expect(printed).not.toContain('[ok]');
|
|
486
|
+
expect(process.exitCode).toBe(1);
|
|
487
|
+
});
|
|
488
|
+
|
|
354
489
|
it('docs exits 1 for an accidental same-name Core topic', async () => {
|
|
355
490
|
const [coreTopic] = Object.keys(discoverBuiltinTopics());
|
|
356
491
|
writeDocIntegration({name: coreTopic});
|
|
@@ -12,11 +12,13 @@ export const doc = {
|
|
|
12
12
|
type: 'command',
|
|
13
13
|
name: 'doctor',
|
|
14
14
|
displayName: 'astryx doctor',
|
|
15
|
-
namespace: 'cli',
|
|
15
|
+
namespace: 'cli/commands',
|
|
16
16
|
summary: 'Diagnose Astryx projects and integration packages',
|
|
17
17
|
description:
|
|
18
18
|
'Runs read-only project health diagnostics by default: Node version, @astryxdesign/core ' +
|
|
19
|
-
'install and version alignment, themes, config,
|
|
19
|
+
'install and version alignment, themes, config, integrations (linked without a config entry, ' +
|
|
20
|
+
'provider identity, contribution issues), agent docs, core peer dependencies, package manager, ' +
|
|
21
|
+
"and the docs the CLI reads. It writes nothing, but loading astryx.config runs that file's code. " +
|
|
20
22
|
'The `integration` subcommands provide authoring checks for one integration package.',
|
|
21
23
|
fn: 'doctor',
|
|
22
24
|
subcommands: ['integration'],
|
|
@@ -3,7 +3,12 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file `astryx doctor` project health and integration-authoring diagnostics.
|
|
5
5
|
* Human output uses plain stable tokens; every leaf also has a typed JSON
|
|
6
|
-
* response.
|
|
6
|
+
* response. Template-conflict fields follow the package release boundary.
|
|
7
|
+
* Exit 1 means a check found an error, while warnings remain exit 0.
|
|
8
|
+
*
|
|
9
|
+
* @input Typed Doctor and integration-authoring API responses.
|
|
10
|
+
* @output Human-readable records or pass-through typed JSON.
|
|
11
|
+
* @position CLI presentation adapter for project and integration health.
|
|
7
12
|
*/
|
|
8
13
|
|
|
9
14
|
import {runChecks} from '../../../api/doctor/doctor.mjs';
|
|
@@ -17,7 +22,7 @@ import {
|
|
|
17
22
|
validateIntegration,
|
|
18
23
|
} from '../../../api/integration/validate-integration.mjs';
|
|
19
24
|
import {jsonOut} from '../../../foundation/response/json.mjs';
|
|
20
|
-
import {emit, section, records, text} from '../formatters/index.mjs';
|
|
25
|
+
import {emit, section, record, records, text} from '../formatters/index.mjs';
|
|
21
26
|
import {defineCommand} from '../lib/define-command.mjs';
|
|
22
27
|
import {doc as doctorCommand} from './doctor.doc.mjs';
|
|
23
28
|
import {doc as doctorIntegrationGroup} from './doctor-integration.doc.mjs';
|
|
@@ -31,6 +36,8 @@ import {doc as integrationTemplateConflictsFn} from '../../../api/integration/in
|
|
|
31
36
|
import {doc as integrationComponentConflictsFn} from '../../../api/integration/integrationComponentConflicts.doc.mjs';
|
|
32
37
|
import {doc as integrationDocConflictsFn} from '../../../api/integration/integrationDocConflicts.doc.mjs';
|
|
33
38
|
import {NO_RESULT_SET} from '../../../foundation/debug/index.mjs';
|
|
39
|
+
import {cliError} from '../lib/cli-error.mjs';
|
|
40
|
+
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
34
41
|
|
|
35
42
|
const STATUS = {
|
|
36
43
|
pass: '[ok]',
|
|
@@ -55,7 +62,7 @@ function integrationLabel(data) {
|
|
|
55
62
|
* @param {import('../../../api/doctor/doctor.mjs').DoctorReport} report
|
|
56
63
|
*/
|
|
57
64
|
function printHuman(report) {
|
|
58
|
-
const {
|
|
65
|
+
const {warn, fail} = report.summary;
|
|
59
66
|
const closing =
|
|
60
67
|
fail > 0
|
|
61
68
|
? 'Some checks failed. Address the items marked [fail] above.'
|
|
@@ -63,18 +70,15 @@ function printHuman(report) {
|
|
|
63
70
|
? 'No failures — but review the [warn] warnings above when you can.'
|
|
64
71
|
: 'All checks passed. Your Astryx setup looks healthy.';
|
|
65
72
|
|
|
73
|
+
// Field names are the JSON keys, so text and --json map one to one.
|
|
66
74
|
emit(
|
|
67
75
|
section('astryx doctor — diagnosing your setup'),
|
|
68
76
|
records(report.checks, {
|
|
69
|
-
fields: ['status', 'label', 'message', 'fix'],
|
|
70
|
-
labels: {label: 'check'},
|
|
77
|
+
fields: ['id', 'status', 'label', 'message', 'fix'],
|
|
71
78
|
format: {status: statusToken},
|
|
72
79
|
}),
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
`${fail} failure${fail === 1 ? '' : 's'}` +
|
|
76
|
-
(info ? `, ${info} info` : ''),
|
|
77
|
-
),
|
|
80
|
+
section('summary'),
|
|
81
|
+
record(report.summary, {fields: ['pass', 'warn', 'fail', 'info']}),
|
|
78
82
|
text(closing),
|
|
79
83
|
);
|
|
80
84
|
}
|
|
@@ -128,25 +132,41 @@ function printTemplateConflicts(data) {
|
|
|
128
132
|
),
|
|
129
133
|
...issueBlocks(data.issues),
|
|
130
134
|
];
|
|
131
|
-
if (data.conflicts.length === 0) {
|
|
135
|
+
if (data.conflicts.length === 0 && data.issues.length === 0) {
|
|
132
136
|
output.push(text('[ok] No template ids conflict with Core.'));
|
|
133
|
-
} else {
|
|
137
|
+
} else if (data.conflicts.length > 0) {
|
|
138
|
+
const expanded = data.conflicts.some(
|
|
139
|
+
conflict => 'relationship' in conflict,
|
|
140
|
+
);
|
|
134
141
|
output.push(
|
|
135
142
|
records(data.conflicts, {
|
|
136
|
-
fields:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
fields: expanded
|
|
144
|
+
? [
|
|
145
|
+
'severity',
|
|
146
|
+
'relationship',
|
|
147
|
+
'id',
|
|
148
|
+
'replaces',
|
|
149
|
+
'integrationPackage',
|
|
150
|
+
'integrationType',
|
|
151
|
+
'integrationName',
|
|
152
|
+
'message',
|
|
153
|
+
'command',
|
|
154
|
+
]
|
|
155
|
+
: [
|
|
156
|
+
'severity',
|
|
157
|
+
'id',
|
|
158
|
+
'integrationPackage',
|
|
159
|
+
'integrationType',
|
|
160
|
+
'integrationName',
|
|
161
|
+
'message',
|
|
162
|
+
'command',
|
|
163
|
+
],
|
|
145
164
|
format: {severity: statusToken},
|
|
146
165
|
}),
|
|
147
166
|
text(
|
|
148
|
-
|
|
149
|
-
|
|
167
|
+
expanded
|
|
168
|
+
? `${data.conflicts.length} Core template relationship(s).`
|
|
169
|
+
: `${data.conflicts.length} Core template conflict(s). Renaming is recommended but optional; keep the package-qualified command if the overlap is intentional.`,
|
|
150
170
|
),
|
|
151
171
|
);
|
|
152
172
|
}
|
|
@@ -163,12 +183,20 @@ function printComponentConflicts(data) {
|
|
|
163
183
|
),
|
|
164
184
|
...issueBlocks(data.issues),
|
|
165
185
|
];
|
|
186
|
+
// An [ok] after a failed check reads as a pass: say nothing it could not check.
|
|
187
|
+
const failed = data.issues.some(issue => issue.severity === 'error');
|
|
166
188
|
if (data.conflicts.length === 0) {
|
|
167
|
-
output.push(text('[ok] No component names conflict with Core.'));
|
|
189
|
+
if (!failed) output.push(text('[ok] No component names conflict with Core.'));
|
|
168
190
|
} else {
|
|
169
191
|
output.push(
|
|
170
192
|
records(data.conflicts, {
|
|
171
|
-
fields: [
|
|
193
|
+
fields: [
|
|
194
|
+
'severity',
|
|
195
|
+
'name',
|
|
196
|
+
'integrationPackage',
|
|
197
|
+
'message',
|
|
198
|
+
'command',
|
|
199
|
+
],
|
|
172
200
|
format: {severity: statusToken},
|
|
173
201
|
}),
|
|
174
202
|
text(
|
|
@@ -190,8 +218,19 @@ function printDocConflicts(data) {
|
|
|
190
218
|
),
|
|
191
219
|
...issueBlocks(data.issues),
|
|
192
220
|
];
|
|
221
|
+
if (
|
|
222
|
+
!data.issues.some(
|
|
223
|
+
issue => issue.severity === 'error' || issue.code === 'invalid_doc_graph',
|
|
224
|
+
)
|
|
225
|
+
) {
|
|
226
|
+
output.push(
|
|
227
|
+
text('[ok] The docs tree and every link in these docs check out.'),
|
|
228
|
+
);
|
|
229
|
+
}
|
|
193
230
|
if (data.findings.length === 0) {
|
|
194
|
-
|
|
231
|
+
if (!data.issues.some(issue => issue.severity === 'error')) {
|
|
232
|
+
output.push(text('[ok] No doc topics overlap with Core.'));
|
|
233
|
+
}
|
|
195
234
|
} else {
|
|
196
235
|
output.push(
|
|
197
236
|
records(data.findings, {
|
|
@@ -275,32 +314,64 @@ async function runAuthoringCheck(program, pkg, kind) {
|
|
|
275
314
|
const structuralErrors = summarizeIssues(result.data.issues).errors;
|
|
276
315
|
const docErrors =
|
|
277
316
|
result.type === 'integration.doc-conflicts'
|
|
278
|
-
? result.data.findings.filter(finding => finding.severity === 'error')
|
|
317
|
+
? result.data.findings.filter(finding => finding.severity === 'error')
|
|
318
|
+
.length
|
|
279
319
|
: 0;
|
|
280
320
|
if (structuralErrors > 0 || docErrors > 0) process.exitCode = 1;
|
|
281
321
|
return NO_RESULT_SET;
|
|
282
322
|
}
|
|
283
323
|
|
|
324
|
+
/**
|
|
325
|
+
* The first word after a command group, which names a subcommand it does not
|
|
326
|
+
* have, or null.
|
|
327
|
+
* @param {import('commander').Command | undefined} invoked
|
|
328
|
+
* @returns {string | null}
|
|
329
|
+
*/
|
|
330
|
+
function unknownWord(invoked) {
|
|
331
|
+
const word = (invoked?.args ?? []).find(arg => !String(arg).startsWith('-'));
|
|
332
|
+
return word == null ? null : String(word);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Report an unknown subcommand, in text as in JSON, with the ones the group has.
|
|
337
|
+
* @param {import('commander').Command} group
|
|
338
|
+
* @param {string} label the group's full name
|
|
339
|
+
* @param {string} word
|
|
340
|
+
*/
|
|
341
|
+
function unknownSubcommand(group, label, word) {
|
|
342
|
+
return cliError(`unknown subcommand '${label} ${word}'`, {
|
|
343
|
+
suggestions: group.commands.map(child => ({
|
|
344
|
+
name: child.name(),
|
|
345
|
+
reason: 'available subcommand',
|
|
346
|
+
})),
|
|
347
|
+
code: ERROR_CODES.ERR_UNKNOWN_SUBCOMMAND,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
|
|
284
351
|
/**
|
|
285
352
|
* Register `astryx doctor` and its integration-authoring leaves.
|
|
286
353
|
* @param {import('commander').Command} program
|
|
287
354
|
*/
|
|
288
355
|
export function registerDoctor(program) {
|
|
289
|
-
|
|
356
|
+
/** @type {import('commander').Command} */
|
|
357
|
+
let doctorCmd;
|
|
358
|
+
doctorCmd = defineCommand(program, doctorCommand, {
|
|
290
359
|
fn: doctorFn,
|
|
291
|
-
|
|
360
|
+
// `doctor integrations` is a mistyped subcommand, not a project check.
|
|
361
|
+
action: async (options, invoked) => {
|
|
362
|
+
const word = unknownWord(invoked);
|
|
363
|
+
if (word != null) return unknownSubcommand(doctorCmd, 'doctor', word);
|
|
364
|
+
return runProjectDoctor(program);
|
|
365
|
+
},
|
|
292
366
|
});
|
|
293
|
-
doctorCmd.addHelpText(
|
|
294
|
-
'after',
|
|
295
|
-
'\nExit code:\n' +
|
|
296
|
-
' 0 no failures (warnings are allowed) — safe as a CI gate\n' +
|
|
297
|
-
' 1 one or more checks failed\n',
|
|
298
|
-
);
|
|
299
|
-
|
|
300
367
|
/** @type {import('commander').Command} */
|
|
301
368
|
let integrationCmd;
|
|
302
369
|
integrationCmd = defineCommand(doctorCmd, doctorIntegrationGroup, {
|
|
303
|
-
action: () => {
|
|
370
|
+
action: (options, invoked) => {
|
|
371
|
+
const word = unknownWord(invoked);
|
|
372
|
+
if (word != null) {
|
|
373
|
+
return unknownSubcommand(integrationCmd, 'doctor integration', word);
|
|
374
|
+
}
|
|
304
375
|
integrationCmd.outputHelp();
|
|
305
376
|
return NO_RESULT_SET;
|
|
306
377
|
},
|
|
@@ -354,3 +354,45 @@ describe('doctor — command', () => {
|
|
|
354
354
|
}
|
|
355
355
|
});
|
|
356
356
|
});
|
|
357
|
+
|
|
358
|
+
describe('doctor — text output mirrors the JSON', () => {
|
|
359
|
+
/** @param {string} line */
|
|
360
|
+
const field = line => /^(\w+):\s+(.*)$/.exec(line)?.slice(1) ?? [line, ''];
|
|
361
|
+
|
|
362
|
+
it('prints every check and summary field under its JSON key', async () => {
|
|
363
|
+
const prevCwd = process.cwd();
|
|
364
|
+
const prevExit = process.exitCode;
|
|
365
|
+
process.chdir(tmpDir);
|
|
366
|
+
try {
|
|
367
|
+
await createProgram().parseAsync(['node', 'astryx', '--json', 'doctor']);
|
|
368
|
+
const {checks, summary} = JSON.parse(logCalls.join('\n')).data;
|
|
369
|
+
logCalls = [];
|
|
370
|
+
await createProgram().parseAsync(['node', 'astryx', 'doctor']);
|
|
371
|
+
const blocks = logCalls
|
|
372
|
+
.join('\n')
|
|
373
|
+
.split(/\n{2,}/)
|
|
374
|
+
.map(block => block.split('\n').map(field));
|
|
375
|
+
|
|
376
|
+
for (const check of checks) {
|
|
377
|
+
const block = blocks.find(fields =>
|
|
378
|
+
fields.some(([key, value]) => key === 'id' && value === check.id),
|
|
379
|
+
);
|
|
380
|
+
expect(block, `no text record for check ${check.id}`).toBeDefined();
|
|
381
|
+
expect(
|
|
382
|
+
/** @type {string[][]} */ (block).map(([key]) => key).sort(),
|
|
383
|
+
).toEqual(Object.keys(check).sort());
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const heading = blocks.findIndex(
|
|
387
|
+
fields => fields.length === 1 && fields[0][0] === 'summary',
|
|
388
|
+
);
|
|
389
|
+
expect(heading, 'no summary section').toBeGreaterThan(-1);
|
|
390
|
+
expect(blocks[heading + 1]).toEqual(
|
|
391
|
+
Object.entries(summary).map(([key, count]) => [key, String(count)]),
|
|
392
|
+
);
|
|
393
|
+
} finally {
|
|
394
|
+
process.chdir(prevCwd);
|
|
395
|
+
process.exitCode = prevExit;
|
|
396
|
+
}
|
|
397
|
+
}, 60_000);
|
|
398
|
+
});
|
|
@@ -10,54 +10,66 @@ export const doc = {
|
|
|
10
10
|
type: 'command',
|
|
11
11
|
name: 'gap-report',
|
|
12
12
|
displayName: 'astryx gap-report',
|
|
13
|
-
namespace: 'cli',
|
|
14
|
-
summary: '
|
|
13
|
+
namespace: 'cli/commands',
|
|
14
|
+
summary: 'Report a missing component or feature to the package that owns it',
|
|
15
15
|
description:
|
|
16
|
-
'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability
|
|
16
|
+
'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability to the package that owns it: the --package you name, else the one package that provides the component, else Core. ' +
|
|
17
|
+
'Every configured handler receives the report: the project config handler first, then each integration handler in config order. Public handlers run only with --confirm-public; internal handlers always run. A failing handler does not stop the others. ' +
|
|
18
|
+
"With no handler it files a GitHub issue for the owning package, only with --confirm-public (without it nothing is sent), or returns the package's issues URL when that is not on GitHub. " +
|
|
19
|
+
'The report records whether an agent or a person ran it.',
|
|
17
20
|
fn: 'gapReport',
|
|
18
|
-
args: [
|
|
21
|
+
args: [
|
|
22
|
+
{
|
|
23
|
+
name: 'component',
|
|
24
|
+
param: 'component',
|
|
25
|
+
required: false,
|
|
26
|
+
description:
|
|
27
|
+
'Component or design-system area the gap is about, up to 120 characters. Required unless --list-categories is set.',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
19
30
|
options: [
|
|
20
31
|
{
|
|
21
32
|
flag: '--category <category>',
|
|
22
33
|
param: 'options.category',
|
|
23
|
-
description:
|
|
34
|
+
description:
|
|
35
|
+
'Gap category (run --list-categories for values). Required unless --list-categories is set.',
|
|
24
36
|
},
|
|
25
37
|
{
|
|
26
38
|
flag: '--reason <reason>',
|
|
27
39
|
param: 'options.reason',
|
|
28
|
-
description:
|
|
40
|
+
description:
|
|
41
|
+
'What capability was missing or difficult, up to 2000 characters. Required unless --list-categories is set.',
|
|
29
42
|
},
|
|
30
43
|
{
|
|
31
44
|
flag: '--additional-context <text>',
|
|
32
45
|
param: 'options.detail',
|
|
33
|
-
description: 'Optional additional context',
|
|
46
|
+
description: 'Optional additional context, up to 8000 characters',
|
|
34
47
|
},
|
|
35
48
|
{
|
|
36
49
|
flag: '--package <pkg>',
|
|
37
50
|
param: 'options.package',
|
|
38
|
-
description:
|
|
51
|
+
description:
|
|
52
|
+
'Package that owns the gap: @astryxdesign/core or a loaded integration. Overrides automatic routing; needed when more than one package provides the component',
|
|
39
53
|
},
|
|
40
54
|
{
|
|
41
55
|
flag: '--confirm-public',
|
|
42
56
|
param: 'options.confirmPublic',
|
|
43
|
-
description:
|
|
57
|
+
description:
|
|
58
|
+
'Allow public delivery: public handlers run, and with no handler it files a GitHub issue with your gh login',
|
|
44
59
|
},
|
|
45
60
|
{
|
|
46
61
|
flag: '--list-categories',
|
|
47
62
|
param: 'options.listCategories',
|
|
48
|
-
description:
|
|
63
|
+
description:
|
|
64
|
+
'List valid report categories without filing; the component and the other gap-report options are ignored',
|
|
49
65
|
},
|
|
50
66
|
],
|
|
51
67
|
examples: [
|
|
52
68
|
{label: 'List categories', cli: 'astryx gap-report --list-categories'},
|
|
53
69
|
{
|
|
54
|
-
label: '
|
|
70
|
+
label: 'Prepare a report (nothing public happens without --confirm-public)',
|
|
55
71
|
cli: "astryx gap-report Button --category missing_variant --reason 'Need a compact size'",
|
|
56
72
|
},
|
|
57
|
-
{
|
|
58
|
-
label: 'Confirm public filing',
|
|
59
|
-
cli: "astryx gap-report Button --category docs_gap --reason 'Missing keyboard example' --confirm-public",
|
|
60
|
-
},
|
|
61
73
|
],
|
|
62
74
|
exitCodes: [
|
|
63
75
|
{
|
|
@@ -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
|
+
});
|