From 7177492487ced8eff1d36bee1a29e66d318dd6d3 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 25 Apr 2026 04:38:03 -0700 Subject: [PATCH] fix(plugins): keep enabled-only registry migration fresh --- src/plugins/installed-plugin-index.test.ts | 37 ++++++++++++++++++++++ src/plugins/installed-plugin-index.ts | 4 +++ 2 files changed, 41 insertions(+) diff --git a/src/plugins/installed-plugin-index.test.ts b/src/plugins/installed-plugin-index.test.ts index 8490e9bdb59..0547d893711 100644 --- a/src/plugins/installed-plugin-index.test.ts +++ b/src/plugins/installed-plugin-index.test.ts @@ -551,6 +551,43 @@ describe("installed plugin index", () => { ]); }); + it("does not mark enabled-only migration snapshots stale for omitted disabled plugins", () => { + const enabledFixture = createRichPluginFixture(); + const disabledFixture = createRichPluginFixture(); + writePluginManifest(disabledFixture.rootDir, { + id: "disabled-demo", + name: "Disabled Demo", + configSchema: { type: "object" }, + providers: ["disabled-demo"], + }); + const current = loadInstalledPluginIndex({ + candidates: [ + enabledFixture.candidate, + { + ...disabledFixture.candidate, + idHint: "disabled-demo", + }, + ], + config: { + plugins: { + entries: { + "disabled-demo": { + enabled: false, + }, + }, + }, + }, + env: hermeticEnv(), + }); + const migratedEnabledOnly = { + ...current, + refreshReason: "migration" as const, + plugins: current.plugins.filter((plugin) => plugin.enabled), + }; + + expect(diffInstalledPluginIndexInvalidationReasons(migratedEnabledOnly, current)).toEqual([]); + }); + it("marks disabled plugins without dropping their cold contributions", () => { const fixture = createRichPluginFixture(); diff --git a/src/plugins/installed-plugin-index.ts b/src/plugins/installed-plugin-index.ts index f3b35c8725c..5c605c96762 100644 --- a/src/plugins/installed-plugin-index.ts +++ b/src/plugins/installed-plugin-index.ts @@ -731,6 +731,10 @@ export function diffInstalledPluginIndexInvalidationReasons( } for (const pluginId of currentByPluginId.keys()) { if (!previousByPluginId.has(pluginId)) { + const currentPlugin = currentByPluginId.get(pluginId); + if (currentPlugin?.enabled === false) { + continue; + } reasons.add("source-changed"); } }