diff --git a/src/plugins/plugin-version-drift.test.ts b/src/plugins/plugin-version-drift.test.ts index 52323c4442e0..2c2b66921d5d 100644 --- a/src/plugins/plugin-version-drift.test.ts +++ b/src/plugins/plugin-version-drift.test.ts @@ -373,4 +373,17 @@ describe("resolvePluginVersionDriftUpdateCommand", () => { }), ).toBe("openclaw plugins update brave"); }); + + it("keeps plugin-id updates when the gateway version is not a registry version", () => { + expect( + resolvePluginVersionDriftUpdateCommand({ + pluginId: "brave", + installedVersion: "2026.6.9", + gatewayVersion: "unknown", + source: "npm", + packageName: "@openclaw/brave-plugin", + spec: "@openclaw/brave-plugin@2026.6.9", + }), + ).toBe("openclaw plugins update brave"); + }); }); diff --git a/src/plugins/plugin-version-drift.ts b/src/plugins/plugin-version-drift.ts index 32c04da9f3a0..747c96fa0dd2 100644 --- a/src/plugins/plugin-version-drift.ts +++ b/src/plugins/plugin-version-drift.ts @@ -38,7 +38,10 @@ function resolveExactNpmPinPackageName(entry: PluginVersionDriftEntry): string | export function resolvePluginVersionDriftUpdateCommand(entry: PluginVersionDriftEntry): string { const exactNpmPackageName = resolveExactNpmPinPackageName(entry); if (exactNpmPackageName) { - return `openclaw plugins update ${exactNpmPackageName}@${entry.gatewayVersion}`; + const exactNpmTarget = `${exactNpmPackageName}@${entry.gatewayVersion}`; + if (parseRegistryNpmSpec(exactNpmTarget)?.selectorKind === "exact-version") { + return `openclaw plugins update ${exactNpmTarget}`; + } } return `openclaw plugins update ${entry.pluginId}`; }