






















@@ -43,6 +43,21 @@ function collectExternalDependencyNames(packageJson) {
4343);
4444}
454546+function getStringRecord(value) {
47+if (!value || typeof value !== "object" || Array.isArray(value)) {
48+return {};
49+}
50+return Object.fromEntries(
51+Object.entries(value).filter(
52+([, entryValue]) => typeof entryValue === "string" && entryValue.trim().length > 0,
53+),
54+);
55+}
56+57+function getRecord(value) {
58+return value && typeof value === "object" && !Array.isArray(value) ? value : {};
59+}
60+4661function createNeverBundleDependencyMatcher(packageJson) {
4762const externalDependencies = collectExternalDependencyNames(packageJson);
4863return (id) => {
@@ -116,6 +131,51 @@ export function resolvePluginNpmRuntimePackageFiles(plan) {
116131return [...merged];
117132}
118133134+function normalizeOpenClawPeerRange(value) {
135+const normalized = normalizePackageEntry(value);
136+if (!normalized) {
137+return "";
138+}
139+return /^[<>=~^*]|^(?:workspace|npm|file|link|portal|catalog):/u.test(normalized)
140+ ? normalized
141+ : `>=${normalized}`;
142+}
143+144+function resolveOpenClawPeerRange(packageJson, rootPackageJson) {
145+return (
146+normalizeOpenClawPeerRange(packageJson.openclaw?.compat?.pluginApi) ||
147+normalizeOpenClawPeerRange(packageJson.peerDependencies?.openclaw) ||
148+normalizeOpenClawPeerRange(packageJson.openclaw?.build?.openclawVersion) ||
149+normalizeOpenClawPeerRange(rootPackageJson?.version) ||
150+normalizeOpenClawPeerRange(packageJson.version)
151+);
152+}
153+154+export function resolvePluginNpmRuntimePackagePeerMetadata(plan) {
155+const openclawPeerRange = resolveOpenClawPeerRange(plan.packageJson, plan.rootPackageJson);
156+if (!openclawPeerRange) {
157+throw new Error(
158+`cannot infer openclaw peerDependency range for ${plan.pluginDir}; set openclaw.compat.pluginApi or package version`,
159+);
160+}
161+const existingPeerDependencies = getStringRecord(plan.packageJson.peerDependencies);
162+const existingPeerDependenciesMeta = getRecord(plan.packageJson.peerDependenciesMeta);
163+const existingOpenClawMeta = getRecord(existingPeerDependenciesMeta.openclaw);
164+return {
165+peerDependencies: {
166+ ...existingPeerDependencies,
167+openclaw: openclawPeerRange,
168+},
169+peerDependenciesMeta: {
170+ ...existingPeerDependenciesMeta,
171+openclaw: {
172+ ...existingOpenClawMeta,
173+optional: true,
174+},
175+},
176+};
177+}
178+119179export function resolvePluginNpmRuntimeBuildPlan(params) {
120180const repoRoot = path.resolve(params.repoRoot ?? ".");
121181const packageDir = resolvePackageDir(repoRoot, params.packageDir);
@@ -124,6 +184,10 @@ export function resolvePluginNpmRuntimeBuildPlan(params) {
124184return null;
125185}
126186const packageJson = readJsonFile(packageJsonPath);
187+const rootPackageJsonPath = path.join(repoRoot, "package.json");
188+const rootPackageJson = fs.existsSync(rootPackageJsonPath)
189+ ? readJsonFile(rootPackageJsonPath)
190+ : undefined;
127191if (!isPublishablePluginPackage(packageJson)) {
128192return null;
129193}
@@ -153,6 +217,7 @@ export function resolvePluginNpmRuntimeBuildPlan(params) {
153217 packageDir,
154218 pluginDir,
155219 packageJson,
220+ rootPackageJson,
156221 sourceEntries,
157222 entry,
158223outDir: path.join(packageDir, "dist"),
@@ -171,6 +236,7 @@ export function resolvePluginNpmRuntimeBuildPlan(params) {
171236 ...plan,
172237runtimeBuildOutputs: listPluginNpmRuntimeBuildOutputs(plan),
173238packageFiles: resolvePluginNpmRuntimePackageFiles(plan),
239+packagePeerMetadata: resolvePluginNpmRuntimePackagePeerMetadata(plan),
174240};
175241}
176242此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。