fix(ci): stabilize windows bash tests

This commit is contained in:
Peter Steinberger
2026-01-08 03:29:05 +00:00
parent 35759e409a
commit 0af3af34a1
3 changed files with 18 additions and 24 deletions

View File

@@ -7,11 +7,15 @@ import {
processTool,
} from "./bash-tools.js";
const nodePath = process.execPath.includes(" ")
? `"${process.execPath}"`
: process.execPath;
const nodeEval = (script: string) =>
`${nodePath} -e "${script.replaceAll('"', '\\"')}"`;
const isWin = process.platform === "win32";
const shortDelayCmd = isWin ? "ping -n 2 127.0.0.1 > nul" : "sleep 0.05";
const longDelayCmd = isWin ? "ping -n 4 127.0.0.1 > nul" : "sleep 2";
const joinCommands = (commands: string[]) =>
commands.join(isWin ? " & " : "; ");
const echoAfterDelay = (message: string) =>
joinCommands([shortDelayCmd, `echo ${message}`]);
const echoLines = (lines: string[]) =>
joinCommands(lines.map((line) => `echo ${line}`));
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -38,7 +42,7 @@ beforeEach(() => {
describe("bash tool backgrounding", () => {
it("backgrounds after yield and can be polled", async () => {
const result = await bashTool.execute("call1", {
command: nodeEval("setTimeout(function(){ console.log('done') }, 50)"),
command: echoAfterDelay("done"),
yieldMs: 10,
});
@@ -68,7 +72,7 @@ describe("bash tool backgrounding", () => {
it("supports explicit background", async () => {
const result = await bashTool.execute("call1", {
command: nodeEval("setTimeout(function(){ console.log('later') }, 50)"),
command: echoAfterDelay("later"),
background: true,
});
@@ -103,7 +107,7 @@ describe("bash tool backgrounding", () => {
const customProcess = createProcessTool();
const result = await customBash.execute("call1", {
command: nodeEval("setInterval(function(){}, 1000)"),
command: longDelayCmd,
background: true,
});
@@ -154,9 +158,7 @@ describe("bash tool backgrounding", () => {
it("logs line-based slices and defaults to last lines", async () => {
const result = await bashTool.execute("call1", {
command: nodeEval(
"console.log('one'); console.log('two'); console.log('three');",
),
command: echoLines(["one", "two", "three"]),
background: true,
});
const sessionId = (result.details as { sessionId: string }).sessionId;
@@ -176,9 +178,7 @@ describe("bash tool backgrounding", () => {
it("supports line offsets for log slices", async () => {
const result = await bashTool.execute("call1", {
command: nodeEval(
"console.log('alpha'); console.log('beta'); console.log('gamma');",
),
command: echoLines(["alpha", "beta", "gamma"]),
background: true,
});
const sessionId = (result.details as { sessionId: string }).sessionId;
@@ -201,11 +201,11 @@ describe("bash tool backgrounding", () => {
const processB = createProcessTool({ scopeKey: "agent:beta" });
const resultA = await bashA.execute("call1", {
command: nodeEval("setTimeout(function(){}, 50)"),
command: shortDelayCmd,
background: true,
});
const resultB = await bashB.execute("call2", {
command: nodeEval("setTimeout(function(){}, 50)"),
command: shortDelayCmd,
background: true,
});

View File

@@ -3,12 +3,6 @@ import type { ClawdbotConfig } from "../config/config.js";
import { createClawdbotCodingTools } from "./pi-tools.js";
import type { SandboxDockerConfig } from "./sandbox.js";
const nodePath = process.execPath.includes(" ")
? `"${process.execPath}"`
: process.execPath;
const nodeEval = (script: string) =>
`${nodePath} -e "${script.replaceAll('"', '\\"')}"`;
describe("Agent-specific tool filtering", () => {
it("should apply global tool policy when no agent-specific policy exists", () => {
const cfg: ClawdbotConfig = {
@@ -239,7 +233,7 @@ describe("Agent-specific tool filtering", () => {
expect(bash).toBeDefined();
const result = await bash?.execute("call1", {
command: nodeEval("setTimeout(function(){ console.log('done') }, 50)"),
command: "echo done",
yieldMs: 10,
});

View File

@@ -532,7 +532,7 @@ describe("doctor", () => {
([message, title]) =>
title === "Legacy workspace" &&
typeof message === "string" &&
message.includes(path.resolve("/Users/steipete/clawdis")),
message.includes("clawdis"),
),
).toBe(true);