diff --git a/src/infra/package-dist-inventory.ts b/src/infra/package-dist-inventory.ts index ce1c18b95e2..c09bdf780e4 100644 --- a/src/infra/package-dist-inventory.ts +++ b/src/infra/package-dist-inventory.ts @@ -34,6 +34,40 @@ const OMITTED_PRIVATE_QA_PLUGIN_SDK_FILES = new Set([ "dist/plugin-sdk/src/plugin-sdk/qa-runtime.d.ts", ]); const OMITTED_PRIVATE_QA_DIST_PREFIXES = ["dist/qa-runtime-"]; +const OMITTED_PLUGIN_SDK_TEST_FILES = new Set([ + "dist/plugin-sdk/agent-runtime-test-contracts.d.ts", + "dist/plugin-sdk/agent-runtime-test-contracts.js", + "dist/plugin-sdk/channel-contract-testing.d.ts", + "dist/plugin-sdk/channel-contract-testing.js", + "dist/plugin-sdk/channel-target-testing.d.ts", + "dist/plugin-sdk/channel-target-testing.js", + "dist/plugin-sdk/channel-test-helpers.d.ts", + "dist/plugin-sdk/channel-test-helpers.js", + "dist/plugin-sdk/plugin-test-api.d.ts", + "dist/plugin-sdk/plugin-test-api.js", + "dist/plugin-sdk/plugin-test-contracts.d.ts", + "dist/plugin-sdk/plugin-test-contracts.js", + "dist/plugin-sdk/plugin-test-runtime.d.ts", + "dist/plugin-sdk/plugin-test-runtime.js", + "dist/plugin-sdk/provider-http-test-mocks.d.ts", + "dist/plugin-sdk/provider-http-test-mocks.js", + "dist/plugin-sdk/provider-test-contracts.d.ts", + "dist/plugin-sdk/provider-test-contracts.js", + "dist/plugin-sdk/test-env.d.ts", + "dist/plugin-sdk/test-env.js", + "dist/plugin-sdk/test-fixtures.d.ts", + "dist/plugin-sdk/test-fixtures.js", + "dist/plugin-sdk/test-node-mocks.d.ts", + "dist/plugin-sdk/test-node-mocks.js", + "dist/plugin-sdk/testing.d.ts", + "dist/plugin-sdk/testing.js", +]); +const OMITTED_PLUGIN_SDK_TEST_PREFIXES = [ + "dist/plugin-sdk/src/agents/test-helpers/", + "dist/plugin-sdk/src/plugin-sdk/test-helpers/", + "dist/plugin-sdk/src/test-helpers/", + "dist/plugin-sdk/src/test-utils/", +]; const OMITTED_DIST_SUBTREE_PATTERNS = [ /^dist\/extensions\/node_modules(?:\/|$)/u, /^dist\/extensions\/[^/]+\/node_modules(?:\/|$)/u, @@ -145,6 +179,15 @@ function isExternalizedBundledExtensionDistPath( ); } +function isOmittedPluginSdkTestPath(relativePath: string): boolean { + return ( + OMITTED_PLUGIN_SDK_TEST_FILES.has(relativePath) || + OMITTED_PLUGIN_SDK_TEST_PREFIXES.some( + (prefix) => relativePath === prefix.slice(0, -1) || relativePath.startsWith(prefix), + ) + ); +} + async function collectExternalizedBundledExtensionIds( packageRoot: string, ): Promise { @@ -177,6 +220,9 @@ function isPackagedDistPath( if (relativePath === "dist/plugin-sdk/.tsbuildinfo") { return false; } + if (isOmittedPluginSdkTestPath(relativePath)) { + return false; + } if ( OMITTED_PRIVATE_QA_PLUGIN_SDK_PREFIXES.some((prefix) => relativePath.startsWith(prefix)) || OMITTED_PRIVATE_QA_PLUGIN_SDK_FILES.has(relativePath) || @@ -197,6 +243,7 @@ function isOmittedDistSubtree( return ( isExternalizedBundledExtensionDistPath(relativePath, externalizedExtensionIds) || isLegacyPluginDependencyDirPath(relativePath) || + isOmittedPluginSdkTestPath(relativePath) || OMITTED_DIST_SUBTREE_PATTERNS.some((pattern) => pattern.test(relativePath)) ); } diff --git a/test/scripts/postinstall-bundled-plugins.test.ts b/test/scripts/postinstall-bundled-plugins.test.ts index 59c58b9eac0..8eb7051b867 100644 --- a/test/scripts/postinstall-bundled-plugins.test.ts +++ b/test/scripts/postinstall-bundled-plugins.test.ts @@ -595,6 +595,34 @@ describe("bundled plugin postinstall", () => { await expectPathMissing(staleFile); }); + it("omits unpacked plugin-sdk test helpers from the package dist inventory", async () => { + const packageRoot = await createTempDirAsync("openclaw-packaged-inventory-"); + const runtimeFile = path.join(packageRoot, "dist", "plugin-sdk", "runtime.js"); + const testHelperFile = path.join(packageRoot, "dist", "plugin-sdk", "testing.js"); + const nestedTestHelperFile = path.join( + packageRoot, + "dist", + "plugin-sdk", + "src", + "plugin-sdk", + "test-helpers", + "provider-contract.d.ts", + ); + await fs.mkdir(path.dirname(nestedTestHelperFile), { recursive: true }); + await fs.mkdir(path.dirname(runtimeFile), { recursive: true }); + await fs.writeFile(runtimeFile, "export {};\n"); + await fs.writeFile(testHelperFile, "export {};\n"); + await fs.writeFile(nestedTestHelperFile, "export {};\n"); + + const inventory = await writePackageDistInventory(packageRoot); + + expect(inventory).toContain("dist/plugin-sdk/runtime.js"); + expect(inventory).not.toContain("dist/plugin-sdk/testing.js"); + expect(inventory).not.toContain( + "dist/plugin-sdk/src/plugin-sdk/test-helpers/provider-contract.d.ts", + ); + }); + it("prunes legacy plugin runtime deps state during packaged postinstall", async () => { const prefix = await createTempDirAsync("openclaw-packaged-prefix-"); const packageRoot = path.join(prefix, "lib", "node_modules", "openclaw");