























@@ -46,11 +46,26 @@ type SetupAutoEnableProbeEntry = {
4646probe: PluginSetupAutoEnableProbe;
4747};
484849+export type PluginSetupRegistryDiagnosticCode =
50+| "setup-descriptor-provider-missing-runtime"
51+| "setup-descriptor-provider-runtime-undeclared"
52+| "setup-descriptor-cli-backend-missing-runtime"
53+| "setup-descriptor-cli-backend-runtime-undeclared";
54+55+export type PluginSetupRegistryDiagnostic = {
56+pluginId: string;
57+code: PluginSetupRegistryDiagnosticCode;
58+declaredId?: string;
59+runtimeId?: string;
60+message: string;
61+};
62+4963type PluginSetupRegistry = {
5064providers: SetupProviderEntry[];
5165cliBackends: SetupCliBackendEntry[];
5266configMigrations: SetupConfigMigrationEntry[];
5367autoEnableProbes: SetupAutoEnableProbeEntry[];
68+diagnostics: PluginSetupRegistryDiagnostic[];
5469};
55705671type SetupAutoEnableReason = {
@@ -372,6 +387,75 @@ function findUniqueSetupManifestOwner(params: {
372387return matches.length === 1 ? matches[0] : undefined;
373388}
374389390+function mapNormalizedIds(ids: readonly string[]): Map<string, string> {
391+const mapped = new Map<string, string>();
392+for (const id of ids) {
393+const normalized = normalizeProviderId(id);
394+if (!normalized || mapped.has(normalized)) {
395+continue;
396+}
397+mapped.set(normalized, id);
398+}
399+return mapped;
400+}
401+402+function pushSetupDescriptorDriftDiagnostics(params: {
403+record: PluginManifestRecord;
404+providers: readonly ProviderPlugin[];
405+cliBackends: readonly CliBackendPlugin[];
406+diagnostics: PluginSetupRegistryDiagnostic[];
407+}): void {
408+const declaredProviderIds = params.record.setup?.providers?.map((entry) => entry.id);
409+if (declaredProviderIds) {
410+for (const declaredId of declaredProviderIds) {
411+if (!params.providers.some((provider) => matchesProvider(provider, declaredId))) {
412+params.diagnostics.push({
413+pluginId: params.record.id,
414+code: "setup-descriptor-provider-missing-runtime",
415+ declaredId,
416+message: `setup.providers declares "${declaredId}" but setup runtime did not register a matching provider.`,
417+});
418+}
419+}
420+for (const provider of params.providers) {
421+if (!declaredProviderIds.some((declaredId) => matchesProvider(provider, declaredId))) {
422+params.diagnostics.push({
423+pluginId: params.record.id,
424+code: "setup-descriptor-provider-runtime-undeclared",
425+runtimeId: provider.id,
426+message: `setup runtime registered provider "${provider.id}" but setup.providers does not declare it.`,
427+});
428+}
429+}
430+}
431+432+const declaredCliBackendIds = params.record.setup?.cliBackends;
433+if (declaredCliBackendIds) {
434+const declaredCliBackends = mapNormalizedIds(declaredCliBackendIds);
435+const runtimeCliBackends = mapNormalizedIds(params.cliBackends.map((backend) => backend.id));
436+for (const [normalized, declaredId] of declaredCliBackends) {
437+if (!runtimeCliBackends.has(normalized)) {
438+params.diagnostics.push({
439+pluginId: params.record.id,
440+code: "setup-descriptor-cli-backend-missing-runtime",
441+ declaredId,
442+message: `setup.cliBackends declares "${declaredId}" but setup runtime did not register a matching CLI backend.`,
443+});
444+}
445+}
446+for (const [normalized, runtimeId] of runtimeCliBackends) {
447+if (!declaredCliBackends.has(normalized)) {
448+params.diagnostics.push({
449+pluginId: params.record.id,
450+code: "setup-descriptor-cli-backend-runtime-undeclared",
451+ runtimeId,
452+message: `setup runtime registered CLI backend "${runtimeId}" but setup.cliBackends does not declare it.`,
453+});
454+}
455+}
456+}
457+}
458+375459export function resolvePluginSetupRegistry(params?: {
376460workspaceDir?: string;
377461env?: NodeJS.ProcessEnv;
@@ -397,6 +481,7 @@ export function resolvePluginSetupRegistry(params?: {
397481cliBackends: [],
398482configMigrations: [],
399483autoEnableProbes: [],
484+diagnostics: [],
400485} satisfies PluginSetupRegistry;
401486setCachedSetupValue(setupRegistryCache, cacheKey, empty);
402487return empty;
@@ -406,6 +491,7 @@ export function resolvePluginSetupRegistry(params?: {
406491const cliBackends: SetupCliBackendEntry[] = [];
407492const configMigrations: SetupConfigMigrationEntry[] = [];
408493const autoEnableProbes: SetupAutoEnableProbeEntry[] = [];
494+const diagnostics: PluginSetupRegistryDiagnostic[] = [];
409495const providerKeys = new Set<string>();
410496const cliBackendKeys = new Set<string>();
411497@@ -423,6 +509,8 @@ export function resolvePluginSetupRegistry(params?: {
423509continue;
424510}
425511512+const recordProviders: ProviderPlugin[] = [];
513+const recordCliBackends: CliBackendPlugin[] = [];
426514const api = buildSetupPluginApi({
427515 record,
428516setupSource: setupRegistration.setupSource,
@@ -437,6 +525,7 @@ export function resolvePluginSetupRegistry(params?: {
437525pluginId: record.id,
438526 provider,
439527});
528+recordProviders.push(provider);
440529},
441530registerCliBackend(backend) {
442531const key = `${record.id}:${normalizeProviderId(backend.id)}`;
@@ -448,6 +537,7 @@ export function resolvePluginSetupRegistry(params?: {
448537pluginId: record.id,
449538 backend,
450539});
540+recordCliBackends.push(backend);
451541},
452542registerConfigMigration(migrate) {
453543configMigrations.push({
@@ -473,13 +563,20 @@ export function resolvePluginSetupRegistry(params?: {
473563} catch {
474564continue;
475565}
566+pushSetupDescriptorDriftDiagnostics({
567+ record,
568+providers: recordProviders,
569+cliBackends: recordCliBackends,
570+ diagnostics,
571+});
476572}
477573478574const registry = {
479575 providers,
480576 cliBackends,
481577 configMigrations,
482578 autoEnableProbes,
579+ diagnostics,
483580} satisfies PluginSetupRegistry;
484581setCachedSetupValue(setupRegistryCache, cacheKey, registry);
485582return registry;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。