fix(ci): stabilize windows paths
This commit is contained in:
@@ -13,6 +13,40 @@ import {
|
|||||||
resolveAuthProfileOrder,
|
resolveAuthProfileOrder,
|
||||||
} from "./auth-profiles.js";
|
} from "./auth-profiles.js";
|
||||||
|
|
||||||
|
const HOME_ENV_KEYS = ["HOME", "USERPROFILE", "HOMEDRIVE", "HOMEPATH"] as const;
|
||||||
|
type HomeEnvSnapshot = Record<
|
||||||
|
(typeof HOME_ENV_KEYS)[number],
|
||||||
|
string | undefined
|
||||||
|
>;
|
||||||
|
|
||||||
|
const snapshotHomeEnv = (): HomeEnvSnapshot => ({
|
||||||
|
HOME: process.env.HOME,
|
||||||
|
USERPROFILE: process.env.USERPROFILE,
|
||||||
|
HOMEDRIVE: process.env.HOMEDRIVE,
|
||||||
|
HOMEPATH: process.env.HOMEPATH,
|
||||||
|
});
|
||||||
|
|
||||||
|
const restoreHomeEnv = (snapshot: HomeEnvSnapshot) => {
|
||||||
|
for (const key of HOME_ENV_KEYS) {
|
||||||
|
const value = snapshot[key];
|
||||||
|
if (value === undefined) {
|
||||||
|
delete process.env[key];
|
||||||
|
} else {
|
||||||
|
process.env[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const setTempHome = (tempHome: string) => {
|
||||||
|
process.env.HOME = tempHome;
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
process.env.USERPROFILE = tempHome;
|
||||||
|
const root = path.parse(tempHome).root;
|
||||||
|
process.env.HOMEDRIVE = root.replace(/\\$/, "");
|
||||||
|
process.env.HOMEPATH = tempHome.slice(root.length - 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
describe("resolveAuthProfileOrder", () => {
|
describe("resolveAuthProfileOrder", () => {
|
||||||
const store: AuthProfileStore = {
|
const store: AuthProfileStore = {
|
||||||
version: 1,
|
version: 1,
|
||||||
@@ -347,12 +381,12 @@ describe("external CLI credential sync", () => {
|
|||||||
const agentDir = fs.mkdtempSync(
|
const agentDir = fs.mkdtempSync(
|
||||||
path.join(os.tmpdir(), "clawdbot-cli-sync-"),
|
path.join(os.tmpdir(), "clawdbot-cli-sync-"),
|
||||||
);
|
);
|
||||||
const originalHome = process.env.HOME;
|
const originalHome = snapshotHomeEnv();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Create a temp home with Claude CLI credentials
|
// Create a temp home with Claude CLI credentials
|
||||||
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
||||||
process.env.HOME = tempHome;
|
setTempHome(tempHome);
|
||||||
|
|
||||||
// Create Claude CLI credentials
|
// Create Claude CLI credentials
|
||||||
const claudeDir = path.join(tempHome, ".claude");
|
const claudeDir = path.join(tempHome, ".claude");
|
||||||
@@ -400,7 +434,7 @@ describe("external CLI credential sync", () => {
|
|||||||
(store.profiles[CLAUDE_CLI_PROFILE_ID] as { expires: number }).expires,
|
(store.profiles[CLAUDE_CLI_PROFILE_ID] as { expires: number }).expires,
|
||||||
).toBeGreaterThan(Date.now());
|
).toBeGreaterThan(Date.now());
|
||||||
} finally {
|
} finally {
|
||||||
process.env.HOME = originalHome;
|
restoreHomeEnv(originalHome);
|
||||||
fs.rmSync(agentDir, { recursive: true, force: true });
|
fs.rmSync(agentDir, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -409,11 +443,11 @@ describe("external CLI credential sync", () => {
|
|||||||
const agentDir = fs.mkdtempSync(
|
const agentDir = fs.mkdtempSync(
|
||||||
path.join(os.tmpdir(), "clawdbot-codex-sync-"),
|
path.join(os.tmpdir(), "clawdbot-codex-sync-"),
|
||||||
);
|
);
|
||||||
const originalHome = process.env.HOME;
|
const originalHome = snapshotHomeEnv();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
||||||
process.env.HOME = tempHome;
|
setTempHome(tempHome);
|
||||||
|
|
||||||
// Create Codex CLI credentials
|
// Create Codex CLI credentials
|
||||||
const codexDir = path.join(tempHome, ".codex");
|
const codexDir = path.join(tempHome, ".codex");
|
||||||
@@ -444,7 +478,7 @@ describe("external CLI credential sync", () => {
|
|||||||
(store.profiles[CODEX_CLI_PROFILE_ID] as { access: string }).access,
|
(store.profiles[CODEX_CLI_PROFILE_ID] as { access: string }).access,
|
||||||
).toBe("codex-access-token");
|
).toBe("codex-access-token");
|
||||||
} finally {
|
} finally {
|
||||||
process.env.HOME = originalHome;
|
restoreHomeEnv(originalHome);
|
||||||
fs.rmSync(agentDir, { recursive: true, force: true });
|
fs.rmSync(agentDir, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -453,11 +487,11 @@ describe("external CLI credential sync", () => {
|
|||||||
const agentDir = fs.mkdtempSync(
|
const agentDir = fs.mkdtempSync(
|
||||||
path.join(os.tmpdir(), "clawdbot-no-overwrite-"),
|
path.join(os.tmpdir(), "clawdbot-no-overwrite-"),
|
||||||
);
|
);
|
||||||
const originalHome = process.env.HOME;
|
const originalHome = snapshotHomeEnv();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
||||||
process.env.HOME = tempHome;
|
setTempHome(tempHome);
|
||||||
|
|
||||||
// Create Claude CLI credentials
|
// Create Claude CLI credentials
|
||||||
const claudeDir = path.join(tempHome, ".claude");
|
const claudeDir = path.join(tempHome, ".claude");
|
||||||
@@ -498,7 +532,7 @@ describe("external CLI credential sync", () => {
|
|||||||
);
|
);
|
||||||
expect(store.profiles[CLAUDE_CLI_PROFILE_ID]).toBeDefined();
|
expect(store.profiles[CLAUDE_CLI_PROFILE_ID]).toBeDefined();
|
||||||
} finally {
|
} finally {
|
||||||
process.env.HOME = originalHome;
|
restoreHomeEnv(originalHome);
|
||||||
fs.rmSync(agentDir, { recursive: true, force: true });
|
fs.rmSync(agentDir, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -507,11 +541,11 @@ describe("external CLI credential sync", () => {
|
|||||||
const agentDir = fs.mkdtempSync(
|
const agentDir = fs.mkdtempSync(
|
||||||
path.join(os.tmpdir(), "clawdbot-cli-no-downgrade-"),
|
path.join(os.tmpdir(), "clawdbot-cli-no-downgrade-"),
|
||||||
);
|
);
|
||||||
const originalHome = process.env.HOME;
|
const originalHome = snapshotHomeEnv();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
||||||
process.env.HOME = tempHome;
|
setTempHome(tempHome);
|
||||||
|
|
||||||
const claudeDir = path.join(tempHome, ".claude");
|
const claudeDir = path.join(tempHome, ".claude");
|
||||||
fs.mkdirSync(claudeDir, { recursive: true });
|
fs.mkdirSync(claudeDir, { recursive: true });
|
||||||
@@ -548,7 +582,7 @@ describe("external CLI credential sync", () => {
|
|||||||
(store.profiles[CLAUDE_CLI_PROFILE_ID] as { access: string }).access,
|
(store.profiles[CLAUDE_CLI_PROFILE_ID] as { access: string }).access,
|
||||||
).toBe("store-access");
|
).toBe("store-access");
|
||||||
} finally {
|
} finally {
|
||||||
process.env.HOME = originalHome;
|
restoreHomeEnv(originalHome);
|
||||||
fs.rmSync(agentDir, { recursive: true, force: true });
|
fs.rmSync(agentDir, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -557,11 +591,11 @@ describe("external CLI credential sync", () => {
|
|||||||
const agentDir = fs.mkdtempSync(
|
const agentDir = fs.mkdtempSync(
|
||||||
path.join(os.tmpdir(), "clawdbot-codex-refresh-sync-"),
|
path.join(os.tmpdir(), "clawdbot-codex-refresh-sync-"),
|
||||||
);
|
);
|
||||||
const originalHome = process.env.HOME;
|
const originalHome = snapshotHomeEnv();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-home-"));
|
||||||
process.env.HOME = tempHome;
|
setTempHome(tempHome);
|
||||||
|
|
||||||
const codexDir = path.join(tempHome, ".codex");
|
const codexDir = path.join(tempHome, ".codex");
|
||||||
fs.mkdirSync(codexDir, { recursive: true });
|
fs.mkdirSync(codexDir, { recursive: true });
|
||||||
@@ -596,7 +630,7 @@ describe("external CLI credential sync", () => {
|
|||||||
(store.profiles[CODEX_CLI_PROFILE_ID] as { refresh: string }).refresh,
|
(store.profiles[CODEX_CLI_PROFILE_ID] as { refresh: string }).refresh,
|
||||||
).toBe("new-refresh");
|
).toBe("new-refresh");
|
||||||
} finally {
|
} finally {
|
||||||
process.env.HOME = originalHome;
|
restoreHomeEnv(originalHome);
|
||||||
fs.rmSync(agentDir, { recursive: true, force: true });
|
fs.rmSync(agentDir, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,6 +7,12 @@ import {
|
|||||||
processTool,
|
processTool,
|
||||||
} from "./bash-tools.js";
|
} from "./bash-tools.js";
|
||||||
|
|
||||||
|
const nodePath = process.execPath.includes(" ")
|
||||||
|
? `"${process.execPath}"`
|
||||||
|
: process.execPath;
|
||||||
|
const nodeEval = (script: string) =>
|
||||||
|
`${nodePath} -e "${script.replaceAll('"', '\\"')}"`;
|
||||||
|
|
||||||
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
|
||||||
async function waitForCompletion(sessionId: string) {
|
async function waitForCompletion(sessionId: string) {
|
||||||
@@ -32,7 +38,7 @@ beforeEach(() => {
|
|||||||
describe("bash tool backgrounding", () => {
|
describe("bash tool backgrounding", () => {
|
||||||
it("backgrounds after yield and can be polled", async () => {
|
it("backgrounds after yield and can be polled", async () => {
|
||||||
const result = await bashTool.execute("call1", {
|
const result = await bashTool.execute("call1", {
|
||||||
command: "node -e \"setTimeout(() => { console.log('done') }, 50)\"",
|
command: nodeEval("setTimeout(function(){ console.log('done') }, 50)"),
|
||||||
yieldMs: 10,
|
yieldMs: 10,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -62,7 +68,7 @@ describe("bash tool backgrounding", () => {
|
|||||||
|
|
||||||
it("supports explicit background", async () => {
|
it("supports explicit background", async () => {
|
||||||
const result = await bashTool.execute("call1", {
|
const result = await bashTool.execute("call1", {
|
||||||
command: "node -e \"setTimeout(() => { console.log('later') }, 50)\"",
|
command: nodeEval("setTimeout(function(){ console.log('later') }, 50)"),
|
||||||
background: true,
|
background: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -97,7 +103,7 @@ describe("bash tool backgrounding", () => {
|
|||||||
const customProcess = createProcessTool();
|
const customProcess = createProcessTool();
|
||||||
|
|
||||||
const result = await customBash.execute("call1", {
|
const result = await customBash.execute("call1", {
|
||||||
command: 'node -e "setInterval(() => {}, 1000)"',
|
command: nodeEval("setInterval(function(){}, 1000)"),
|
||||||
background: true,
|
background: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -148,8 +154,9 @@ describe("bash tool backgrounding", () => {
|
|||||||
|
|
||||||
it("logs line-based slices and defaults to last lines", async () => {
|
it("logs line-based slices and defaults to last lines", async () => {
|
||||||
const result = await bashTool.execute("call1", {
|
const result = await bashTool.execute("call1", {
|
||||||
command:
|
command: nodeEval(
|
||||||
"node -e \"console.log('one'); console.log('two'); console.log('three');\"",
|
"console.log('one'); console.log('two'); console.log('three');",
|
||||||
|
),
|
||||||
background: true,
|
background: true,
|
||||||
});
|
});
|
||||||
const sessionId = (result.details as { sessionId: string }).sessionId;
|
const sessionId = (result.details as { sessionId: string }).sessionId;
|
||||||
@@ -169,8 +176,9 @@ describe("bash tool backgrounding", () => {
|
|||||||
|
|
||||||
it("supports line offsets for log slices", async () => {
|
it("supports line offsets for log slices", async () => {
|
||||||
const result = await bashTool.execute("call1", {
|
const result = await bashTool.execute("call1", {
|
||||||
command:
|
command: nodeEval(
|
||||||
"node -e \"console.log('alpha'); console.log('beta'); console.log('gamma');\"",
|
"console.log('alpha'); console.log('beta'); console.log('gamma');",
|
||||||
|
),
|
||||||
background: true,
|
background: true,
|
||||||
});
|
});
|
||||||
const sessionId = (result.details as { sessionId: string }).sessionId;
|
const sessionId = (result.details as { sessionId: string }).sessionId;
|
||||||
@@ -193,11 +201,11 @@ describe("bash tool backgrounding", () => {
|
|||||||
const processB = createProcessTool({ scopeKey: "agent:beta" });
|
const processB = createProcessTool({ scopeKey: "agent:beta" });
|
||||||
|
|
||||||
const resultA = await bashA.execute("call1", {
|
const resultA = await bashA.execute("call1", {
|
||||||
command: 'node -e "setTimeout(() => {}, 50)"',
|
command: nodeEval("setTimeout(function(){}, 50)"),
|
||||||
background: true,
|
background: true,
|
||||||
});
|
});
|
||||||
const resultB = await bashB.execute("call2", {
|
const resultB = await bashB.execute("call2", {
|
||||||
command: 'node -e "setTimeout(() => {}, 50)"',
|
command: nodeEval("setTimeout(function(){}, 50)"),
|
||||||
background: true,
|
background: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { EventEmitter } from "node:events";
|
import { EventEmitter } from "node:events";
|
||||||
|
import path from "node:path";
|
||||||
import { Readable } from "node:stream";
|
import { Readable } from "node:stream";
|
||||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
import type { ClawdbotConfig } from "../config/config.js";
|
import type { ClawdbotConfig } from "../config/config.js";
|
||||||
@@ -349,7 +350,9 @@ describe("Agent-specific sandbox config", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(context).toBeDefined();
|
expect(context).toBeDefined();
|
||||||
expect(context?.workspaceDir).toContain("/tmp/isolated-sandboxes");
|
expect(context?.workspaceDir).toContain(
|
||||||
|
path.resolve("/tmp/isolated-sandboxes"),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should prefer agent config over global for multiple agents", async () => {
|
it("should prefer agent config over global for multiple agents", async () => {
|
||||||
|
|||||||
@@ -4,6 +4,40 @@ import path from "node:path";
|
|||||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||||
import { buildStatusMessage } from "./status.js";
|
import { buildStatusMessage } from "./status.js";
|
||||||
|
|
||||||
|
const HOME_ENV_KEYS = ["HOME", "USERPROFILE", "HOMEDRIVE", "HOMEPATH"] as const;
|
||||||
|
type HomeEnvSnapshot = Record<
|
||||||
|
(typeof HOME_ENV_KEYS)[number],
|
||||||
|
string | undefined
|
||||||
|
>;
|
||||||
|
|
||||||
|
const snapshotHomeEnv = (): HomeEnvSnapshot => ({
|
||||||
|
HOME: process.env.HOME,
|
||||||
|
USERPROFILE: process.env.USERPROFILE,
|
||||||
|
HOMEDRIVE: process.env.HOMEDRIVE,
|
||||||
|
HOMEPATH: process.env.HOMEPATH,
|
||||||
|
});
|
||||||
|
|
||||||
|
const restoreHomeEnv = (snapshot: HomeEnvSnapshot) => {
|
||||||
|
for (const key of HOME_ENV_KEYS) {
|
||||||
|
const value = snapshot[key];
|
||||||
|
if (value === undefined) {
|
||||||
|
delete process.env[key];
|
||||||
|
} else {
|
||||||
|
process.env[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const setTempHome = (tempHome: string) => {
|
||||||
|
process.env.HOME = tempHome;
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
process.env.USERPROFILE = tempHome;
|
||||||
|
const root = path.parse(tempHome).root;
|
||||||
|
process.env.HOMEDRIVE = root.replace(/\\$/, "");
|
||||||
|
process.env.HOMEPATH = tempHome.slice(root.length - 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
vi.restoreAllMocks();
|
vi.restoreAllMocks();
|
||||||
});
|
});
|
||||||
@@ -136,8 +170,8 @@ describe("buildStatusMessage", () => {
|
|||||||
|
|
||||||
it("prefers cached prompt tokens from the session log", async () => {
|
it("prefers cached prompt tokens from the session log", async () => {
|
||||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-status-"));
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-status-"));
|
||||||
const previousHome = process.env.HOME;
|
const previousHome = snapshotHomeEnv();
|
||||||
process.env.HOME = dir;
|
setTempHome(dir);
|
||||||
try {
|
try {
|
||||||
vi.resetModules();
|
vi.resetModules();
|
||||||
const { buildStatusMessage: buildStatusMessageDynamic } = await import(
|
const { buildStatusMessage: buildStatusMessageDynamic } = await import(
|
||||||
@@ -195,7 +229,7 @@ describe("buildStatusMessage", () => {
|
|||||||
|
|
||||||
expect(text).toContain("Context: 1.0k/32k");
|
expect(text).toContain("Context: 1.0k/32k");
|
||||||
} finally {
|
} finally {
|
||||||
process.env.HOME = previousHome;
|
restoreHomeEnv(previousHome);
|
||||||
fs.rmSync(dir, { recursive: true, force: true });
|
fs.rmSync(dir, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import path from "node:path";
|
||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -35,6 +36,6 @@ describe("nodes screen helpers", () => {
|
|||||||
tmpDir: "/tmp",
|
tmpDir: "/tmp",
|
||||||
id: "id1",
|
id: "id1",
|
||||||
});
|
});
|
||||||
expect(p).toBe("/tmp/clawdbot-screen-record-id1.mp4");
|
expect(p).toBe(path.join("/tmp", "clawdbot-screen-record-id1.mp4"));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -72,10 +72,11 @@ describe("applyCliProfileEnv", () => {
|
|||||||
env,
|
env,
|
||||||
homedir: () => "/home/peter",
|
homedir: () => "/home/peter",
|
||||||
});
|
});
|
||||||
|
const expectedStateDir = path.join("/home/peter", ".clawdbot-dev");
|
||||||
expect(env.CLAWDBOT_PROFILE).toBe("dev");
|
expect(env.CLAWDBOT_PROFILE).toBe("dev");
|
||||||
expect(env.CLAWDBOT_STATE_DIR).toBe("/home/peter/.clawdbot-dev");
|
expect(env.CLAWDBOT_STATE_DIR).toBe(expectedStateDir);
|
||||||
expect(env.CLAWDBOT_CONFIG_PATH).toBe(
|
expect(env.CLAWDBOT_CONFIG_PATH).toBe(
|
||||||
path.join("/home/peter/.clawdbot-dev", "clawdbot.json"),
|
path.join(expectedStateDir, "clawdbot.json"),
|
||||||
);
|
);
|
||||||
expect(env.CLAWDBOT_GATEWAY_PORT).toBe("19001");
|
expect(env.CLAWDBOT_GATEWAY_PORT).toBe("19001");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ describe("agents helpers", () => {
|
|||||||
const work = summaries.find((summary) => summary.id === "work");
|
const work = summaries.find((summary) => summary.id === "work");
|
||||||
|
|
||||||
expect(main).toBeTruthy();
|
expect(main).toBeTruthy();
|
||||||
expect(main?.workspace).toBe("/main-ws");
|
expect(main?.workspace).toBe(path.resolve("/main-ws"));
|
||||||
expect(main?.bindings).toBe(1);
|
expect(main?.bindings).toBe(1);
|
||||||
expect(main?.model).toBe("anthropic/claude");
|
expect(main?.model).toBe("anthropic/claude");
|
||||||
expect(main?.agentDir.endsWith(path.join("agents", "main", "agent"))).toBe(
|
expect(main?.agentDir.endsWith(path.join("agents", "main", "agent"))).toBe(
|
||||||
@@ -49,8 +49,8 @@ describe("agents helpers", () => {
|
|||||||
|
|
||||||
expect(work).toBeTruthy();
|
expect(work).toBeTruthy();
|
||||||
expect(work?.name).toBe("Work");
|
expect(work?.name).toBe("Work");
|
||||||
expect(work?.workspace).toBe("/work-ws");
|
expect(work?.workspace).toBe(path.resolve("/work-ws"));
|
||||||
expect(work?.agentDir).toBe("/state/agents/work/agent");
|
expect(work?.agentDir).toBe(path.resolve("/state/agents/work/agent"));
|
||||||
expect(work?.bindings).toBe(1);
|
expect(work?.bindings).toBe(1);
|
||||||
expect(work?.isDefault).toBe(true);
|
expect(work?.isDefault).toBe(true);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -532,7 +532,7 @@ describe("doctor", () => {
|
|||||||
([message, title]) =>
|
([message, title]) =>
|
||||||
title === "Legacy workspace" &&
|
title === "Legacy workspace" &&
|
||||||
typeof message === "string" &&
|
typeof message === "string" &&
|
||||||
message.includes("/Users/steipete/clawdis"),
|
message.includes(path.join("/Users/steipete", "clawdis")),
|
||||||
),
|
),
|
||||||
).toBe(true);
|
).toBe(true);
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ function resolveUserPath(input: string): string {
|
|||||||
const trimmed = input.trim();
|
const trimmed = input.trim();
|
||||||
if (!trimmed) return trimmed;
|
if (!trimmed) return trimmed;
|
||||||
if (trimmed.startsWith("~")) {
|
if (trimmed.startsWith("~")) {
|
||||||
return path.resolve(trimmed.replace("~", os.homedir()));
|
const expanded = trimmed.replace(/^~(?=$|[\\/])/, os.homedir());
|
||||||
|
return path.resolve(expanded);
|
||||||
}
|
}
|
||||||
return path.resolve(trimmed);
|
return path.resolve(trimmed);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,12 +202,14 @@ export function resolveStorePath(store?: string, opts?: { agentId?: string }) {
|
|||||||
const agentId = normalizeAgentId(opts?.agentId ?? DEFAULT_AGENT_ID);
|
const agentId = normalizeAgentId(opts?.agentId ?? DEFAULT_AGENT_ID);
|
||||||
if (!store) return resolveDefaultSessionStorePath(agentId);
|
if (!store) return resolveDefaultSessionStorePath(agentId);
|
||||||
if (store.includes("{agentId}")) {
|
if (store.includes("{agentId}")) {
|
||||||
return path.resolve(
|
const expanded = store.replaceAll("{agentId}", agentId);
|
||||||
store.replaceAll("{agentId}", agentId).replace("~", os.homedir()),
|
if (expanded.startsWith("~")) {
|
||||||
);
|
return path.resolve(expanded.replace(/^~(?=$|[\\/])/, os.homedir()));
|
||||||
|
}
|
||||||
|
return path.resolve(expanded);
|
||||||
}
|
}
|
||||||
if (store.startsWith("~"))
|
if (store.startsWith("~"))
|
||||||
return path.resolve(store.replace("~", os.homedir()));
|
return path.resolve(store.replace(/^~(?=$|[\\/])/, os.homedir()));
|
||||||
return path.resolve(store);
|
return path.resolve(store);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,8 @@ export function resolveUserPath(input: string): string {
|
|||||||
const trimmed = input.trim();
|
const trimmed = input.trim();
|
||||||
if (!trimmed) return trimmed;
|
if (!trimmed) return trimmed;
|
||||||
if (trimmed.startsWith("~")) {
|
if (trimmed.startsWith("~")) {
|
||||||
return path.resolve(trimmed.replace("~", os.homedir()));
|
const expanded = trimmed.replace(/^~(?=$|[\\/])/, os.homedir());
|
||||||
|
return path.resolve(expanded);
|
||||||
}
|
}
|
||||||
return path.resolve(trimmed);
|
return path.resolve(trimmed);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user