diff --git a/CHANGELOG.md b/CHANGELOG.md index c04b1363..2393b05b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.20.1 + +- fix: inherit process.env when spawning agent subprocess + ## 0.20.0 - Update to @anthropic-ai/claude-agent-sdk@0.2.63 diff --git a/package-lock.json b/package-lock.json index 8118eee5..70e7a749 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@zed-industries/claude-agent-acp", - "version": "0.20.0", + "version": "0.20.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@zed-industries/claude-agent-acp", - "version": "0.20.0", + "version": "0.20.1", "license": "Apache-2.0", "dependencies": { "@agentclientprotocol/sdk": "0.14.1", diff --git a/package.json b/package.json index 9d590774..62a0f7d1 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "0.20.0", + "version": "0.20.1", "description": "An ACP-compatible coding agent powered by the Claude Agent SDK (TypeScript)", "main": "dist/lib.js", "types": "dist/lib.d.ts", diff --git a/src/acp-agent.ts b/src/acp-agent.ts index ed18a0bb..e6550428 100644 --- a/src/acp-agent.ts +++ b/src/acp-agent.ts @@ -1240,6 +1240,7 @@ export class ClaudeAcpAgent implements Agent { ...(maxThinkingTokens !== undefined && { maxThinkingTokens }), ...userProvidedOptions, env: { + ...process.env, ...userProvidedOptions?.env, ...createEnvForGateway(this.gatewayAuthMeta), }, diff --git a/src/tests/acp-agent.test.ts b/src/tests/acp-agent.test.ts index b2e5eafa..ab3897c8 100644 --- a/src/tests/acp-agent.test.ts +++ b/src/tests/acp-agent.test.ts @@ -227,7 +227,7 @@ describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("ACP subprocess integration" sessionId: newSessionResponse.sessionId, }); - expect(client.takeReceivedText()).toBe(""); + expect(client.takeReceivedText()).toBe("Error: No messages to compact"); // Send something await connection.prompt({ diff --git a/src/tests/authorization.test.ts b/src/tests/authorization.test.ts index 256c73dc..91f44ce9 100644 --- a/src/tests/authorization.test.ts +++ b/src/tests/authorization.test.ts @@ -101,12 +101,12 @@ describe("authorization", () => { expect(mockQuery).toHaveBeenCalledWith( expect.objectContaining({ options: expect.objectContaining({ - env: { + env: expect.objectContaining({ ANTHROPIC_AUTH_TOKEN: "", ANTHROPIC_BASE_URL: "https://gateway.example", ANTHROPIC_CUSTOM_HEADERS: "x-api-key: test", userEnv: "userEnv", - }, + }), }), }), ); diff --git a/src/tests/create-session-options.test.ts b/src/tests/create-session-options.test.ts index 4fe8328e..50515a72 100644 --- a/src/tests/create-session-options.test.ts +++ b/src/tests/create-session-options.test.ts @@ -151,6 +151,54 @@ describe("createSession options merging", () => { expect(capturedOptions!.hooks?.PostToolUse).toHaveLength(2); }); + it("inherits HOME and PATH from process.env when no env is provided", async () => { + await agent.newSession({ + cwd: "/test", + mcpServers: [], + }); + + expect(capturedOptions?.env?.HOME).toBe(process.env.HOME); + expect(capturedOptions?.env?.PATH).toBe(process.env.PATH); + }); + + it("merges user-provided env vars on top of process.env", async () => { + await agent.newSession({ + cwd: "/test", + mcpServers: [], + _meta: { + claudeCode: { + options: { + env: { + CUSTOM_VAR: "custom-value", + }, + }, + }, + }, + }); + + expect(capturedOptions?.env?.HOME).toBe(process.env.HOME); + expect(capturedOptions?.env?.PATH).toBe(process.env.PATH); + expect(capturedOptions?.env?.CUSTOM_VAR).toBe("custom-value"); + }); + + it("allows user-provided env vars to override process.env entries", async () => { + await agent.newSession({ + cwd: "/test", + mcpServers: [], + _meta: { + claudeCode: { + options: { + env: { + HOME: "/custom/home", + }, + }, + }, + }, + }); + + expect(capturedOptions?.env?.HOME).toBe("/custom/home"); + }); + it("merges user-provided mcpServers with ACP mcpServers", async () => { await agent.newSession({ cwd: "/test",