





















@@ -3,6 +3,7 @@ import fs from "node:fs";
33import path from "node:path";
44import { pathToFileURL } from "node:url";
55import JSON5 from "json5";
6+import { resolvePluginNpmRuntimeBuildPlan } from "./plugin-npm-runtime-build.mjs";
6778const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA_PATH =
89"src/config/bundled-channel-config-metadata.generated.ts";
@@ -19,6 +20,103 @@ function resolvePackageDir(repoRoot, packageDir) {
1920return path.isAbsolute(packageDir) ? packageDir : path.resolve(repoRoot, packageDir);
2021}
212223+function resolvePackageJsonPath(packageDir) {
24+return path.join(packageDir, "package.json");
25+}
26+27+function packageRelativePathExists(packageDir, relativePath) {
28+return fs.existsSync(path.join(packageDir, relativePath));
29+}
30+31+function mergePackageFiles(packageDir, files) {
32+const merged = new Set(
33+Array.isArray(files) ? files.filter((entry) => typeof entry === "string") : [],
34+);
35+merged.add("dist/**");
36+if (packageRelativePathExists(packageDir, "openclaw.plugin.json")) {
37+merged.add("openclaw.plugin.json");
38+}
39+if (packageRelativePathExists(packageDir, "README.md")) {
40+merged.add("README.md");
41+}
42+if (packageRelativePathExists(packageDir, "SKILL.md")) {
43+merged.add("SKILL.md");
44+}
45+if (packageRelativePathExists(packageDir, "skills")) {
46+merged.add("skills/**");
47+}
48+return [...merged];
49+}
50+51+function listRuntimeBuildOutputs(plan) {
52+return Object.keys(plan.entry)
53+.map((entryKey) => `./dist/${entryKey}.js`)
54+.toSorted((left, right) => left.localeCompare(right));
55+}
56+57+function assertPluginNpmRuntimeBuildExists(plan) {
58+const missing = listRuntimeBuildOutputs(plan).filter(
59+(runtimePath) => !packageRelativePathExists(plan.packageDir, runtimePath.replace(/^\.\//u, "")),
60+);
61+if (missing.length > 0) {
62+throw new Error(
63+[
64+`package-local plugin runtime is missing for ${plan.pluginDir}: ${missing.join(", ")}`,
65+`Run node scripts/lib/plugin-npm-runtime-build.mjs ${path.relative(plan.repoRoot, plan.packageDir) || plan.packageDir} before publishing ${plan.packageJson.name ?? plan.pluginDir}.`,
66+].join("\n"),
67+);
68+}
69+}
70+71+export function resolveAugmentedPluginNpmPackageJson(params) {
72+const repoRoot = path.resolve(params.repoRoot ?? ".");
73+const packageDir = resolvePackageDir(repoRoot, params.packageDir);
74+const packageJsonPath = resolvePackageJsonPath(packageDir);
75+if (!fs.existsSync(packageJsonPath)) {
76+return {
77+ packageJsonPath,
78+ packageDir,
79+ repoRoot,
80+changed: false,
81+packageJson: undefined,
82+reason: "missing-package-json",
83+};
84+}
85+86+const plan = resolvePluginNpmRuntimeBuildPlan({ repoRoot, packageDir });
87+if (!plan) {
88+return {
89+ packageJsonPath,
90+ packageDir,
91+ repoRoot,
92+changed: false,
93+packageJson: undefined,
94+reason: "no-runtime-build",
95+};
96+}
97+assertPluginNpmRuntimeBuildExists(plan);
98+99+const packageJson = {
100+ ...plan.packageJson,
101+files: mergePackageFiles(packageDir, plan.packageJson.files),
102+openclaw: {
103+ ...plan.packageJson.openclaw,
104+runtimeExtensions: plan.runtimeExtensions,
105+ ...(plan.runtimeSetupEntry ? { runtimeSetupEntry: plan.runtimeSetupEntry } : {}),
106+},
107+};
108+const changed = JSON.stringify(packageJson) !== JSON.stringify(plan.packageJson);
109+return {
110+ packageJsonPath,
111+ packageDir,
112+ repoRoot,
113+ changed,
114+ packageJson,
115+pluginDir: plan.pluginDir,
116+reason: changed ? "package-local-runtime" : "unchanged",
117+};
118+}
119+22120function readGeneratedBundledChannelConfigs(repoRoot) {
23121const metadataPath = path.join(repoRoot, GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA_PATH);
24122if (!fs.existsSync(metadataPath)) {
@@ -133,34 +231,63 @@ export function resolveAugmentedPluginNpmManifest(params) {
133231export function withAugmentedPluginNpmManifestForPackage(params, callback) {
134232const repoRoot = path.resolve(params.repoRoot ?? ".");
135233const packageDir = resolvePackageDir(repoRoot, params.packageDir);
136-const resolved = resolveAugmentedPluginNpmManifest({
234+const resolvedManifest = resolveAugmentedPluginNpmManifest({
235+ repoRoot,
236+ packageDir,
237+});
238+const resolvedPackageJson = resolveAugmentedPluginNpmPackageJson({
137239 repoRoot,
138240 packageDir,
139241});
140242141-if (!resolved.changed || !resolved.manifest) {
243+if (
244+(!resolvedManifest.changed || !resolvedManifest.manifest) &&
245+(!resolvedPackageJson.changed || !resolvedPackageJson.packageJson)
246+) {
142247return callback({
143- ...resolved,
248+ ...resolvedManifest,
144249 packageDir,
145250 repoRoot,
146251applied: false,
252+packageJsonApplied: false,
147253});
148254}
149255150-const originalManifest = fs.readFileSync(resolved.manifestPath, "utf8");
151-console.error(
152-`[plugin-npm-publish] overlaying generated channel config metadata for ${resolved.pluginId}`,
153-);
154-writeJsonFile(resolved.manifestPath, resolved.manifest);
256+const originalManifest =
257+resolvedManifest.changed && resolvedManifest.manifest
258+ ? fs.readFileSync(resolvedManifest.manifestPath, "utf8")
259+ : undefined;
260+const originalPackageJson =
261+resolvedPackageJson.changed && resolvedPackageJson.packageJson
262+ ? fs.readFileSync(resolvedPackageJson.packageJsonPath, "utf8")
263+ : undefined;
264+if (resolvedManifest.changed && resolvedManifest.manifest) {
265+console.error(
266+`[plugin-npm-publish] overlaying generated channel config metadata for ${resolvedManifest.pluginId}`,
267+);
268+writeJsonFile(resolvedManifest.manifestPath, resolvedManifest.manifest);
269+}
270+if (resolvedPackageJson.changed && resolvedPackageJson.packageJson) {
271+console.error(
272+`[plugin-npm-publish] overlaying package-local runtime metadata for ${resolvedPackageJson.pluginDir}`,
273+);
274+writeJsonFile(resolvedPackageJson.packageJsonPath, resolvedPackageJson.packageJson);
275+}
155276try {
156277return callback({
157- ...resolved,
278+ ...resolvedManifest,
158279 packageDir,
159280 repoRoot,
160-applied: true,
281+applied: resolvedManifest.changed && Boolean(resolvedManifest.manifest),
282+packageJsonApplied: resolvedPackageJson.changed && Boolean(resolvedPackageJson.packageJson),
161283});
162284} finally {
163-fs.writeFileSync(resolved.manifestPath, originalManifest, "utf8");
285+if (originalManifest !== undefined) {
286+fs.writeFileSync(resolvedManifest.manifestPath, originalManifest, "utf8");
287+}
288+if (originalPackageJson !== undefined) {
289+fs.writeFileSync(resolvedPackageJson.packageJsonPath, originalPackageJson, "utf8");
290+}
164291}
165292}
166293此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。