diff --git a/src/claude_code_sdk/_internal/transport/subprocess_cli.py b/src/claude_code_sdk/_internal/transport/subprocess_cli.py index 8e990b1..6a5b95a 100644 --- a/src/claude_code_sdk/_internal/transport/subprocess_cli.py +++ b/src/claude_code_sdk/_internal/transport/subprocess_cli.py @@ -201,6 +201,7 @@ class SubprocessCLITransport(Transport): stderr=stderr_dest, cwd=self._cwd, env=process_env, + user=self._options.user, ) if self._process.stdout: diff --git a/src/claude_code_sdk/types.py b/src/claude_code_sdk/types.py index d63f6ea..14be39d 100644 --- a/src/claude_code_sdk/types.py +++ b/src/claude_code_sdk/types.py @@ -298,6 +298,8 @@ class ClaudeCodeOptions: # Hook configurations hooks: dict[HookEvent, list[HookMatcher]] | None = None + user: str | None = None + # SDK Control Protocol class SDKControlInterruptRequest(TypedDict): diff --git a/tests/test_transport.py b/tests/test_transport.py index 50e093c..51c7511 100644 --- a/tests/test_transport.py +++ b/tests/test_transport.py @@ -352,3 +352,41 @@ class TestSubprocessCLITransport: assert env_passed["PATH"] == os.environ["PATH"] anyio.run(_test) + + def test_connect_as_different_user(self): + """Test connect as different user.""" + + async def _test(): + custom_user = "claude" + options = ClaudeCodeOptions(user=custom_user) + + # Mock the subprocess to capture the env argument + with patch( + "anyio.open_process", new_callable=AsyncMock + ) as mock_open_process: + mock_process = MagicMock() + mock_process.stdout = MagicMock() + mock_stdin = MagicMock() + mock_stdin.aclose = AsyncMock() # Add async aclose method + mock_process.stdin = mock_stdin + mock_process.returncode = None + mock_open_process.return_value = mock_process + + transport = SubprocessCLITransport( + prompt="test", + options=options, + cli_path="/usr/bin/claude", + ) + + await transport.connect() + + # Verify open_process was called with correct user + mock_open_process.assert_called_once() + call_kwargs = mock_open_process.call_args.kwargs + assert "user" in call_kwargs + user_passed = call_kwargs["user"] + + # Check that user was passed + assert user_passed == "claude" + + anyio.run(_test)