From 342bde2af6e5502ad6d71a2da94e31f5db8d6681 Mon Sep 17 00:00:00 2001 From: Fermin Quant Date: Mon, 25 May 2026 14:02:48 -0400 Subject: [PATCH] fix(update): avoid duplicate plugin smoke failures --- .../plugin-payload-validation.test.ts | 45 +++++++++++++++++++ .../update-cli/plugin-payload-validation.ts | 1 + 2 files changed, 46 insertions(+) diff --git a/src/cli/update-cli/plugin-payload-validation.test.ts b/src/cli/update-cli/plugin-payload-validation.test.ts index b8d901785ce..07bac283c14 100644 --- a/src/cli/update-cli/plugin-payload-validation.test.ts +++ b/src/cli/update-cli/plugin-payload-validation.test.ts @@ -155,6 +155,7 @@ describe("runPluginPayloadSmokeCheck", () => { await writePackage(dir, { name: "@openclaw/brave-plugin", openclaw: { extensions: ["./index.js", " "] }, + main: "main.js", }); await fs.writeFile(path.join(dir, "index.js"), "export default {};\n", "utf8"); const result = await runPluginPayloadSmokeCheck({ @@ -172,6 +173,50 @@ describe("runPluginPayloadSmokeCheck", () => { ]); }); + it("reports only extension-entry failure for an empty extensions list even if main is missing", async () => { + const dir = path.join(tmpRoot, "brave-empty"); + await writePackage(dir, { + name: "@openclaw/brave-plugin", + openclaw: { extensions: [] }, + main: "dist/index.js", + }); + const result = await runPluginPayloadSmokeCheck({ + records: { brave: { source: "npm", installPath: dir } }, + env: {}, + }); + expect(result.failures).toStrictEqual([ + { + pluginId: "brave", + installPath: dir, + reason: "missing-extension-entry", + detail: + "Plugin extension entry validation failed: package.json openclaw.extensions is empty", + }, + ]); + }); + + it("reports missing main entry when extension entries are valid", async () => { + const dir = path.join(tmpRoot, "brave"); + await writePackage(dir, { + name: "@openclaw/brave-plugin", + openclaw: { extensions: ["./index.js"] }, + main: "dist/index.js", + }); + await fs.writeFile(path.join(dir, "index.js"), "export default {};\n", "utf8"); + const result = await runPluginPayloadSmokeCheck({ + records: { brave: { source: "npm", installPath: dir } }, + env: {}, + }); + expect(result.failures).toStrictEqual([ + { + pluginId: "brave", + installPath: dir, + reason: "missing-main-entry", + detail: `Plugin main entry "dist/index.js" not found at ${path.join(dir, "dist/index.js")}`, + }, + ]); + }); + it("accepts a packaged TypeScript extension entry when compiled runtime output exists", async () => { const dir = path.join(tmpRoot, "codex"); await writePackage(dir, { diff --git a/src/cli/update-cli/plugin-payload-validation.ts b/src/cli/update-cli/plugin-payload-validation.ts index 6fb84721cb0..f5002f69369 100644 --- a/src/cli/update-cli/plugin-payload-validation.ts +++ b/src/cli/update-cli/plugin-payload-validation.ts @@ -129,6 +129,7 @@ export async function runPluginPayloadSmokeCheck(params: { : "package.json openclaw.extensions is empty" }`, }); + continue; } else if (extensionResolution.status === "ok") { const extensionValidation = await validatePackageExtensionEntriesForInstall({ packageDir: installPath,