2.4 KiB
解决 Claude CLI 在 IDEA 插件中写入 /tmp 的问题
在 IDE 插件中调用 claude-code CLI 时,模型经常会把 Write/Edit 等工具的 file_path 指向 /tmp/xxx。如果直接将 CLI 入口点切换到 claude-vscode,虽然会沿用 VSCode 的“工作区信任”策略,但也会强制要求通过 /login 获取官方凭证,并且只支持官方 https://api.anthropic.com。对于使用自建网关或手动配置 ANTHROPIC_API_KEY 的场景,这条路不可行。
最终有效的方案有两部分:
1. 使用 sdk-ts 入口点并注入自有 API 凭证
-
在
claude-bridge/channel-manager.js中把入口点固定为sdk-ts:process.env.CLAUDE_CODE_ENTRYPOINT = "sdk-ts"; -
调用 CLI 前,从
~/.claude/settings.json或环境变量读取ANTHROPIC_AUTH_TOKEN / ANTHROPIC_BASE_URL,写入process.env。这样 CLI 就不会提示/login,自建 API 也能正常工作。 -
仍然可以保留现有的
cwd/TMPDIR设置与additionalDirectories,便于调试和记录日志,但不再依赖WorkspaceTrustManager自动改写settings.json。
2. 在 permission-handler 中重写工具的写入路径
-
在
claude-bridge/permission-handler.js的canUseTool里增加一段重写逻辑:当检测到工具输入中出现file_path且指向/tmp、/var/tmp等临时目录时,自动改写为当前工作区根 (IDEA_PROJECT_PATH或PROJECT_PATH) 下的同名文件。rewriteToolInputPaths(toolName, input); -
rewriteToolInputPaths会递归检查input,遇到/tmp/foo.js这类路径时将其换成path.join(workdir, "foo.js"),并在日志中打印所有改写记录,方便验证。 -
由于这一步发生在 CLI 真正执行工具之前,Claude 即使仍然生成
/tmp/...也会被我们拦下,从而保证所有写入都落在项目目录内。
3. 验证方式
- 在 IDE 中触发“创建文件”之类的工作流。
- 观察插件日志,确认:
CLAUDE_CODE_ENTRYPOINT为sdk-ts;permission-handler输出了[PERMISSION] Rewrote paths ...,说明临时路径被成功改写;- CLI
tool_use日志中仍可能出现/tmp/...,但实际执行时使用的则是被改写后的路径。
通过这套方案,可以继续使用自管的 API/网关,并根除 CLI 在 IDEA 环境下写入 /tmp 的问题,同时避免依赖 VSCode 专用的认证流程。