






















@@ -73,6 +73,11 @@ export type PluginReleasePlan = {
7373skippedPublished: PluginReleasePlanItem[];
7474};
757576+export type ClawHubPublishablePluginPackageFilters = {
77+extensionIds?: readonly string[];
78+packageNames?: readonly string[];
79+};
80+7681const CLAWHUB_DEFAULT_REGISTRY = "https://clawhub.ai";
7782const SAFE_EXTENSION_ID_RE = /^[a-z0-9][a-z0-9._-]*$/;
7883const CLAWHUB_SHARED_RELEASE_INPUT_PATHS = [
@@ -101,12 +106,24 @@ function getRegistryBaseUrl(explicit?: string) {
101106102107export function collectClawHubPublishablePluginPackages(
103108rootDir = resolve("."),
109+filters: ClawHubPublishablePluginPackageFilters = {},
104110): PublishablePluginPackage[] {
105111const publishable: PublishablePluginPackage[] = [];
106112const validationErrors: string[] = [];
113+const selectedExtensionIds = new Set(filters.extensionIds ?? []);
114+const selectedPackageNames = new Set(filters.packageNames ?? []);
115+const hasSelectedExtensionIds = Array.isArray(filters.extensionIds);
116+const hasSelectedPackageNames = Array.isArray(filters.packageNames);
107117108118for (const candidate of collectExtensionPackageJsonCandidates(rootDir)) {
109119const { extensionId, packageDir, packageJson } = candidate;
120+if (hasSelectedExtensionIds && !selectedExtensionIds.has(extensionId)) {
121+continue;
122+}
123+const packageName = packageJson.name?.trim() ?? "";
124+if (hasSelectedPackageNames && !selectedPackageNames.has(packageName)) {
125+continue;
126+}
110127if (packageJson.openclaw?.release?.publishToClawHub !== true) {
111128continue;
112129}
@@ -147,7 +164,7 @@ export function collectClawHubPublishablePluginPackages(
147164publishable.push({
148165 extensionId,
149166 packageDir,
150-packageName: packageJson.name!.trim(),
167+ packageName,
151168 version,
152169channel: parsedVersion.channel,
153170publishTag: parsedVersion.channel === "beta" ? "beta" : "latest",
@@ -342,13 +359,29 @@ export async function collectPluginClawHubReleasePlan(params?: {
342359registryBaseUrl?: string;
343360fetchImpl?: typeof fetch;
344361}): Promise<PluginReleasePlan> {
345-const allPublishable = collectClawHubPublishablePluginPackages(params?.rootDir);
362+const rootDir = params?.rootDir;
363+const selection = params?.selection ?? [];
364+const changedPaths = params?.gitRange
365+ ? collectPluginClawHubRelevantPathsFromGitRange({
366+ rootDir,
367+gitRange: params.gitRange,
368+})
369+ : [];
370+const sharedInputChanged = hasSharedClawHubReleaseInputChanges(changedPaths);
371+const extensionIds =
372+params?.selectionMode === "all-publishable" || !params?.gitRange || sharedInputChanged
373+ ? undefined
374+ : collectChangedExtensionIdsFromPaths(changedPaths);
375+const allPublishable = collectClawHubPublishablePluginPackages(rootDir, {
376+ extensionIds,
377+packageNames: selection.length > 0 ? selection : undefined,
378+});
346379const selectedPublishable = resolveSelectedClawHubPublishablePluginPackages({
347380plugins: allPublishable,
348-selection: params?.selection,
381+ selection,
349382selectionMode: params?.selectionMode,
350383gitRange: params?.gitRange,
351-rootDir: params?.rootDir,
384+ rootDir,
352385});
353386354387const all = await Promise.all(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。