























@@ -196,6 +196,46 @@ describe("resolve-openclaw-package-candidate", () => {
196196}
197197});
198198199+it("rejects duplicate package candidate CLI options", () => {
200+const requiredArgs = ["--source", "npm", "--output-dir", ".artifacts/docker-e2e-package"];
201+const duplicateCases = [
202+["--artifact-dir", [...requiredArgs, "--artifact-dir", "one", "--artifact-dir", "two"]],
203+[
204+"--github-output",
205+[...requiredArgs, "--github-output", "one.out", "--github-output", "two.out"],
206+],
207+["--metadata", [...requiredArgs, "--metadata", "one.json", "--metadata", "two.json"]],
208+["--output-dir", ["--source", "npm", "--output-dir", "one", "--output-dir", "two"]],
209+["--output-name", [...requiredArgs, "--output-name", "one.tgz", "--output-name", "two.tgz"]],
210+["--package-ref", [...requiredArgs, "--package-ref", "one", "--package-ref", "two"]],
211+[
212+"--package-spec",
213+[...requiredArgs, "--package-spec", "openclaw@beta", "--package-spec", "openclaw@latest"],
214+],
215+[
216+"--package-url",
217+[...requiredArgs, "--package-url", "", "--package-url", "https://example.com/openclaw.tgz"],
218+],
219+["--package-sha256", [...requiredArgs, "--package-sha256", "", "--package-sha256", "abc123"]],
220+[
221+"--source",
222+["--source", "npm", "--source", "artifact", "--output-dir", ".artifacts/docker-e2e-package"],
223+],
224+[
225+"--trusted-source-id",
226+[...requiredArgs, "--trusted-source-id", "one", "--trusted-source-id", "two"],
227+],
228+[
229+"--trusted-source-policy",
230+[...requiredArgs, "--trusted-source-policy", "one.json", "--trusted-source-policy", "two.json"],
231+],
232+] satisfies Array<[string, string[]]>;
233+234+for (const [flag, args] of duplicateCases) {
235+expect(() => parseArgs(args), flag).toThrow(`${flag} was provided more than once`);
236+}
237+});
238+199239it("rejects package candidate output names that escape the output directory", () => {
200240for (const outputName of [
201241"../openclaw-current.tgz",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。