
















@@ -10,6 +10,7 @@ import {
1010existsSync,
1111mkdirSync,
1212readFileSync,
13+readdirSync,
1314realpathSync,
1415rmSync,
1516writeFileSync,
@@ -20,7 +21,6 @@ import { createConnection as createNetConnection, createServer as createNetServe
2021import { tmpdir } from "node:os";
2122import { dirname, join, resolve, win32 as pathWin32 } from "node:path";
2223import { fileURLToPath, pathToFileURL } from "node:url";
23-import { assertNoLegacyPluginDependencyStagingDebris } from "../src/infra/package-dist-inventory.ts";
2424import { isLocalBuildMetadataDistPath } from "./lib/local-build-metadata-paths.mjs";
25252626const SCRIPT_PATH = fileURLToPath(import.meta.url);
@@ -107,6 +107,7 @@ function buildReleaseProviderConfigOverride(providerMeta) {
107107}
108108109109const PACKAGE_DIST_INVENTORY_RELATIVE_PATH = "dist/postinstall-inventory.json";
110+const INSTALL_STAGE_DEBRIS_DIR_PATTERN = /^\.openclaw-install-stage(?:-[^/]+)?$/iu;
110111const OMITTED_QA_EXTENSION_PREFIXES = [
111112"dist/extensions/qa-channel/",
112113"dist/extensions/qa-lab/",
@@ -626,6 +627,62 @@ function normalizeRelativePath(value) {
626627return value.replace(/\\/gu, "/");
627628}
628629630+function isNotFoundError(error) {
631+return error && typeof error === "object" && error.code === "ENOENT";
632+}
633+634+function isInstallStageDirName(value) {
635+return INSTALL_STAGE_DEBRIS_DIR_PATTERN.test(value);
636+}
637+638+function collectLegacyPluginDependencyStagingDebrisPaths(packageRoot) {
639+const extensionsDir = join(packageRoot, "dist", "extensions");
640+let extensionEntries = [];
641+try {
642+extensionEntries = readdirSync(extensionsDir, { withFileTypes: true });
643+} catch (error) {
644+if (isNotFoundError(error)) {
645+return [];
646+}
647+throw error;
648+}
649+650+const debris = [];
651+for (const extensionEntry of extensionEntries) {
652+if (!extensionEntry.isDirectory()) {
653+continue;
654+}
655+const extensionPath = join(extensionsDir, extensionEntry.name);
656+let stagingEntries = [];
657+try {
658+stagingEntries = readdirSync(extensionPath, { withFileTypes: true });
659+} catch (error) {
660+if (isNotFoundError(error)) {
661+continue;
662+}
663+throw error;
664+}
665+for (const stagingEntry of stagingEntries) {
666+if (isInstallStageDirName(stagingEntry.name)) {
667+debris.push(
668+normalizeRelativePath(join("dist", "extensions", extensionEntry.name, stagingEntry.name)),
669+);
670+}
671+}
672+}
673+return debris.toSorted((left, right) => left.localeCompare(right));
674+}
675+676+function assertNoLegacyPluginDependencyStagingDebris(packageRoot) {
677+const debris = collectLegacyPluginDependencyStagingDebrisPaths(packageRoot);
678+if (debris.length === 0) {
679+return;
680+}
681+throw new Error(
682+`unexpected legacy plugin dependency staging debris in package dist: ${debris.join(", ")}`,
683+);
684+}
685+629686function isPackagedDistPath(relativePath) {
630687if (!relativePath.startsWith("dist/")) {
631688return false;
@@ -649,7 +706,7 @@ function isPackagedDistPath(relativePath) {
649706}
650707651708export async function writePackageDistInventoryForCandidate(params) {
652-await assertNoLegacyPluginDependencyStagingDebris(params.sourceDir);
709+assertNoLegacyPluginDependencyStagingDebris(params.sourceDir);
653710const dryRun = await runCommand(
654711npmCommand(),
655712["pack", "--dry-run", "--ignore-scripts", "--json"],
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。