

















@@ -38,7 +38,7 @@ function writeFakeCrabbox(binDir: string, helpText: string): string {
3838const script = [
3939"#!/bin/sh",
4040'if [ "$1" = "--version" ]; then',
41-' printf "%s\\n" "crabbox 0.15.0"',
41+' printf "%s\\n" "${OPENCLAW_FAKE_CRABBOX_VERSION:-crabbox 0.22.1}"',
4242" exit 0",
4343"fi",
4444'if [ "$1" = "run" ] && [ "$2" = "--help" ]; then',
@@ -118,7 +118,7 @@ function writeFakeCrabbox(binDir: string, helpText: string): string {
118118"#!/usr/bin/env node",
119119"const args = process.argv.slice(2);",
120120'if (args[0] === "--version") {',
121-' console.log("crabbox 0.15.0");',
121+" console.log(process.env.OPENCLAW_FAKE_CRABBOX_VERSION || 'crabbox 0.22.1');",
122122" process.exit(0);",
123123"}",
124124'if (args[0] === "run" && args[1] === "--help") {',
@@ -338,6 +338,52 @@ describe.concurrent("scripts/crabbox-wrapper", () => {
338338expect(parseFakeCrabboxOutput(result).args).toContain("local-container");
339339});
340340341+it("requires a current Crabbox binary for Blacksmith Testbox runs", () => {
342+const result = runWrapper(
343+"provider: hetzner, aws, local-container, blacksmith-testbox, or cloudflare\n",
344+["run", "--provider", "blacksmith-testbox", "--", "echo ok"],
345+{ env: { OPENCLAW_FAKE_CRABBOX_VERSION: "crabbox 0.21.9" } },
346+);
347+348+expect(result.status).toBe(2);
349+expect(result.stdout).toBe("");
350+expect(result.stderr).toContain("provider=blacksmith-testbox requires Crabbox >= 0.22.0");
351+expect(result.stderr).toContain("selected binary reported version=crabbox 0.21.9");
352+});
353+354+it("applies the Blacksmith version gate to provider aliases", () => {
355+const result = runWrapper(
356+"provider: hetzner, aws, local-container, blacksmith-testbox, or cloudflare\n",
357+["run", "--provider", "blacksmith", "--", "echo ok"],
358+{ env: { OPENCLAW_FAKE_CRABBOX_VERSION: "crabbox 0.21.9" } },
359+);
360+361+expect(result.status).toBe(2);
362+expect(result.stderr).toContain("provider=blacksmith-testbox requires Crabbox >= 0.22.0");
363+});
364+365+it("rejects prerelease Crabbox builds at the Blacksmith minimum boundary", () => {
366+const result = runWrapper(
367+"provider: hetzner, aws, local-container, blacksmith-testbox, or cloudflare\n",
368+["run", "--provider", "blacksmith-testbox", "--", "echo ok"],
369+{ env: { OPENCLAW_FAKE_CRABBOX_VERSION: "crabbox 0.22.0-rc.1" } },
370+);
371+372+expect(result.status).toBe(2);
373+expect(result.stderr).toContain("selected binary reported version=crabbox 0.22.0-rc.1");
374+});
375+376+it("accepts post-release Crabbox describe builds at the Blacksmith minimum boundary", () => {
377+const result = runWrapper(
378+"provider: hetzner, aws, local-container, blacksmith-testbox, or cloudflare\n",
379+["run", "--provider", "blacksmith-testbox", "--", "echo ok"],
380+{ env: { OPENCLAW_FAKE_CRABBOX_VERSION: "crabbox 0.22.0-3-gabc1234" } },
381+);
382+383+expect(result.status).toBe(0);
384+expect(parseFakeCrabboxOutput(result).args).toContain("blacksmith-testbox");
385+});
386+341387it("only forces the short local-container Docker work root on Linux", () => {
342388const result = runWrapper(
343389"provider: hetzner, aws, local-container, blacksmith-testbox, or cloudflare\n",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。