





















1+#!/usr/bin/env -S node --import tsx
2+3+import { execFileSync } from "node:child_process";
4+import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
5+import { tmpdir } from "node:os";
6+import { join, resolve } from "node:path";
7+import { pathToFileURL } from "node:url";
8+import { collectClawHubPublishablePluginPackages } from "./lib/plugin-clawhub-release.ts";
9+import { collectPublishablePluginPackages } from "./lib/plugin-npm-release.ts";
10+11+const DEFAULT_CLAWHUB_CLI_PACKAGE = "clawhub@0.21.0";
12+13+type PluginReleasePretagPackTarget = {
14+packageDir: string;
15+ packageName: string;
16+ packClawHub: boolean;
17+ packNpm: boolean;
18+};
19+20+export function collectPluginReleasePretagPackTargets(
21+rootDir = resolve("."),
22+): PluginReleasePretagPackTarget[] {
23+const targets = new Map<string, PluginReleasePretagPackTarget>();
24+25+for (const plugin of collectPublishablePluginPackages(rootDir)) {
26+targets.set(plugin.packageDir, {
27+packageDir: plugin.packageDir,
28+packageName: plugin.packageName,
29+packClawHub: false,
30+packNpm: true,
31+});
32+}
33+for (const plugin of collectClawHubPublishablePluginPackages(rootDir)) {
34+const existing = targets.get(plugin.packageDir);
35+targets.set(plugin.packageDir, {
36+packageDir: plugin.packageDir,
37+packageName: plugin.packageName,
38+packClawHub: true,
39+packNpm: existing?.packNpm ?? false,
40+});
41+}
42+43+return [...targets.values()].toSorted((left, right) =>
44+left.packageName.localeCompare(right.packageName),
45+);
46+}
47+48+function runCommand(
49+command: string,
50+args: string[],
51+params: { cwd: string; env?: NodeJS.ProcessEnv; quietStdout?: boolean },
52+) {
53+execFileSync(command, args, {
54+cwd: params.cwd,
55+env: params.env ?? process.env,
56+stdio: params.quietStdout ? ["inherit", "ignore", "inherit"] : "inherit",
57+});
58+}
59+60+export function runPluginReleasePretagPackCheck(rootDir = resolve(".")) {
61+const targets = collectPluginReleasePretagPackTargets(rootDir);
62+const tempRoot = mkdtempSync(join(tmpdir(), "openclaw-plugin-pretag-pack-"));
63+const wrapperDir = join(tempRoot, "bin");
64+mkdirSync(wrapperDir);
65+const clawHubWrapper = join(wrapperDir, "clawhub");
66+writeFileSync(
67+clawHubWrapper,
68+[
69+"#!/usr/bin/env bash",
70+"set -euo pipefail",
71+'exec npm exec --yes --package "${CLAWHUB_CLI_PACKAGE}" -- clawhub "$@"',
72+"",
73+].join("\n"),
74+);
75+chmodSync(clawHubWrapper, 0o755);
76+77+try {
78+runCommand(
79+process.execPath,
80+[
81+"scripts/check-plugin-npm-runtime-builds.mjs",
82+ ...targets.flatMap((target) => ["--package", target.packageDir]),
83+],
84+{
85+cwd: rootDir,
86+},
87+);
88+89+const packEnv = {
90+ ...process.env,
91+CLAWHUB_CLI_PACKAGE: process.env.CLAWHUB_CLI_PACKAGE?.trim() || DEFAULT_CLAWHUB_CLI_PACKAGE,
92+OPENCLAW_PLUGIN_NPM_RUNTIME_BUILD: "0",
93+PATH: `${wrapperDir}:${process.env.PATH ?? ""}`,
94+};
95+for (const [index, target] of targets.entries()) {
96+if (target.packNpm) {
97+console.log(`npm pack: ${target.packageName}`);
98+runCommand("bash", ["scripts/plugin-npm-publish.sh", "--pack-dry-run", target.packageDir], {
99+cwd: rootDir,
100+env: packEnv,
101+quietStdout: true,
102+});
103+}
104+if (target.packClawHub) {
105+const outputDir = join(tempRoot, `clawhub-${index}`);
106+console.log(`ClawHub pack: ${target.packageName}`);
107+runCommand("bash", ["scripts/plugin-clawhub-publish.sh", "--pack", target.packageDir], {
108+cwd: rootDir,
109+env: {
110+ ...packEnv,
111+OPENCLAW_CLAWHUB_PACK_OUTPUT_DIR: outputDir,
112+},
113+quietStdout: true,
114+});
115+}
116+}
117+} finally {
118+rmSync(tempRoot, { recursive: true, force: true });
119+}
120+121+console.log(`plugin-release-pretag-pack-check: packed ${targets.length} publishable plugins.`);
122+}
123+124+if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) {
125+runPluginReleasePretagPackCheck();
126+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。