



























@@ -25,6 +25,7 @@ import {
2525type PluginManifest,
2626resolvePackageExtensionEntries,
2727type OpenClawPackageManifest,
28+type PackageExtensionResolution,
2829type PackageManifest,
2930} from "./manifest.js";
3031import {
@@ -562,6 +563,30 @@ function derivePackagePluginIdHint(params: {
562563 : unscoped;
563564}
564565566+function pushInvalidPackageExtensionDiagnostic(params: {
567+resolution: PackageExtensionResolution;
568+source: string;
569+diagnostics: PluginDiagnostic[];
570+}): boolean {
571+if (params.resolution.status === "invalid") {
572+params.diagnostics.push({
573+level: "error",
574+source: params.source,
575+message: params.resolution.error,
576+});
577+return true;
578+}
579+if (params.resolution.status === "empty") {
580+params.diagnostics.push({
581+level: "error",
582+source: params.source,
583+message: "package.json openclaw.extensions is empty",
584+});
585+return true;
586+}
587+return false;
588+}
589+565590function resolveIdHintManifestId(
566591rootDir: string,
567592rejectHardlinks: boolean,
@@ -807,6 +832,15 @@ function discoverInDirectory(params: {
807832 ...(fullPathRealPath !== undefined ? { rootRealPath: fullPathRealPath } : {}),
808833});
809834const extensionResolution = resolvePackageExtensionEntries(manifest ?? undefined);
835+if (
836+pushInvalidPackageExtensionDiagnostic({
837+resolution: extensionResolution,
838+source: fullPath,
839+diagnostics: params.diagnostics,
840+})
841+) {
842+continue;
843+}
810844const extensions = extensionResolution.status === "ok" ? extensionResolution.entries : [];
811845const manifestId = resolveIdHintManifestId(fullPath, rejectHardlinks, fullPathRealPath);
812846const setupSource = resolvePackageSetupSource({
@@ -1041,6 +1075,15 @@ function discoverFromPath(params: {
10411075 ...(resolvedRealPath !== undefined ? { rootRealPath: resolvedRealPath } : {}),
10421076});
10431077const extensionResolution = resolvePackageExtensionEntries(manifest ?? undefined);
1078+if (
1079+pushInvalidPackageExtensionDiagnostic({
1080+resolution: extensionResolution,
1081+source: resolved,
1082+diagnostics: params.diagnostics,
1083+})
1084+) {
1085+return;
1086+}
10441087const extensions = extensionResolution.status === "ok" ? extensionResolution.entries : [];
10451088const manifestId = resolveIdHintManifestId(resolved, rejectHardlinks, resolvedRealPath);
10461089const setupSource = resolvePackageSetupSource({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。