From b2974da33a7e4a8f067db22d6c01021e99a9cf41 Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Wed, 15 Apr 2026 17:02:33 -0400 Subject: [PATCH] Plugins: prefer scanDir override paths --- src/plugins/bundled-plugin-metadata.test.ts | 27 +++++++++++++++++++++ src/plugins/bundled-plugin-metadata.ts | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/plugins/bundled-plugin-metadata.test.ts b/src/plugins/bundled-plugin-metadata.test.ts index ee9d4e8fa31..4c4e725fbcd 100644 --- a/src/plugins/bundled-plugin-metadata.test.ts +++ b/src/plugins/bundled-plugin-metadata.test.ts @@ -313,6 +313,33 @@ describe("bundled plugin metadata", () => { ).toBe(path.join(pluginRoot, "index.ts")); }); + it("prefers direct scan-dir overrides over nested dist artifacts within the same override root", () => { + const pluginsDir = createGeneratedPluginTempRoot("openclaw-bundled-plugin-direct-priority-"); + const pluginRoot = path.join(pluginsDir, "alpha"); + const nestedDistPluginRoot = path.join(pluginsDir, "dist", "extensions", "alpha"); + + fs.mkdirSync(pluginRoot, { recursive: true }); + fs.mkdirSync(nestedDistPluginRoot, { recursive: true }); + fs.writeFileSync(path.join(pluginRoot, "index.js"), "export const source = true;\n", "utf8"); + fs.writeFileSync( + path.join(nestedDistPluginRoot, "index.js"), + "export const built = true;\n", + "utf8", + ); + + expect( + resolveBundledPluginGeneratedPath( + pluginsDir, + { + source: "./index.ts", + built: "index.js", + }, + "alpha", + pluginsDir, + ), + ).toBe(path.join(pluginRoot, "index.js")); + }); + it("resolves bundled repo entry paths from dist before workspace source", () => { const tempRoot = createGeneratedPluginTempRoot("openclaw-bundled-plugin-repo-entry-"); const pluginRoot = path.join(tempRoot, "extensions", "alpha"); diff --git a/src/plugins/bundled-plugin-metadata.ts b/src/plugins/bundled-plugin-metadata.ts index be3b06c567c..27b83ad4ab1 100644 --- a/src/plugins/bundled-plugin-metadata.ts +++ b/src/plugins/bundled-plugin-metadata.ts @@ -248,9 +248,9 @@ function listBundledPluginEntryBaseDirs(params: { scanDir?: string; }): string[] { const baseDirs = [ + ...(params.scanDir ? [path.resolve(params.scanDir, params.pluginDirName ?? "")] : []), path.resolve(params.rootDir, "dist", "extensions", params.pluginDirName ?? ""), path.resolve(params.rootDir, "extensions", params.pluginDirName ?? ""), - ...(params.scanDir ? [path.resolve(params.scanDir, params.pluginDirName ?? "")] : []), ]; return baseDirs.filter((entry, index, all) => all.indexOf(entry) === index); }