@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683
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 +117 -78
- 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 +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +164 -4
- 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/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +99 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +548 -1
- package/api/doctor/doctor.test.mjs +610 -1
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +1 -1
- package/api/index.mjs +1 -0
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-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 +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.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 +62 -11
- 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 +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/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 +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +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 +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +27 -11
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- 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/registry.mjs +1 -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/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 +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- 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} +144 -26
- 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/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 +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 +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 +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +5 -4
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +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 +48 -6
- package/authoring/doctypes/reference/type.ts +70 -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 +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +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 +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +193 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +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 +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -30
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +37 -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 +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 +170 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -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 +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/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +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 +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/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +41 -21
- 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
|
@@ -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,8 +40,10 @@ import {parseConfig} from '../../authoring/config/parse.mjs';
|
|
|
38
40
|
import {
|
|
39
41
|
loadIntegrations,
|
|
40
42
|
loadLocalIntegration,
|
|
43
|
+
resolvePackageDir,
|
|
41
44
|
} from '../integrations/integrations.mjs';
|
|
42
|
-
import {
|
|
45
|
+
import {loadAutolinkCandidates} from '../integrations/autolink.mjs';
|
|
46
|
+
import {resolveProviders} from '../integrations/provider-resolution.mjs';
|
|
43
47
|
import {
|
|
44
48
|
setProject as setDebugProject,
|
|
45
49
|
setEventHandler as setDebugEventHandler,
|
|
@@ -48,11 +52,13 @@ import {
|
|
|
48
52
|
import {
|
|
49
53
|
CORE_PACKAGE,
|
|
50
54
|
discoverOwnedComponents,
|
|
51
|
-
|
|
55
|
+
discoverValidIntegrationComponents,
|
|
52
56
|
} from '../discovery/component-discovery.mjs';
|
|
53
57
|
import {findCoreDir} from '../fs/paths.mjs';
|
|
54
58
|
import {
|
|
55
|
-
|
|
59
|
+
applyTemplateReplacements,
|
|
60
|
+
effectiveTemplateDiscovery,
|
|
61
|
+
discoverAllUnresolved as discoverTemplates,
|
|
56
62
|
discoverIntegrationTemplatesForOne,
|
|
57
63
|
} from '../discovery/template-adapter.mjs';
|
|
58
64
|
import {
|
|
@@ -68,10 +74,7 @@ import {
|
|
|
68
74
|
discoverIntegrationCodemods,
|
|
69
75
|
selectIntegrationCodemods,
|
|
70
76
|
} from '../../assets/codemods/integration-discovery.mjs';
|
|
71
|
-
import {
|
|
72
|
-
INVALID_AGENT_DOCS,
|
|
73
|
-
validateLoadedIntegration,
|
|
74
|
-
} from '../integrations/validate-contributions.mjs';
|
|
77
|
+
import {validateLoadedIntegration} from '../integrations/validate-contributions.mjs';
|
|
75
78
|
import {
|
|
76
79
|
InMemoryConfigCache,
|
|
77
80
|
cacheKey,
|
|
@@ -94,6 +97,118 @@ function errorMessage(err) {
|
|
|
94
97
|
return message == null ? String(err) : String(message);
|
|
95
98
|
}
|
|
96
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
|
+
|
|
97
212
|
/**
|
|
98
213
|
* An integration issue tagged with the owner package. The base
|
|
99
214
|
* {@link import('../integrations/issue').AstryxIntegrationIssue} fields plus the
|
|
@@ -146,13 +261,15 @@ function findPackageRoot(startDir) {
|
|
|
146
261
|
*
|
|
147
262
|
* This governs INHERITED handlers only. A project's own `debug` always runs.
|
|
148
263
|
*
|
|
149
|
-
*
|
|
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
|
|
150
268
|
* @returns {boolean}
|
|
151
269
|
*/
|
|
152
|
-
function inheritsIntegrationDebug(
|
|
153
|
-
if (!configPath) return true;
|
|
270
|
+
function inheritsIntegrationDebug(projectDir) {
|
|
154
271
|
try {
|
|
155
|
-
const pkgPath = path.join(
|
|
272
|
+
const pkgPath = path.join(projectDir, 'package.json');
|
|
156
273
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
157
274
|
return pkg?.astryx?.inheritDebug !== false;
|
|
158
275
|
} catch {
|
|
@@ -181,6 +298,24 @@ export function findConfigPath(startDir = process.cwd()) {
|
|
|
181
298
|
return present.length === 1 ? present[0] : null;
|
|
182
299
|
}
|
|
183
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
|
+
|
|
184
319
|
/**
|
|
185
320
|
* The single API for reading resolved project configuration. Construct via the
|
|
186
321
|
* async {@link Project.load} factory.
|
|
@@ -203,12 +338,15 @@ export class Project {
|
|
|
203
338
|
/** @type {ProjectIntegrationIssue[]} */
|
|
204
339
|
#issues = [];
|
|
205
340
|
/**
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
341
|
+
* Loaded integrations whose issues have already been collected (via a
|
|
342
|
+
* discovery method or a direct issues() validation), so issues() can fill in
|
|
343
|
+
* only the ones not yet visited and never double-collect. Keyed by entry, not
|
|
344
|
+
* label: two entries can share a package name (an alias at another version).
|
|
345
|
+
* @type {Set<object>}
|
|
210
346
|
*/
|
|
211
347
|
#visitedIssues = new Set();
|
|
348
|
+
/** @type {Promise<Array<object>> | null} */
|
|
349
|
+
#templatesPromise = null;
|
|
212
350
|
|
|
213
351
|
/**
|
|
214
352
|
* @param {object} init
|
|
@@ -274,7 +412,8 @@ export class Project {
|
|
|
274
412
|
fresh,
|
|
275
413
|
});
|
|
276
414
|
integrations = config.integrations ?? [];
|
|
277
|
-
|
|
415
|
+
// Provider identity is resolved once, below, over the final set.
|
|
416
|
+
loadedIntegrations = await loadConfiguredIntegrations(integrations, {
|
|
278
417
|
cwd: projectDir,
|
|
279
418
|
fresh,
|
|
280
419
|
});
|
|
@@ -284,31 +423,42 @@ export class Project {
|
|
|
284
423
|
// This runs whether or not a config exists, because the projects it reaches
|
|
285
424
|
// are overwhelmingly the ones with no astryx.config at all: a scaffold adds
|
|
286
425
|
// the dependency and writes no config, and the integration then contributes
|
|
287
|
-
// nothing for want of a line nobody knew to write.
|
|
426
|
+
// nothing for want of a line nobody knew to write. Resolved AFTER the
|
|
288
427
|
// configured ones so an explicit entry keeps its position and its
|
|
289
428
|
// precedence in every discovery order.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
fresh,
|
|
296
|
-
})),
|
|
297
|
-
];
|
|
429
|
+
const autolinked = await loadAutolinkCandidates({
|
|
430
|
+
projectDir,
|
|
431
|
+
loaded: loadedIntegrations,
|
|
432
|
+
fresh,
|
|
433
|
+
});
|
|
298
434
|
|
|
299
435
|
// The package being authored is the one package that cannot install itself.
|
|
300
436
|
// When it carries a manifest, resolve its working bytes directly so every
|
|
301
437
|
// existing consumer command doubles as the author's preview. A local copy
|
|
302
438
|
// replaces the same installed package in place, preserving configured
|
|
303
439
|
// precedence while making the source being edited authoritative.
|
|
304
|
-
const localIntegration = await
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
440
|
+
const localIntegration = await loadLocalIntegrationSafely(projectDir, fresh);
|
|
441
|
+
|
|
442
|
+
// Autolinked and local packages can claim a provider ID that a configured
|
|
443
|
+
// package already holds, so identity is resolved once over the final set.
|
|
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;
|
|
312
462
|
|
|
313
463
|
// The debug recorder resolves its settings synchronously, long before any
|
|
314
464
|
// command gets here, so this is where a project's `debug` block gets a
|
|
@@ -327,7 +477,7 @@ export class Project {
|
|
|
327
477
|
// because Project.load can run more than once in a process and appending
|
|
328
478
|
// would deliver twice.
|
|
329
479
|
setDebugIntegrationEventHandlers(
|
|
330
|
-
inheritsIntegrationDebug(
|
|
480
|
+
inheritsIntegrationDebug(projectDir)
|
|
331
481
|
? loadedIntegrations.map(integration => integration.__debug)
|
|
332
482
|
: [],
|
|
333
483
|
);
|
|
@@ -339,7 +489,7 @@ export class Project {
|
|
|
339
489
|
// Never let recording break config loading.
|
|
340
490
|
}
|
|
341
491
|
|
|
342
|
-
|
|
492
|
+
const project = new Project({
|
|
343
493
|
cwd,
|
|
344
494
|
configPath,
|
|
345
495
|
config,
|
|
@@ -348,6 +498,8 @@ export class Project {
|
|
|
348
498
|
cache: resolvedCache,
|
|
349
499
|
hash,
|
|
350
500
|
});
|
|
501
|
+
PROVIDER_LEDGERS.set(project, resolution.ledger);
|
|
502
|
+
return project;
|
|
351
503
|
}
|
|
352
504
|
|
|
353
505
|
/**
|
|
@@ -436,25 +588,16 @@ export class Project {
|
|
|
436
588
|
* @returns {string}
|
|
437
589
|
*/
|
|
438
590
|
#pkgLabel(integration) {
|
|
591
|
+
// A set-aside package is labelled name@version, so its issue never reads as
|
|
592
|
+
// the winner's, even when both share a package name.
|
|
593
|
+
if (integration?.__providerConflict) {
|
|
594
|
+
return integration.version
|
|
595
|
+
? `${integration.name}@${integration.version}`
|
|
596
|
+
: (integration.__spec ?? integration.name);
|
|
597
|
+
}
|
|
439
598
|
return integration?.name ?? integration?.__spec ?? '(integration)';
|
|
440
599
|
}
|
|
441
600
|
|
|
442
|
-
/**
|
|
443
|
-
* Whether this package has an error that invalidates its regular manifest
|
|
444
|
-
* contributions. Invalid `agentDocs` blocks agent-doc writes only; it must not
|
|
445
|
-
* withdraw components, templates, docs, or codemods.
|
|
446
|
-
* @param {string} pkg
|
|
447
|
-
* @returns {boolean}
|
|
448
|
-
*/
|
|
449
|
-
#hasBlockingContributionIssue(pkg) {
|
|
450
|
-
return this.#issues.some(
|
|
451
|
-
issue =>
|
|
452
|
-
issue.package === pkg &&
|
|
453
|
-
issue.severity === 'error' &&
|
|
454
|
-
issue.code !== INVALID_AGENT_DOCS,
|
|
455
|
-
);
|
|
456
|
-
}
|
|
457
|
-
|
|
458
601
|
/**
|
|
459
602
|
* Validate one loaded integration and collect any issues. Marks the
|
|
460
603
|
* integration visited so issues() won't redo the work. Best-effort: a
|
|
@@ -463,8 +606,8 @@ export class Project {
|
|
|
463
606
|
*/
|
|
464
607
|
async #collectIssues(integration) {
|
|
465
608
|
const pkg = this.#pkgLabel(integration);
|
|
466
|
-
if (this.#visitedIssues.has(
|
|
467
|
-
this.#visitedIssues.add(
|
|
609
|
+
if (this.#visitedIssues.has(integration)) return;
|
|
610
|
+
this.#visitedIssues.add(integration);
|
|
468
611
|
// A manifest that failed to load (throwing import / invalid shape) is
|
|
469
612
|
// recorded as a marker by loadIntegrations — surface it as an issue and
|
|
470
613
|
// skip validation (there's no manifest to validate).
|
|
@@ -491,9 +634,9 @@ export class Project {
|
|
|
491
634
|
/**
|
|
492
635
|
* Core + integration component ownership records. Wraps
|
|
493
636
|
* discoverOwnedComponents for core and discoverIntegrationComponents (via
|
|
494
|
-
* discoverOwnedComponents) for integrations
|
|
495
|
-
*
|
|
496
|
-
*
|
|
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.
|
|
497
640
|
*
|
|
498
641
|
* @returns {Promise<Array<{name: string, package: string, group: string|null, docPath: string|null, sourcePath: string|null, issuesUrl: string|undefined}>>}
|
|
499
642
|
*/
|
|
@@ -513,18 +656,17 @@ export class Project {
|
|
|
513
656
|
}
|
|
514
657
|
}
|
|
515
658
|
|
|
516
|
-
// Each integration
|
|
659
|
+
// Each integration is discovered independently. Invalid records are
|
|
660
|
+
// omitted below without hiding valid siblings or other contribution kinds.
|
|
517
661
|
for (const integration of this.#loadedIntegrations) {
|
|
518
662
|
await this.#collectIssues(integration);
|
|
519
663
|
const pkg = this.#pkgLabel(integration);
|
|
520
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
521
664
|
try {
|
|
522
|
-
//
|
|
523
|
-
//
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
}
|
|
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);
|
|
528
670
|
} catch (err) {
|
|
529
671
|
this.#pushIssue(pkg, {
|
|
530
672
|
code: 'invalid_component',
|
|
@@ -539,17 +681,21 @@ export class Project {
|
|
|
539
681
|
}
|
|
540
682
|
|
|
541
683
|
/**
|
|
542
|
-
* Core + integration templates, type-tagged
|
|
543
|
-
*
|
|
544
|
-
*
|
|
545
|
-
*
|
|
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.
|
|
546
689
|
*
|
|
547
690
|
* @returns {Promise<Array<object>>}
|
|
548
691
|
*/
|
|
549
692
|
async templates() {
|
|
550
|
-
|
|
693
|
+
if (this.#templatesPromise) return this.#templatesPromise;
|
|
694
|
+
this.#templatesPromise = (async () => {
|
|
551
695
|
/** @type {any[]} */
|
|
552
696
|
const templates = [];
|
|
697
|
+
/** @type {import('../discovery/template-adapter.mjs').TemplateDiscoveryError[]} */
|
|
698
|
+
const replacementErrors = [];
|
|
553
699
|
|
|
554
700
|
// Core + external-package templates (discoverTemplates internally also
|
|
555
701
|
// loads integration templates via loadConfig today; we intentionally
|
|
@@ -570,20 +716,24 @@ export class Project {
|
|
|
570
716
|
for (const integration of this.#loadedIntegrations) {
|
|
571
717
|
await this.#collectIssues(integration);
|
|
572
718
|
const pkg = this.#pkgLabel(integration);
|
|
573
|
-
|
|
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.
|
|
574
722
|
try {
|
|
575
723
|
const {templates: ts, errors} =
|
|
576
724
|
await discoverIntegrationTemplatesForOne(integration);
|
|
577
725
|
for (const e of errors) {
|
|
578
726
|
this.#pushIssue(pkg, {
|
|
579
|
-
code: 'invalid_template',
|
|
580
|
-
severity: 'error',
|
|
727
|
+
code: e.code ?? 'invalid_template',
|
|
728
|
+
severity: e.severity ?? 'error',
|
|
581
729
|
message: e.message,
|
|
582
730
|
});
|
|
731
|
+
if (e.replacementTarget != null) replacementErrors.push(e);
|
|
583
732
|
}
|
|
584
|
-
//
|
|
585
|
-
//
|
|
586
|
-
|
|
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);
|
|
587
737
|
} catch (err) {
|
|
588
738
|
this.#pushIssue(pkg, {
|
|
589
739
|
code: 'invalid_template',
|
|
@@ -593,15 +743,24 @@ export class Project {
|
|
|
593
743
|
}
|
|
594
744
|
}
|
|
595
745
|
|
|
596
|
-
|
|
597
|
-
|
|
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;
|
|
598
757
|
}
|
|
599
758
|
|
|
600
759
|
/**
|
|
601
760
|
* Bundled source themes plus themes contributed by installed integrations.
|
|
602
761
|
* Each record keeps its package owner and source directory so callers can
|
|
603
|
-
* both list and copy it without reconstructing paths. A broken
|
|
604
|
-
*
|
|
762
|
+
* both list and copy it without reconstructing paths. A broken theme
|
|
763
|
+
* contribution is reported without hiding the package's other valid kinds.
|
|
605
764
|
*
|
|
606
765
|
* @returns {Promise<import('../discovery/theme-discovery.mjs').DiscoveredTheme[]>}
|
|
607
766
|
*/
|
|
@@ -612,7 +771,6 @@ export class Project {
|
|
|
612
771
|
for (const integration of this.#loadedIntegrations) {
|
|
613
772
|
await this.#collectIssues(integration);
|
|
614
773
|
const pkg = this.#pkgLabel(integration);
|
|
615
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
616
774
|
if (!integration?.themes) continue;
|
|
617
775
|
try {
|
|
618
776
|
themes.push(...(await discoverIntegrationThemes(integration)));
|
|
@@ -646,14 +804,16 @@ export class Project {
|
|
|
646
804
|
async docs() {
|
|
647
805
|
return this.#memo('docs', async () => {
|
|
648
806
|
const catalog = DocsCatalog.fromBuiltins();
|
|
807
|
+
let rank = 0;
|
|
649
808
|
|
|
650
809
|
for (const integration of this.#loadedIntegrations) {
|
|
810
|
+
rank += 1;
|
|
651
811
|
await this.#collectIssues(integration);
|
|
652
812
|
const pkg = this.#pkgLabel(integration);
|
|
653
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
654
813
|
if (!integration?.docs) continue;
|
|
655
814
|
try {
|
|
656
|
-
const {records, errors} =
|
|
815
|
+
const {records, errors, namespaces, guides} =
|
|
816
|
+
await discoverIntegrationDocs(integration);
|
|
657
817
|
for (const e of errors) {
|
|
658
818
|
this.#pushIssue(pkg, {
|
|
659
819
|
code: 'invalid_doc',
|
|
@@ -665,11 +825,20 @@ export class Project {
|
|
|
665
825
|
// how a bad template withdraws its package's templates: a partial
|
|
666
826
|
// docs contribution is the state where a `replaces` silently does
|
|
667
827
|
// nothing and a reader gets the topic it was meant to replace.
|
|
668
|
-
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
|
+
}
|
|
669
834
|
for (const record of records) {
|
|
670
835
|
const issue = catalog.add(record);
|
|
671
836
|
if (issue) this.#pushIssue(pkg, issue);
|
|
672
837
|
}
|
|
838
|
+
catalog.addTreeInputs({
|
|
839
|
+
namespaces: namespaces.map(input => ({...input, rank})),
|
|
840
|
+
guides: guides.map(input => ({...input, rank})),
|
|
841
|
+
});
|
|
673
842
|
} catch (err) {
|
|
674
843
|
this.#pushIssue(pkg, {
|
|
675
844
|
code: 'invalid_doc',
|
|
@@ -686,8 +855,8 @@ export class Project {
|
|
|
686
855
|
/**
|
|
687
856
|
* Core registry transforms + integration codemods for an upgrade range.
|
|
688
857
|
* Wraps getTransformsBetween (core) and discoverIntegrationCodemods /
|
|
689
|
-
* selectIntegrationCodemods (integrations).
|
|
690
|
-
*
|
|
858
|
+
* selectIntegrationCodemods (integrations). An invalid codemod contribution
|
|
859
|
+
* is reported and omitted without hiding other valid contribution kinds.
|
|
691
860
|
* Memoized per (from, to) key.
|
|
692
861
|
*
|
|
693
862
|
* @param {string} fromVersion exclusive lower bound
|
|
@@ -705,7 +874,6 @@ export class Project {
|
|
|
705
874
|
for (const integration of this.#loadedIntegrations) {
|
|
706
875
|
await this.#collectIssues(integration);
|
|
707
876
|
const pkg = this.#pkgLabel(integration);
|
|
708
|
-
if (this.#hasBlockingContributionIssue(pkg)) continue;
|
|
709
877
|
if (!integration?.codemods) continue;
|
|
710
878
|
try {
|
|
711
879
|
// Validate this integration's codemods discover cleanly in
|
|
@@ -760,6 +928,10 @@ export class Project {
|
|
|
760
928
|
* @returns {Promise<ProjectIntegrationIssue[]>}
|
|
761
929
|
*/
|
|
762
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();
|
|
763
935
|
for (const integration of this.#loadedIntegrations) {
|
|
764
936
|
await this.#collectIssues(integration);
|
|
765
937
|
}
|