diff --git a/extensions/qa-matrix/src/runners/contract/scenario-runtime-e2ee.ts b/extensions/qa-matrix/src/runners/contract/scenario-runtime-e2ee.ts index 830774876d3..863bcf6125b 100644 --- a/extensions/qa-matrix/src/runners/contract/scenario-runtime-e2ee.ts +++ b/extensions/qa-matrix/src/runners/contract/scenario-runtime-e2ee.ts @@ -702,28 +702,19 @@ async function createMatrixQaCliGatewayRuntime(params: { context: MatrixQaScenarioContext; }) { const outputDir = requireMatrixQaE2eeOutputDir(params.context); - const rootDir = await mkdtemp( - path.join(resolvePreferredOpenClawTmpDir(), "openclaw-matrix-gateway-cli-qa-"), - ); const artifactDir = path.join( outputDir, params.artifactLabel, randomUUID().replaceAll("-", "").slice(0, 12), ); - const pluginStageDir = path.join(rootDir, "plugin-stage"); - await chmod(rootDir, 0o700).catch(() => undefined); - await assertMatrixQaPrivatePathMode(rootDir, "Matrix QA CLI temp directory"); await mkdir(artifactDir, { mode: 0o700, recursive: true }); await chmod(artifactDir, 0o700).catch(() => undefined); await assertMatrixQaPrivatePathMode(artifactDir, "Matrix QA CLI artifact directory"); - await mkdir(pluginStageDir, { mode: 0o700, recursive: true }); - await chmod(pluginStageDir, 0o700).catch(() => undefined); const env = { ...requireMatrixQaCliRuntimeEnv(params.context), FORCE_COLOR: "0", NO_COLOR: "1", OPENCLAW_DISABLE_AUTO_UPDATE: "1", - OPENCLAW_PLUGIN_STAGE_DIR: pluginStageDir, }; const run = async (args: string[], timeoutMs = params.context.timeoutMs) => await runMatrixQaOpenClawCli({ @@ -732,9 +723,7 @@ async function createMatrixQaCliGatewayRuntime(params: { timeoutMs, }); return { - dispose: async () => { - await rm(rootDir, { force: true, recursive: true }); - }, + dispose: async () => undefined, rootDir: artifactDir, run, }; diff --git a/src/infra/package-dist-inventory.test.ts b/src/infra/package-dist-inventory.test.ts index c316c2d320a..beaf9336532 100644 --- a/src/infra/package-dist-inventory.test.ts +++ b/src/infra/package-dist-inventory.test.ts @@ -86,64 +86,15 @@ describe("package dist inventory", () => { "cli.d.ts", ); const omittedQaRuntimeChunk = path.join(packageRoot, "dist", "qa-runtime-B9LDtssJ.js"); - const omittedRuntimeDepsStamp = path.join( - packageRoot, - "dist", - "extensions", - "discord", - ".openclaw-runtime-deps-stamp.json", - ); const [omittedBuildStamp, omittedRuntimePostBuildStamp] = LOCAL_BUILD_METADATA_DIST_PATHS.map( (relativePath) => path.join(packageRoot, relativePath), ); - const omittedRuntimeDepsTempFile = path.join( - packageRoot, - "dist", - "extensions", - "discord", - ".openclaw-runtime-deps-backup-node_modules-old", - "left-pad", - "index.js", - ); - const omittedRuntimeDepsTempSymlink = path.join( - packageRoot, - "dist", - "extensions", - "amazon-bedrock", - ".openclaw-runtime-deps-copy-KZmXaz", - "node_modules", - ".bin", - "fxparser", - ); - const omittedExtensionNodeModuleSymlink = path.join( - packageRoot, - "dist", - "extensions", - "discord", - "node_modules", - ".bin", - "color-support", - ); - const omittedExtensionRootAliasSymlink = path.join( - packageRoot, - "dist", - "extensions", - "node_modules", - "openclaw", - "plugin-sdk", - ); const omittedMap = path.join(packageRoot, "dist", "feature.runtime.js.map"); await fs.mkdir(path.dirname(packagedQaChannelRuntime), { recursive: true }); await fs.mkdir(path.dirname(packagedQaLabRuntime), { recursive: true }); await fs.mkdir(path.dirname(omittedQaMatrixChunk), { recursive: true }); await fs.mkdir(path.dirname(omittedQaLabTypes), { recursive: true }); - await fs.mkdir(path.dirname(omittedRuntimeDepsStamp), { recursive: true }); - await fs.mkdir(path.dirname(omittedRuntimeDepsTempFile), { recursive: true }); - await fs.mkdir(path.dirname(omittedRuntimeDepsTempSymlink), { recursive: true }); - await fs.mkdir(path.dirname(omittedExtensionNodeModuleSymlink), { recursive: true }); - await fs.mkdir(path.dirname(omittedExtensionRootAliasSymlink), { recursive: true }); await fs.mkdir(path.join(packageRoot, "dist", "plugin-sdk"), { recursive: true }); - await fs.writeFile(path.join(packageRoot, "color-support.js"), "export {};\n", "utf8"); await fs.writeFile(packagedQaChannelRuntime, "export {};\n", "utf8"); await fs.writeFile(packagedQaLabRuntime, "export {};\n", "utf8"); await fs.writeFile(omittedQaChunk, "export {};\n", "utf8"); @@ -154,26 +105,15 @@ describe("package dist inventory", () => { await fs.writeFile(omittedQaChannelProtocolPluginSdk, "export {};\n", "utf8"); await fs.writeFile(omittedQaLabTypes, "export {};\n", "utf8"); await fs.writeFile(omittedQaRuntimeChunk, "export {};\n", "utf8"); - await fs.writeFile(omittedRuntimeDepsStamp, "{}\n", "utf8"); await fs.writeFile(omittedBuildStamp, "{}\n", "utf8"); await fs.writeFile(omittedRuntimePostBuildStamp, "{}\n", "utf8"); - await fs.writeFile(omittedRuntimeDepsTempFile, "module.exports = 1;\n", "utf8"); - await fs.symlink(path.join(packageRoot, "color-support.js"), omittedRuntimeDepsTempSymlink); - await fs.symlink( - path.join(packageRoot, "color-support.js"), - omittedExtensionNodeModuleSymlink, - ); - await fs.symlink( - path.join(packageRoot, "dist", "plugin-sdk"), - omittedExtensionRootAliasSymlink, - ); await fs.writeFile(omittedMap, "{}", "utf8"); await expect(writePackageDistInventory(packageRoot)).resolves.toEqual([]); }); }); - it("ignores runtime-created install staging dirs during installed dist verification", async () => { + it("reports runtime-created install staging dirs during installed dist verification", async () => { await withTempDir({ prefix: "openclaw-dist-inventory-stage-" }, async (packageRoot) => { const realFile = path.join(packageRoot, "dist", "real-AbC123.js"); await fs.mkdir(path.dirname(realFile), { recursive: true }); @@ -207,7 +147,10 @@ describe("package dist inventory", () => { await fs.mkdir(path.dirname(suffixedStageFile), { recursive: true }); await fs.writeFile(suffixedStageFile, "{}", "utf8"); - await expect(collectPackageDistInventoryErrors(packageRoot)).resolves.toEqual([]); + await expect(collectPackageDistInventoryErrors(packageRoot)).resolves.toEqual([ + "unexpected packaged dist file dist/extensions/brave/.openclaw-install-stage/node_modules/typebox/build/compile/code.mjs", + "unexpected packaged dist file dist/extensions/browser/.openclaw-install-stage-AbC123/node_modules/playwright-core/package.json", + ]); }); }); diff --git a/src/infra/package-dist-inventory.ts b/src/infra/package-dist-inventory.ts index d86a4de3c74..3d9d541caa2 100644 --- a/src/infra/package-dist-inventory.ts +++ b/src/infra/package-dist-inventory.ts @@ -32,9 +32,6 @@ const OMITTED_PRIVATE_QA_PLUGIN_SDK_FILES = new Set([ ]); const OMITTED_PRIVATE_QA_DIST_PREFIXES = ["dist/qa-runtime-"]; const OMITTED_DIST_SUBTREE_PATTERNS = [ - /^dist\/extensions\/node_modules(?:\/|$)/u, - /^dist\/extensions\/[^/]+\/node_modules(?:\/|$)/u, - /^dist\/extensions\/[^/]+\/\.openclaw-runtime-deps-[^/]+(?:\/|$)/u, /^dist\/extensions\/qa-matrix(?:\/|$)/u, new RegExp(`^dist/plugin-sdk/extensions/${LEGACY_QA_CHANNEL_DIR}(?:/|$)`, "u"), new RegExp(`^dist/plugin-sdk/extensions/${LEGACY_QA_LAB_DIR}(?:/|$)`, "u"), @@ -70,9 +67,6 @@ function isPackagedDistPath(relativePath: string): boolean { if (isLocalBuildMetadataDistPath(relativePath)) { return false; } - if (relativePath.endsWith("/.openclaw-runtime-deps-stamp.json")) { - return false; - } if (relativePath.endsWith(".map")) { return false; } @@ -93,10 +87,7 @@ function isPackagedDistPath(relativePath: string): boolean { } function isOmittedDistSubtree(relativePath: string): boolean { - return ( - isLegacyPluginDependencyInstallStagePath(relativePath) || - OMITTED_DIST_SUBTREE_PATTERNS.some((pattern) => pattern.test(relativePath)) - ); + return OMITTED_DIST_SUBTREE_PATTERNS.some((pattern) => pattern.test(relativePath)); } async function collectRelativeFiles(rootDir: string, baseDir: string): Promise { diff --git a/src/infra/update-global.test.ts b/src/infra/update-global.test.ts index 8bddcff6bb4..73d44192b0f 100644 --- a/src/infra/update-global.test.ts +++ b/src/infra/update-global.test.ts @@ -457,7 +457,7 @@ describe("update global helpers", () => { }); }); - it("ignores bundled plugin install stages during installed dist verification", async () => { + it("reports bundled plugin install stages during installed dist verification", async () => { await withTempDir({ prefix: "openclaw-update-global-plugin-stage-" }, async (packageRoot) => { await writeGlobalPackageJson(packageRoot); await fs.mkdir(path.join(packageRoot, "dist", "extensions", "brave"), { recursive: true }); @@ -480,7 +480,10 @@ describe("update global helpers", () => { await fs.writeFile(stagedFile, "export {};\n", "utf8"); } - await expect(collectInstalledGlobalPackageErrors({ packageRoot })).resolves.toEqual([]); + await expect(collectInstalledGlobalPackageErrors({ packageRoot })).resolves.toEqual([ + "unexpected packaged dist file dist/extensions/brave/.openclaw-install-stage-retry/node_modules/typebox/build/compile/code.mjs", + "unexpected packaged dist file dist/extensions/brave/.openclaw-install-stage/node_modules/typebox/build/compile/code.mjs", + ]); }); });