diff --git a/src/commands/auth-choice.test.ts b/src/commands/auth-choice.test.ts index bd3f6cf29..3e8eb0739 100644 --- a/src/commands/auth-choice.test.ts +++ b/src/commands/auth-choice.test.ts @@ -20,6 +20,11 @@ const noopAsync = async () => {}; const noop = () => {}; const authProfilePathFor = (agentDir: string) => path.join(agentDir, "auth-profiles.json"); +const requireAgentDir = () => { + const agentDir = process.env.CLAWDBOT_AGENT_DIR; + if (!agentDir) throw new Error("CLAWDBOT_AGENT_DIR not set"); + return agentDir; +}; describe("applyAuthChoice", () => { const previousStateDir = process.env.CLAWDBOT_STATE_DIR; @@ -113,9 +118,7 @@ describe("applyAuthChoice", () => { mode: "api_key", }); - const authProfilePath = authProfilePathFor( - process.env.CLAWDBOT_AGENT_DIR!, - ); + const authProfilePath = authProfilePathFor(requireAgentDir()); const raw = await fs.readFile(authProfilePath, "utf8"); const parsed = JSON.parse(raw) as { profiles?: Record; @@ -168,9 +171,7 @@ describe("applyAuthChoice", () => { mode: "api_key", }); - const authProfilePath = authProfilePathFor( - process.env.CLAWDBOT_AGENT_DIR!, - ); + const authProfilePath = authProfilePathFor(requireAgentDir()); const raw = await fs.readFile(authProfilePath, "utf8"); const parsed = JSON.parse(raw) as { profiles?: Record; @@ -331,9 +332,7 @@ describe("applyAuthChoice", () => { "openrouter/auto", ); - const authProfilePath = authProfilePathFor( - process.env.CLAWDBOT_AGENT_DIR!, - ); + const authProfilePath = authProfilePathFor(requireAgentDir()); const raw = await fs.readFile(authProfilePath, "utf8"); const parsed = JSON.parse(raw) as { profiles?: Record; @@ -416,9 +415,7 @@ describe("applyAuthChoice", () => { mode: "oauth", }); - const authProfilePath = authProfilePathFor( - process.env.CLAWDBOT_AGENT_DIR!, - ); + const authProfilePath = authProfilePathFor(requireAgentDir()); const raw = await fs.readFile(authProfilePath, "utf8"); const parsed = JSON.parse(raw) as { profiles?: Record< diff --git a/src/commands/doctor-install.ts b/src/commands/doctor-install.ts index 9128575ef..3e88f072d 100644 --- a/src/commands/doctor-install.ts +++ b/src/commands/doctor-install.ts @@ -28,9 +28,7 @@ export function noteSourceInstallIssues(root: string | null) { } if (fs.existsSync(srcEntry) && !fs.existsSync(tsxBin)) { - warnings.push( - "- tsx binary is missing for source runs. Run: pnpm install", - ); + warnings.push("- tsx binary is missing for source runs. Run: pnpm install"); } if (warnings.length > 0) { diff --git a/src/commands/doctor-ui.ts b/src/commands/doctor-ui.ts index 2eaf06277..4c131df9f 100644 --- a/src/commands/doctor-ui.ts +++ b/src/commands/doctor-ui.ts @@ -29,10 +29,7 @@ export async function maybeRepairUiProtocolFreshness( if (schemaStats && !uiStats) { note( - [ - "- Control UI assets are missing.", - "- Run: pnpm ui:build", - ].join("\n"), + ["- Control UI assets are missing.", "- Run: pnpm ui:build"].join("\n"), "UI", ); diff --git a/src/commands/onboard-auth.test.ts b/src/commands/onboard-auth.test.ts index 158011349..620f341d9 100644 --- a/src/commands/onboard-auth.test.ts +++ b/src/commands/onboard-auth.test.ts @@ -16,14 +16,19 @@ import { applySyntheticConfig, applySyntheticProviderConfig, OPENROUTER_DEFAULT_MODEL_REF, - setMinimaxApiKey, SYNTHETIC_DEFAULT_MODEL_ID, SYNTHETIC_DEFAULT_MODEL_REF, + setMinimaxApiKey, writeOAuthCredentials, } from "./onboard-auth.js"; const authProfilePathFor = (agentDir: string) => path.join(agentDir, "auth-profiles.json"); +const requireAgentDir = () => { + const agentDir = process.env.CLAWDBOT_AGENT_DIR; + if (!agentDir) throw new Error("CLAWDBOT_AGENT_DIR not set"); + return agentDir; +}; describe("writeOAuthCredentials", () => { const previousStateDir = process.env.CLAWDBOT_STATE_DIR; @@ -68,9 +73,7 @@ describe("writeOAuthCredentials", () => { await writeOAuthCredentials("openai-codex", creds); - const authProfilePath = authProfilePathFor( - process.env.CLAWDBOT_AGENT_DIR!, - ); + const authProfilePath = authProfilePathFor(requireAgentDir()); const raw = await fs.readFile(authProfilePath, "utf8"); const parsed = JSON.parse(raw) as { profiles?: Record; @@ -83,7 +86,13 @@ describe("writeOAuthCredentials", () => { await expect( fs.readFile( - path.join(tempStateDir, "agents", "main", "agent", "auth-profiles.json"), + path.join( + tempStateDir, + "agents", + "main", + "agent", + "auth-profiles.json", + ), "utf8", ), ).rejects.toThrow(); @@ -119,19 +128,22 @@ describe("setMinimaxApiKey", () => { }); it("writes to CLAWDBOT_AGENT_DIR when set", async () => { - tempStateDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-minimax-")); + tempStateDir = await fs.mkdtemp( + path.join(os.tmpdir(), "clawdbot-minimax-"), + ); process.env.CLAWDBOT_STATE_DIR = tempStateDir; process.env.CLAWDBOT_AGENT_DIR = path.join(tempStateDir, "custom-agent"); process.env.PI_CODING_AGENT_DIR = process.env.CLAWDBOT_AGENT_DIR; await setMinimaxApiKey("sk-minimax-test"); - const customAuthPath = authProfilePathFor( - process.env.CLAWDBOT_AGENT_DIR!, - ); + const customAuthPath = authProfilePathFor(requireAgentDir()); const raw = await fs.readFile(customAuthPath, "utf8"); const parsed = JSON.parse(raw) as { - profiles?: Record; + profiles?: Record< + string, + { type?: string; provider?: string; key?: string } + >; }; expect(parsed.profiles?.["minimax:default"]).toMatchObject({ type: "api_key", @@ -141,7 +153,13 @@ describe("setMinimaxApiKey", () => { await expect( fs.readFile( - path.join(tempStateDir, "agents", "main", "agent", "auth-profiles.json"), + path.join( + tempStateDir, + "agents", + "main", + "agent", + "auth-profiles.json", + ), "utf8", ), ).rejects.toThrow(); diff --git a/src/entry.ts b/src/entry.ts index 3ff85d4b3..d8ae5d088 100644 --- a/src/entry.ts +++ b/src/entry.ts @@ -24,7 +24,8 @@ function ensureExperimentalWarningSuppressed(): void { const nodeOptions = process.env.NODE_OPTIONS ?? ""; if (hasExperimentalWarningSuppressed(nodeOptions)) return; process.env.CLAWDBOT_NODE_OPTIONS_READY = "1"; - process.env.NODE_OPTIONS = `${nodeOptions} ${EXPERIMENTAL_WARNING_FLAG}`.trim(); + process.env.NODE_OPTIONS = + `${nodeOptions} ${EXPERIMENTAL_WARNING_FLAG}`.trim(); const result = spawnSync(process.execPath, process.argv.slice(1), { stdio: "inherit", env: process.env,