* fix(paths): respect OPENCLAW_HOME for all internal path resolution (#11995) Add home-dir module (src/infra/home-dir.ts) that centralizes home directory resolution with precedence: OPENCLAW_HOME > HOME > USERPROFILE > os.homedir(). Migrate all path-sensitive callsites: config IO, agent dirs, session transcripts, pairing store, cron store, doctor, CLI profiles. Add envHomedir() helper in config/paths.ts to reduce lambda noise. Document OPENCLAW_HOME in docs/help/environment.md. * fix(paths): handle OPENCLAW_HOME '~' fallback (#12091) (thanks @sebslight) * docs: mention OPENCLAW_HOME in install and getting started (#12091) (thanks @sebslight) * fix(status): show OPENCLAW_HOME in shortened paths (#12091) (thanks @sebslight) * docs(changelog): clarify OPENCLAW_HOME and HOME precedence (#12091) (thanks @sebslight)
74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import { describe, expect, it } from "vitest";
|
|
import { createConfigIO } from "./io.js";
|
|
|
|
async function withTempHome(run: (home: string) => Promise<void>): Promise<void> {
|
|
const home = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-config-"));
|
|
try {
|
|
await run(home);
|
|
} finally {
|
|
await fs.rm(home, { recursive: true, force: true });
|
|
}
|
|
}
|
|
|
|
async function writeConfig(
|
|
home: string,
|
|
dirname: ".openclaw",
|
|
port: number,
|
|
filename: string = "openclaw.json",
|
|
) {
|
|
const dir = path.join(home, dirname);
|
|
await fs.mkdir(dir, { recursive: true });
|
|
const configPath = path.join(dir, filename);
|
|
await fs.writeFile(configPath, JSON.stringify({ gateway: { port } }, null, 2));
|
|
return configPath;
|
|
}
|
|
|
|
describe("config io paths", () => {
|
|
it("uses ~/.openclaw/openclaw.json when config exists", async () => {
|
|
await withTempHome(async (home) => {
|
|
const configPath = await writeConfig(home, ".openclaw", 19001);
|
|
const io = createConfigIO({
|
|
env: {} as NodeJS.ProcessEnv,
|
|
homedir: () => home,
|
|
});
|
|
expect(io.configPath).toBe(configPath);
|
|
expect(io.loadConfig().gateway?.port).toBe(19001);
|
|
});
|
|
});
|
|
|
|
it("defaults to ~/.openclaw/openclaw.json when config is missing", async () => {
|
|
await withTempHome(async (home) => {
|
|
const io = createConfigIO({
|
|
env: {} as NodeJS.ProcessEnv,
|
|
homedir: () => home,
|
|
});
|
|
expect(io.configPath).toBe(path.join(home, ".openclaw", "openclaw.json"));
|
|
});
|
|
});
|
|
|
|
it("uses OPENCLAW_HOME for default config path", async () => {
|
|
await withTempHome(async (home) => {
|
|
const io = createConfigIO({
|
|
env: { OPENCLAW_HOME: path.join(home, "svc-home") } as NodeJS.ProcessEnv,
|
|
homedir: () => path.join(home, "ignored-home"),
|
|
});
|
|
expect(io.configPath).toBe(path.join(home, "svc-home", ".openclaw", "openclaw.json"));
|
|
});
|
|
});
|
|
|
|
it("honors explicit OPENCLAW_CONFIG_PATH override", async () => {
|
|
await withTempHome(async (home) => {
|
|
const customPath = await writeConfig(home, ".openclaw", 20002, "custom.json");
|
|
const io = createConfigIO({
|
|
env: { OPENCLAW_CONFIG_PATH: customPath } as NodeJS.ProcessEnv,
|
|
homedir: () => home,
|
|
});
|
|
expect(io.configPath).toBe(customPath);
|
|
expect(io.loadConfig().gateway?.port).toBe(20002);
|
|
});
|
|
});
|
|
});
|