@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d
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 +117 -79
- 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 +16 -9
- package/api/build/build.test.mjs +197 -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 +165 -49
- 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 +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/_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 +268 -47
- package/api/docs/_adapter.mjs +970 -149
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.d.mts +0 -15
- package/api/docs/detail/detail.mjs +22 -78
- package/api/docs/detail/section/section.mjs +39 -24
- package/api/docs/detail/section/section.test.mjs +19 -9
- package/api/docs/docs.d.mts +5 -3
- package/api/docs/docs.doc.mjs +39 -17
- package/api/docs/docs.mjs +44 -8
- package/api/docs/docs.test.mjs +158 -4
- package/api/docs/docs.type.d.mts +185 -6
- package/api/docs/docs.type.mjs +127 -13
- package/api/docs/index/index.mjs +15 -6
- package/api/docs/index/index.test.mjs +1 -1
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +14 -14
- 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 +54 -4
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +332 -21
- package/api/doctor/doctor.test.mjs +420 -7
- 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 +1 -1
- 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-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -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 +2 -0
- 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.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- 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/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 +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 +61 -10
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +124 -1
- package/api/search/search.type.d.mts +14 -2
- 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/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.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +11 -13
- 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 +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 +124 -73
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -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 +8 -2
- package/api/upgrade/upgrade.type.d.mts +42 -4
- package/api/upgrade/upgrade.type.mjs +26 -10
- 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/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- 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} +95 -39
- 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 +4 -4
- 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/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 +10 -2
- 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 +7 -7
- 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 +240 -128
- package/authoring/doctypes/_schema.mjs +198 -16
- package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
- package/authoring/doctypes/base/type.ts +9 -4
- 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 +4 -4
- package/authoring/doctypes/component/component.doc.mjs +5 -2
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +3 -3
- 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 +2 -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 +4 -3
- 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 +3 -3
- package/authoring/doctypes/legacy.d.mts +6 -6
- package/authoring/doctypes/legacy.mjs +3 -3
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
- package/authoring/doctypes/namespace/parse.d.mts +2 -2
- package/authoring/doctypes/namespace/parse.mjs +1 -1
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +6 -3
- package/authoring/doctypes/parse.d.mts +22 -20
- package/authoring/doctypes/parse.mjs +19 -14
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +1 -1
- package/authoring/doctypes/reference/reference.doc.mjs +39 -6
- package/authoring/doctypes/reference/type.ts +31 -14
- 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 +3 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +37 -1
- package/authoring/doctypes/template/parse.test.mjs +18 -0
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +12 -1
- 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 -11
- 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 +9 -9
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.mjs +3 -2
- package/authoring/identity/type.ts +10 -10
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +32 -19
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/schema.d.mts +4 -4
- package/authoring/integration/schema.mjs +3 -3
- package/authoring/integration/type.ts +5 -11
- 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 +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 +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 +21 -9
- package/clients/cli/commands/docs.mjs +184 -70
- package/clients/cli/commands/docs.test.mjs +120 -16
- 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 +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- 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 +3 -3
- 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 +20 -8
- 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 +2 -0
- package/clients/cli/formatters/index.test.mjs +6 -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 +32 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -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 +246 -89
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +18 -0
- package/foundation/discovery/authoring-self-docs.mjs +38 -15
- package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
- 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 +38 -0
- package/foundation/discovery/component-discovery.mjs +48 -0
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +114 -9
- package/foundation/discovery/docs-discovery.mjs +239 -30
- package/foundation/discovery/docs-discovery.test.mjs +150 -35
- package/foundation/discovery/docs-output-budget.d.mts +2 -2
- package/foundation/discovery/docs-output-budget.mjs +1 -1
- package/foundation/discovery/docs-section-key.d.mts +28 -10
- package/foundation/discovery/docs-section-key.mjs +134 -33
- package/foundation/discovery/docs-section-key.test.mjs +41 -19
- 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 +772 -82
- 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 +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 +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 +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/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -52
- 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 +84 -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 +51 -26
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +17 -1
- package/foundation/integrations/integrations.mjs +52 -98
- package/foundation/integrations/integrations.test.mjs +31 -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.mjs +121 -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 +11 -0
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +37 -22
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- 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/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
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
* @returns {string|null}
|
|
10
10
|
*/
|
|
11
11
|
export function findConfigPath(startDir?: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* The provider ledger a Project resolved at load: one outcome for every
|
|
14
|
+
* package directory configured, autolinked, or authored. Internal: upgrade
|
|
15
|
+
* resolves on top of it, and tests account for every candidate with it.
|
|
16
|
+
* @param {Project} project
|
|
17
|
+
* @returns {import('../integrations/provider-resolution.mjs').ProviderLedger}
|
|
18
|
+
*/
|
|
19
|
+
export function providerLedgerOf(project: Project): import("../integrations/provider-resolution.mjs").ProviderLedger;
|
|
12
20
|
/**
|
|
13
21
|
* An integration issue tagged with the owner package. The base
|
|
14
22
|
* {@link import('../integrations/issue').AstryxIntegrationIssue} fields plus the
|
|
@@ -87,9 +95,9 @@ export class Project {
|
|
|
87
95
|
/**
|
|
88
96
|
* Core + integration component ownership records. Wraps
|
|
89
97
|
* discoverOwnedComponents for core and discoverIntegrationComponents (via
|
|
90
|
-
* discoverOwnedComponents) for integrations
|
|
91
|
-
*
|
|
92
|
-
*
|
|
98
|
+
* discoverOwnedComponents) for integrations. Invalid component records are
|
|
99
|
+
* omitted and reported; valid component siblings and other contribution kinds
|
|
100
|
+
* remain available. Memoized per instance.
|
|
93
101
|
*
|
|
94
102
|
* @returns {Promise<Array<{name: string, package: string, group: string|null, docPath: string|null, sourcePath: string|null, issuesUrl: string|undefined}>>}
|
|
95
103
|
*/
|
|
@@ -102,10 +110,11 @@ export class Project {
|
|
|
102
110
|
issuesUrl: string | undefined;
|
|
103
111
|
}>>;
|
|
104
112
|
/**
|
|
105
|
-
* Core + integration templates, type-tagged
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
113
|
+
* Core + integration templates, type-tagged, with valid integration
|
|
114
|
+
* replacements projected over their Core targets. Wraps raw template discovery
|
|
115
|
+
* (Core + external blocks) and discoverIntegrationTemplatesForOne per integration
|
|
116
|
+
* so unusable template files are reported and omitted while valid siblings
|
|
117
|
+
* remain available. Memoized per instance.
|
|
109
118
|
*
|
|
110
119
|
* @returns {Promise<Array<object>>}
|
|
111
120
|
*/
|
|
@@ -113,8 +122,8 @@ export class Project {
|
|
|
113
122
|
/**
|
|
114
123
|
* Bundled source themes plus themes contributed by installed integrations.
|
|
115
124
|
* Each record keeps its package owner and source directory so callers can
|
|
116
|
-
* both list and copy it without reconstructing paths. A broken
|
|
117
|
-
*
|
|
125
|
+
* both list and copy it without reconstructing paths. A broken theme
|
|
126
|
+
* contribution is reported without hiding the package's other valid kinds.
|
|
118
127
|
*
|
|
119
128
|
* @returns {Promise<import('../discovery/theme-discovery.mjs').DiscoveredTheme[]>}
|
|
120
129
|
*/
|
|
@@ -137,8 +146,8 @@ export class Project {
|
|
|
137
146
|
/**
|
|
138
147
|
* Core registry transforms + integration codemods for an upgrade range.
|
|
139
148
|
* Wraps getTransformsBetween (core) and discoverIntegrationCodemods /
|
|
140
|
-
* selectIntegrationCodemods (integrations).
|
|
141
|
-
*
|
|
149
|
+
* selectIntegrationCodemods (integrations). An invalid codemod contribution
|
|
150
|
+
* is reported and omitted without hiding other valid contribution kinds.
|
|
142
151
|
* Memoized per (from, to) key.
|
|
143
152
|
*
|
|
144
153
|
* @param {string} fromVersion exclusive lower bound
|
|
@@ -15,14 +15,16 @@
|
|
|
15
15
|
* async). It does what loadConfig did — find the config sibling-of
|
|
16
16
|
* package.json, import + validate it, load the configured integrations —
|
|
17
17
|
* plus autolink the installed ones no config names, and self-resolve the
|
|
18
|
-
* package being authored when it carries a manifest.
|
|
18
|
+
* package being authored when it carries a manifest. Provider identity is
|
|
19
|
+
* resolved once over all three (see integrations/provider-resolution), and
|
|
20
|
+
* the ledger is kept for {@link providerLedgerOf}. Discovery is LAZY.
|
|
19
21
|
* - Discovery methods (components/templates/codemods/docs/themes) are MEMOIZED per
|
|
20
22
|
* instance (via the pluggable cache) and orchestrate the EXISTING discovery
|
|
21
23
|
* functions — Project never reimplements discovery.
|
|
22
|
-
* - SKIP + WARN policy:
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
24
|
+
* - SKIP + WARN policy: discovery records each integration issue. Other valid
|
|
25
|
+
* contribution kinds remain available; invalid template and component files
|
|
26
|
+
* do not hide valid siblings. A manifest load failure still withdraws the
|
|
27
|
+
* package because its roots cannot be trusted.
|
|
26
28
|
* - `issues()` returns the deduped accumulated set, and (when called
|
|
27
29
|
* directly) fills in validation for any configured integration not yet
|
|
28
30
|
* visited by a discovery call, so it is always complete on demand.
|
|
@@ -38,9 +40,10 @@ import {parseConfig} from '../../authoring/config/parse.mjs';
|
|
|
38
40
|
import {
|
|
39
41
|
loadIntegrations,
|
|
40
42
|
loadLocalIntegration,
|
|
41
|
-
|
|
43
|
+
resolvePackageDir,
|
|
42
44
|
} from '../integrations/integrations.mjs';
|
|
43
|
-
import {
|
|
45
|
+
import {loadAutolinkCandidates} from '../integrations/autolink.mjs';
|
|
46
|
+
import {resolveProviders} from '../integrations/provider-resolution.mjs';
|
|
44
47
|
import {
|
|
45
48
|
setProject as setDebugProject,
|
|
46
49
|
setEventHandler as setDebugEventHandler,
|
|
@@ -49,11 +52,13 @@ import {
|
|
|
49
52
|
import {
|
|
50
53
|
CORE_PACKAGE,
|
|
51
54
|
discoverOwnedComponents,
|
|
52
|
-
|
|
55
|
+
discoverValidIntegrationComponents,
|
|
53
56
|
} from '../discovery/component-discovery.mjs';
|
|
54
57
|
import {findCoreDir} from '../fs/paths.mjs';
|
|
55
58
|
import {
|
|
56
|
-
|
|
59
|
+
applyTemplateReplacements,
|
|
60
|
+
effectiveTemplateDiscovery,
|
|
61
|
+
discoverAllUnresolved as discoverTemplates,
|
|
57
62
|
discoverIntegrationTemplatesForOne,
|
|
58
63
|
} from '../discovery/template-adapter.mjs';
|
|
59
64
|
import {
|
|
@@ -69,10 +74,7 @@ import {
|
|
|
69
74
|
discoverIntegrationCodemods,
|
|
70
75
|
selectIntegrationCodemods,
|
|
71
76
|
} from '../../assets/codemods/integration-discovery.mjs';
|
|
72
|
-
import {
|
|
73
|
-
INVALID_AGENT_DOCS,
|
|
74
|
-
validateLoadedIntegration,
|
|
75
|
-
} from '../integrations/validate-contributions.mjs';
|
|
77
|
+
import {validateLoadedIntegration} from '../integrations/validate-contributions.mjs';
|
|
76
78
|
import {
|
|
77
79
|
InMemoryConfigCache,
|
|
78
80
|
cacheKey,
|
|
@@ -95,6 +97,118 @@ function errorMessage(err) {
|
|
|
95
97
|
return message == null ? String(err) : String(message);
|
|
96
98
|
}
|
|
97
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Load the configured integrations one at a time, so a package that cannot
|
|
102
|
+
* load at all (not installed, no manifest, more than one manifest, not a bare
|
|
103
|
+
* name) becomes that entry's load-error marker instead of failing the project.
|
|
104
|
+
* @param {string[]} specs
|
|
105
|
+
* @param {{cwd: string, fresh: boolean}} options
|
|
106
|
+
* @returns {Promise<import('../integrations/integrations.mjs').LoadedIntegration[]>}
|
|
107
|
+
*/
|
|
108
|
+
async function loadConfiguredIntegrations(specs, {cwd, fresh}) {
|
|
109
|
+
/** @type {import('../integrations/integrations.mjs').LoadedIntegration[]} */
|
|
110
|
+
const loaded = [];
|
|
111
|
+
const seen = new Set();
|
|
112
|
+
for (const spec of specs) {
|
|
113
|
+
if (!spec || seen.has(spec)) continue;
|
|
114
|
+
seen.add(spec);
|
|
115
|
+
try {
|
|
116
|
+
loaded.push(
|
|
117
|
+
...(await loadIntegrations([spec], {
|
|
118
|
+
cwd,
|
|
119
|
+
fresh,
|
|
120
|
+
resolveProviders: false,
|
|
121
|
+
})),
|
|
122
|
+
);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
/** @type {string|undefined} */
|
|
125
|
+
let packageDir;
|
|
126
|
+
try {
|
|
127
|
+
packageDir = resolvePackageDir(spec, cwd);
|
|
128
|
+
} catch {
|
|
129
|
+
// Not a bare package name: there is no install location to record.
|
|
130
|
+
}
|
|
131
|
+
const pkg = packageDir ? readPackageJson(packageDir) : null;
|
|
132
|
+
loaded.push(
|
|
133
|
+
loadErrorMarker({
|
|
134
|
+
name: packageName(pkg) ?? spec,
|
|
135
|
+
version: pkg?.version,
|
|
136
|
+
spec,
|
|
137
|
+
packageDir,
|
|
138
|
+
err,
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return loaded;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Resolve the package being authored. Every failure, including an unreadable
|
|
148
|
+
* package.json or more than one manifest, becomes its load-error marker.
|
|
149
|
+
* @param {string} projectDir
|
|
150
|
+
* @param {boolean} fresh
|
|
151
|
+
* @returns {Promise<import('../integrations/integrations.mjs').LoadedIntegration|null>}
|
|
152
|
+
*/
|
|
153
|
+
async function loadLocalIntegrationSafely(projectDir, fresh) {
|
|
154
|
+
try {
|
|
155
|
+
return await loadLocalIntegration(projectDir, {fresh});
|
|
156
|
+
} catch (err) {
|
|
157
|
+
const pkg = readPackageJson(projectDir);
|
|
158
|
+
const name = packageName(pkg) ?? '(local integration)';
|
|
159
|
+
return {
|
|
160
|
+
...loadErrorMarker({
|
|
161
|
+
name,
|
|
162
|
+
version: pkg?.version,
|
|
163
|
+
spec: name,
|
|
164
|
+
packageDir: projectDir,
|
|
165
|
+
err,
|
|
166
|
+
}),
|
|
167
|
+
__local: true,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* An inert entry for an integration that could not be loaded. It contributes
|
|
174
|
+
* nothing; Project reports its `__loadError` as the package's issue.
|
|
175
|
+
* @param {{name: string, version?: unknown, spec: string, packageDir?: string, err: unknown}} input
|
|
176
|
+
* @returns {import('../integrations/integrations.mjs').LoadedIntegration}
|
|
177
|
+
*/
|
|
178
|
+
function loadErrorMarker({name, version, spec, packageDir, err}) {
|
|
179
|
+
return /** @type {import('../integrations/integrations.mjs').LoadedIntegration} */ ({
|
|
180
|
+
name,
|
|
181
|
+
...(typeof version === 'string' ? {version} : {}),
|
|
182
|
+
__spec: spec,
|
|
183
|
+
...(packageDir ? {__packageDir: packageDir} : {}),
|
|
184
|
+
__loadError: errorMessage(err),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @param {Record<string, unknown>|null} pkg
|
|
190
|
+
* @returns {string|undefined}
|
|
191
|
+
*/
|
|
192
|
+
function packageName(pkg) {
|
|
193
|
+
const name = pkg?.name;
|
|
194
|
+
return typeof name === 'string' && name.length > 0 ? name : undefined;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @param {string} dir
|
|
199
|
+
* @returns {Record<string, unknown>|null}
|
|
200
|
+
*/
|
|
201
|
+
function readPackageJson(dir) {
|
|
202
|
+
try {
|
|
203
|
+
const pkg = JSON.parse(
|
|
204
|
+
fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'),
|
|
205
|
+
);
|
|
206
|
+
return pkg && typeof pkg === 'object' ? pkg : null;
|
|
207
|
+
} catch {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
98
212
|
/**
|
|
99
213
|
* An integration issue tagged with the owner package. The base
|
|
100
214
|
* {@link import('../integrations/issue').AstryxIntegrationIssue} fields plus the
|
|
@@ -147,13 +261,15 @@ function findPackageRoot(startDir) {
|
|
|
147
261
|
*
|
|
148
262
|
* This governs INHERITED handlers only. A project's own `debug` always runs.
|
|
149
263
|
*
|
|
150
|
-
*
|
|
264
|
+
* Read from the project root whether or not an astryx.config exists: an
|
|
265
|
+
* autolinked integration contributes a handler with no config at all.
|
|
266
|
+
*
|
|
267
|
+
* @param {string} projectDir directory holding the project's package.json
|
|
151
268
|
* @returns {boolean}
|
|
152
269
|
*/
|
|
153
|
-
function inheritsIntegrationDebug(
|
|
154
|
-
if (!configPath) return true;
|
|
270
|
+
function inheritsIntegrationDebug(projectDir) {
|
|
155
271
|
try {
|
|
156
|
-
const pkgPath = path.join(
|
|
272
|
+
const pkgPath = path.join(projectDir, 'package.json');
|
|
157
273
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
158
274
|
return pkg?.astryx?.inheritDebug !== false;
|
|
159
275
|
} catch {
|
|
@@ -182,6 +298,24 @@ export function findConfigPath(startDir = process.cwd()) {
|
|
|
182
298
|
return present.length === 1 ? present[0] : null;
|
|
183
299
|
}
|
|
184
300
|
|
|
301
|
+
/**
|
|
302
|
+
* The provider ledger each loaded Project resolved, kept off the class so it
|
|
303
|
+
* is not part of the Project API.
|
|
304
|
+
* @type {WeakMap<Project, import('../integrations/provider-resolution.mjs').ProviderLedger>}
|
|
305
|
+
*/
|
|
306
|
+
const PROVIDER_LEDGERS = new WeakMap();
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* The provider ledger a Project resolved at load: one outcome for every
|
|
310
|
+
* package directory configured, autolinked, or authored. Internal: upgrade
|
|
311
|
+
* resolves on top of it, and tests account for every candidate with it.
|
|
312
|
+
* @param {Project} project
|
|
313
|
+
* @returns {import('../integrations/provider-resolution.mjs').ProviderLedger}
|
|
314
|
+
*/
|
|
315
|
+
export function providerLedgerOf(project) {
|
|
316
|
+
return PROVIDER_LEDGERS.get(project) ?? new Map();
|
|
317
|
+
}
|
|
318
|
+
|
|
185
319
|
/**
|
|
186
320
|
* The single API for reading resolved project configuration. Construct via the
|
|
187
321
|
* async {@link Project.load} factory.
|
|
@@ -211,6 +345,8 @@ export class Project {
|
|
|
211
345
|
* @type {Set<object>}
|
|
212
346
|
*/
|
|
213
347
|
#visitedIssues = new Set();
|
|
348
|
+
/** @type {Promise<Array<object>> | null} */
|
|
349
|
+
#templatesPromise = null;
|
|
214
350
|
|
|
215
351
|
/**
|
|
216
352
|
* @param {object} init
|
|
@@ -276,11 +412,10 @@ export class Project {
|
|
|
276
412
|
fresh,
|
|
277
413
|
});
|
|
278
414
|
integrations = config.integrations ?? [];
|
|
279
|
-
|
|
415
|
+
// Provider identity is resolved once, below, over the final set.
|
|
416
|
+
loadedIntegrations = await loadConfiguredIntegrations(integrations, {
|
|
280
417
|
cwd: projectDir,
|
|
281
418
|
fresh,
|
|
282
|
-
// Provider identity is resolved once, below, over the final set.
|
|
283
|
-
resolveProviders: false,
|
|
284
419
|
});
|
|
285
420
|
}
|
|
286
421
|
|
|
@@ -288,35 +423,42 @@ export class Project {
|
|
|
288
423
|
// This runs whether or not a config exists, because the projects it reaches
|
|
289
424
|
// are overwhelmingly the ones with no astryx.config at all: a scaffold adds
|
|
290
425
|
// the dependency and writes no config, and the integration then contributes
|
|
291
|
-
// nothing for want of a line nobody knew to write.
|
|
426
|
+
// nothing for want of a line nobody knew to write. Resolved AFTER the
|
|
292
427
|
// configured ones so an explicit entry keeps its position and its
|
|
293
428
|
// precedence in every discovery order.
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
fresh,
|
|
300
|
-
})),
|
|
301
|
-
];
|
|
429
|
+
const autolinked = await loadAutolinkCandidates({
|
|
430
|
+
projectDir,
|
|
431
|
+
loaded: loadedIntegrations,
|
|
432
|
+
fresh,
|
|
433
|
+
});
|
|
302
434
|
|
|
303
435
|
// The package being authored is the one package that cannot install itself.
|
|
304
436
|
// When it carries a manifest, resolve its working bytes directly so every
|
|
305
437
|
// existing consumer command doubles as the author's preview. A local copy
|
|
306
438
|
// replaces the same installed package in place, preserving configured
|
|
307
439
|
// precedence while making the source being edited authoritative.
|
|
308
|
-
const localIntegration = await
|
|
309
|
-
if (localIntegration) {
|
|
310
|
-
const existing = loadedIntegrations.findIndex(
|
|
311
|
-
integration => integration.name === localIntegration.name,
|
|
312
|
-
);
|
|
313
|
-
if (existing === -1) loadedIntegrations.push(localIntegration);
|
|
314
|
-
else loadedIntegrations[existing] = localIntegration;
|
|
315
|
-
}
|
|
440
|
+
const localIntegration = await loadLocalIntegrationSafely(projectDir, fresh);
|
|
316
441
|
|
|
317
442
|
// Autolinked and local packages can claim a provider ID that a configured
|
|
318
443
|
// package already holds, so identity is resolved once over the final set.
|
|
319
|
-
|
|
444
|
+
const resolution = resolveProviders([
|
|
445
|
+
...loadedIntegrations.map(integration => ({
|
|
446
|
+
source: /** @type {const} */ ('configured'),
|
|
447
|
+
integration,
|
|
448
|
+
spec: integration.__spec,
|
|
449
|
+
})),
|
|
450
|
+
...autolinked,
|
|
451
|
+
...(localIntegration
|
|
452
|
+
? [
|
|
453
|
+
{
|
|
454
|
+
source: /** @type {const} */ ('local'),
|
|
455
|
+
integration: localIntegration,
|
|
456
|
+
spec: localIntegration.__spec,
|
|
457
|
+
},
|
|
458
|
+
]
|
|
459
|
+
: []),
|
|
460
|
+
]);
|
|
461
|
+
loadedIntegrations = resolution.integrations;
|
|
320
462
|
|
|
321
463
|
// The debug recorder resolves its settings synchronously, long before any
|
|
322
464
|
// command gets here, so this is where a project's `debug` block gets a
|
|
@@ -335,7 +477,7 @@ export class Project {
|
|
|
335
477
|
// because Project.load can run more than once in a process and appending
|
|
336
478
|
// would deliver twice.
|
|
337
479
|
setDebugIntegrationEventHandlers(
|
|
338
|
-
inheritsIntegrationDebug(
|
|
480
|
+
inheritsIntegrationDebug(projectDir)
|
|
339
481
|
? loadedIntegrations.map(integration => integration.__debug)
|
|
340
482
|
: [],
|
|
341
483
|
);
|
|
@@ -347,7 +489,7 @@ export class Project {
|
|
|
347
489
|
// Never let recording break config loading.
|
|
348
490
|
}
|
|
349
491
|
|
|
350
|
-
|
|
492
|
+
const project = new Project({
|
|
351
493
|
cwd,
|
|
352
494
|
configPath,
|
|
353
495
|
config,
|
|
@@ -356,6 +498,8 @@ export class Project {
|
|
|
356
498
|
cache: resolvedCache,
|
|
357
499
|
hash,
|
|
358
500
|
});
|
|
501
|
+
PROVIDER_LEDGERS.set(project, resolution.ledger);
|
|
502
|
+
return project;
|
|
359
503
|
}
|
|
360
504
|
|
|
361
505
|
/**
|
|
@@ -454,22 +598,6 @@ export class Project {
|
|
|
454
598
|
return integration?.name ?? integration?.__spec ?? '(integration)';
|
|
455
599
|
}
|
|
456
600
|
|
|
457
|
-
/**
|
|
458
|
-
* Whether this package has an error that invalidates its regular manifest
|
|
459
|
-
* contributions. Invalid `agentDocs` blocks agent-doc writes only; it must not
|
|
460
|
-
* withdraw components, templates, docs, or codemods.
|
|
461
|
-
* @param {string} pkg
|
|
462
|
-
* @returns {boolean}
|
|
463
|
-
*/
|
|
464
|
-
#hasBlockingContributionIssue(pkg) {
|
|
465
|
-
return this.#issues.some(
|
|
466
|
-
issue =>
|
|
467
|
-
issue.package === pkg &&
|
|
468
|
-
issue.severity === 'error' &&
|
|
469
|
-
issue.code !== INVALID_AGENT_DOCS,
|
|
470
|
-
);
|
|
471
|
-
}
|
|
472
|
-
|
|
473
601
|
/**
|
|
474
602
|
* Validate one loaded integration and collect any issues. Marks the
|
|
475
603
|
* integration visited so issues() won't redo the work. Best-effort: a
|
|
@@ -506,9 +634,9 @@ export class Project {
|
|
|
506
634
|
/**
|
|
507
635
|
* Core + integration component ownership records. Wraps
|
|
508
636
|
* discoverOwnedComponents for core and discoverIntegrationComponents (via
|
|
509
|
-
* discoverOwnedComponents) for integrations
|
|
510
|
-
*
|
|
511
|
-
*
|
|
637
|
+
* discoverOwnedComponents) for integrations. Invalid component records are
|
|
638
|
+
* omitted and reported; valid component siblings and other contribution kinds
|
|
639
|
+
* remain available. Memoized per instance.
|
|
512
640
|
*
|
|
513
641
|
* @returns {Promise<Array<{name: string, package: string, group: string|null, docPath: string|null, sourcePath: string|null, issuesUrl: string|undefined}>>}
|
|
514
642
|
*/
|
|
@@ -528,18 +656,17 @@ export class Project {
|
|
|
528
656
|
}
|
|
529
657
|
}
|
|
530
658
|
|
|
531
|
-
// Each integration
|
|
659
|
+
// Each integration is discovered independently. Invalid records are
|
|
660
|
+
// omitted below without hiding valid siblings or other contribution kinds.
|
|
532
661
|
for (const integration of this.#loadedIntegrations) {
|
|
533
662
|
await this.#collectIssues(integration);
|
|
534
663
|
const pkg = this.#pkgLabel(integration);
|
|
535
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
536
664
|
try {
|
|
537
|
-
//
|
|
538
|
-
//
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
}
|
|
665
|
+
// #collectIssues (above) already reported each withdrawn record,
|
|
666
|
+
// with its fix, through the same discovery.
|
|
667
|
+
const {components} =
|
|
668
|
+
await discoverValidIntegrationComponents(integration);
|
|
669
|
+
records.push(...components);
|
|
543
670
|
} catch (err) {
|
|
544
671
|
this.#pushIssue(pkg, {
|
|
545
672
|
code: 'invalid_component',
|
|
@@ -554,17 +681,21 @@ export class Project {
|
|
|
554
681
|
}
|
|
555
682
|
|
|
556
683
|
/**
|
|
557
|
-
* Core + integration templates, type-tagged
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
*
|
|
684
|
+
* Core + integration templates, type-tagged, with valid integration
|
|
685
|
+
* replacements projected over their Core targets. Wraps raw template discovery
|
|
686
|
+
* (Core + external blocks) and discoverIntegrationTemplatesForOne per integration
|
|
687
|
+
* so unusable template files are reported and omitted while valid siblings
|
|
688
|
+
* remain available. Memoized per instance.
|
|
561
689
|
*
|
|
562
690
|
* @returns {Promise<Array<object>>}
|
|
563
691
|
*/
|
|
564
692
|
async templates() {
|
|
565
|
-
|
|
693
|
+
if (this.#templatesPromise) return this.#templatesPromise;
|
|
694
|
+
this.#templatesPromise = (async () => {
|
|
566
695
|
/** @type {any[]} */
|
|
567
696
|
const templates = [];
|
|
697
|
+
/** @type {import('../discovery/template-adapter.mjs').TemplateDiscoveryError[]} */
|
|
698
|
+
const replacementErrors = [];
|
|
568
699
|
|
|
569
700
|
// Core + external-package templates (discoverTemplates internally also
|
|
570
701
|
// loads integration templates via loadConfig today; we intentionally
|
|
@@ -585,20 +716,24 @@ export class Project {
|
|
|
585
716
|
for (const integration of this.#loadedIntegrations) {
|
|
586
717
|
await this.#collectIssues(integration);
|
|
587
718
|
const pkg = this.#pkgLabel(integration);
|
|
588
|
-
|
|
719
|
+
// Template discovery already isolates invalid template files and returns
|
|
720
|
+
// every valid sibling. Do not withdraw templates because another
|
|
721
|
+
// contribution kind in this package is broken.
|
|
589
722
|
try {
|
|
590
723
|
const {templates: ts, errors} =
|
|
591
724
|
await discoverIntegrationTemplatesForOne(integration);
|
|
592
725
|
for (const e of errors) {
|
|
593
726
|
this.#pushIssue(pkg, {
|
|
594
|
-
code: 'invalid_template',
|
|
595
|
-
severity: 'error',
|
|
727
|
+
code: e.code ?? 'invalid_template',
|
|
728
|
+
severity: e.severity ?? 'error',
|
|
596
729
|
message: e.message,
|
|
597
730
|
});
|
|
731
|
+
if (e.replacementTarget != null) replacementErrors.push(e);
|
|
598
732
|
}
|
|
599
|
-
//
|
|
600
|
-
//
|
|
601
|
-
|
|
733
|
+
// Discovery already omits each unusable template from `ts`. Keep all
|
|
734
|
+
// valid siblings, while the collected errors remain visible through
|
|
735
|
+
// issues() and replacement errors disable only their own targets.
|
|
736
|
+
templates.push(...ts);
|
|
602
737
|
} catch (err) {
|
|
603
738
|
this.#pushIssue(pkg, {
|
|
604
739
|
code: 'invalid_template',
|
|
@@ -608,15 +743,24 @@ export class Project {
|
|
|
608
743
|
}
|
|
609
744
|
}
|
|
610
745
|
|
|
611
|
-
|
|
612
|
-
|
|
746
|
+
const resolved = applyTemplateReplacements(templates, replacementErrors);
|
|
747
|
+
for (const error of resolved.errors) {
|
|
748
|
+
this.#pushIssue(error.package, {
|
|
749
|
+
code: error.code,
|
|
750
|
+
severity: error.severity,
|
|
751
|
+
message: error.message,
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
return effectiveTemplateDiscovery(resolved.templates);
|
|
755
|
+
})();
|
|
756
|
+
return this.#templatesPromise;
|
|
613
757
|
}
|
|
614
758
|
|
|
615
759
|
/**
|
|
616
760
|
* Bundled source themes plus themes contributed by installed integrations.
|
|
617
761
|
* Each record keeps its package owner and source directory so callers can
|
|
618
|
-
* both list and copy it without reconstructing paths. A broken
|
|
619
|
-
*
|
|
762
|
+
* both list and copy it without reconstructing paths. A broken theme
|
|
763
|
+
* contribution is reported without hiding the package's other valid kinds.
|
|
620
764
|
*
|
|
621
765
|
* @returns {Promise<import('../discovery/theme-discovery.mjs').DiscoveredTheme[]>}
|
|
622
766
|
*/
|
|
@@ -627,7 +771,6 @@ export class Project {
|
|
|
627
771
|
for (const integration of this.#loadedIntegrations) {
|
|
628
772
|
await this.#collectIssues(integration);
|
|
629
773
|
const pkg = this.#pkgLabel(integration);
|
|
630
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
631
774
|
if (!integration?.themes) continue;
|
|
632
775
|
try {
|
|
633
776
|
themes.push(...(await discoverIntegrationThemes(integration)));
|
|
@@ -661,14 +804,16 @@ export class Project {
|
|
|
661
804
|
async docs() {
|
|
662
805
|
return this.#memo('docs', async () => {
|
|
663
806
|
const catalog = DocsCatalog.fromBuiltins();
|
|
807
|
+
let rank = 0;
|
|
664
808
|
|
|
665
809
|
for (const integration of this.#loadedIntegrations) {
|
|
810
|
+
rank += 1;
|
|
666
811
|
await this.#collectIssues(integration);
|
|
667
812
|
const pkg = this.#pkgLabel(integration);
|
|
668
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
669
813
|
if (!integration?.docs) continue;
|
|
670
814
|
try {
|
|
671
|
-
const {records, errors} =
|
|
815
|
+
const {records, errors, namespaces, guides} =
|
|
816
|
+
await discoverIntegrationDocs(integration);
|
|
672
817
|
for (const e of errors) {
|
|
673
818
|
this.#pushIssue(pkg, {
|
|
674
819
|
code: 'invalid_doc',
|
|
@@ -680,11 +825,20 @@ export class Project {
|
|
|
680
825
|
// how a bad template withdraws its package's templates: a partial
|
|
681
826
|
// docs contribution is the state where a `replaces` silently does
|
|
682
827
|
// nothing and a reader gets the topic it was meant to replace.
|
|
683
|
-
if (errors.length > 0)
|
|
828
|
+
if (errors.length > 0) {
|
|
829
|
+
for (const e of errors) {
|
|
830
|
+
catalog.addIssue({package: integration.name ?? pkg, message: e.message});
|
|
831
|
+
}
|
|
832
|
+
continue;
|
|
833
|
+
}
|
|
684
834
|
for (const record of records) {
|
|
685
835
|
const issue = catalog.add(record);
|
|
686
836
|
if (issue) this.#pushIssue(pkg, issue);
|
|
687
837
|
}
|
|
838
|
+
catalog.addTreeInputs({
|
|
839
|
+
namespaces: namespaces.map(input => ({...input, rank})),
|
|
840
|
+
guides: guides.map(input => ({...input, rank})),
|
|
841
|
+
});
|
|
688
842
|
} catch (err) {
|
|
689
843
|
this.#pushIssue(pkg, {
|
|
690
844
|
code: 'invalid_doc',
|
|
@@ -701,8 +855,8 @@ export class Project {
|
|
|
701
855
|
/**
|
|
702
856
|
* Core registry transforms + integration codemods for an upgrade range.
|
|
703
857
|
* Wraps getTransformsBetween (core) and discoverIntegrationCodemods /
|
|
704
|
-
* selectIntegrationCodemods (integrations).
|
|
705
|
-
*
|
|
858
|
+
* selectIntegrationCodemods (integrations). An invalid codemod contribution
|
|
859
|
+
* is reported and omitted without hiding other valid contribution kinds.
|
|
706
860
|
* Memoized per (from, to) key.
|
|
707
861
|
*
|
|
708
862
|
* @param {string} fromVersion exclusive lower bound
|
|
@@ -720,7 +874,6 @@ export class Project {
|
|
|
720
874
|
for (const integration of this.#loadedIntegrations) {
|
|
721
875
|
await this.#collectIssues(integration);
|
|
722
876
|
const pkg = this.#pkgLabel(integration);
|
|
723
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
724
877
|
if (!integration?.codemods) continue;
|
|
725
878
|
try {
|
|
726
879
|
// Validate this integration's codemods discover cleanly in
|
|
@@ -775,6 +928,10 @@ export class Project {
|
|
|
775
928
|
* @returns {Promise<ProjectIntegrationIssue[]>}
|
|
776
929
|
*/
|
|
777
930
|
async issues() {
|
|
931
|
+
// Template replacement validity depends on the combined Core + integration
|
|
932
|
+
// catalog. Resolve it first so issue results never depend on which discovery
|
|
933
|
+
// method the caller happened to invoke earlier.
|
|
934
|
+
await this.templates();
|
|
778
935
|
for (const integration of this.#loadedIntegrations) {
|
|
779
936
|
await this.#collectIssues(integration);
|
|
780
937
|
}
|