




















@@ -1,6 +1,7 @@
11import fs from "node:fs";
22import path from "node:path";
33import { MANIFEST_KEY } from "../../compat/legacy-names.js";
4+import { isPrereleaseSemverVersion, parseRegistryNpmSpec } from "../../infra/npm-registry-spec.js";
45import { resolveOpenClawPackageRootSync } from "../../infra/openclaw-root.js";
56import { listChannelCatalogEntries } from "../../plugins/channel-catalog-registry.js";
67import {
@@ -240,12 +241,26 @@ function toChannelMeta(params: {
240241function resolveInstallInfo(params: {
241242install?: PluginPackageInstall;
242243packageName?: string;
244+packageVersion?: string;
243245packageDir?: string;
244246workspaceDir?: string;
245247}): ChannelPluginCatalogEntry["install"] | null {
246248const clawhubSpec = normalizeOptionalString(params.install?.clawhubSpec);
247-const npmSpec =
249+let npmSpec =
248250normalizeOptionalString(params.install?.npmSpec) ?? normalizeOptionalString(params.packageName);
251+const packageVersion = normalizeOptionalString(params.packageVersion);
252+const parsedNpmSpec = npmSpec ? parseRegistryNpmSpec(npmSpec) : null;
253+const expectedPackageName = normalizeOptionalString(params.packageName);
254+const parsedPackageName = expectedPackageName ? parseRegistryNpmSpec(expectedPackageName) : null;
255+if (
256+npmSpec &&
257+packageVersion &&
258+isPrereleaseSemverVersion(packageVersion) &&
259+parsedNpmSpec?.selectorKind === "none" &&
260+(!parsedPackageName || parsedNpmSpec.name === parsedPackageName.name)
261+) {
262+npmSpec = `${parsedNpmSpec.name}@${packageVersion}`;
263+}
249264if (!clawhubSpec && !npmSpec) {
250265return null;
251266}
@@ -296,6 +311,7 @@ function resolveInstallInfo(params: {
296311function buildCatalogEntryFromManifest(params: {
297312pluginId?: string;
298313packageName?: string;
314+packageVersion?: string;
299315packageDir?: string;
300316origin?: PluginOrigin;
301317trustedSourceLinkedOfficialInstall?: boolean;
@@ -317,6 +333,7 @@ function buildCatalogEntryFromManifest(params: {
317333const install = resolveInstallInfo({
318334install: params.install,
319335packageName: params.packageName,
336+packageVersion: params.packageVersion,
320337packageDir: params.packageDir,
321338workspaceDir: params.workspaceDir,
322339});
@@ -349,6 +366,7 @@ function buildExternalCatalogEntry(
349366return buildCatalogEntryFromManifest({
350367pluginId: manifest?.plugin?.id,
351368packageName: entry.name,
369+packageVersion: entry.version,
352370trustedSourceLinkedOfficialInstall: options?.trustedSourceLinkedOfficialInstall,
353371channel: manifest?.channel,
354372install: manifest?.install,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。