CRAFT_CONFIG_DIR 只被部分代码尊重:workspaces / sessions / credentials / logs 仍指向 ~/.craft-agent(CRAFT_CONFIG_DIR only partially honored)
TL;DR (EN):
CRAFT_CONFIG_DIRis documented as relocating the whole config directory, but 15 call sites still hardcode~/.craft-agent— workspaces, sessions,credentials.encand logs ignore the variable, so a second instance with a custom dir silently opens the default workspaces. Fix in #1061.
Craft Agents Version
0.13.3(main @ e8963854 同样复现)
Operating System
macOS (Apple Silicon)
OS Version
macOS 26.4
AI Provider
不相关——问题出在配置目录解析,与 provider 无关
Description
CRAFT_CONFIG_DIR 的设计意图是整体切换配置目录,三处都这么写:
- 官方文档 → Reference → Environment Variables:
CRAFT_CONFIG_DIR— "Override the default configuration directory (~/.craft-agent/)" packages/shared/src/config/paths.tsL4–11:多实例开发靠它 "allowing multiple instances to run simultaneously with separate configurations"scripts/electron-dev.tsL91:编号实例(craft-agents-1)就是通过设置它来隔离到~/.craft-agent-1
实际只有 config/paths.ts 和 agent/permissions-config.ts 读了这个变量,另有 15 处仍然写死 join(homedir(), '.craft-agent'):
| 受影响路径 | 位置 |
|---|---|
workspaces/(连带 sessions/) |
packages/shared/src/workspaces/storage.ts、packages/server-core/src/handlers/rpc/workspace.ts |
credentials.enc |
packages/shared/src/credentials/backends/secure-storage.ts |
docs/、release-notes/、provider-domains.json |
shared/src/docs/index.ts、shared/src/release-notes/index.ts、shared/src/utils/logo.ts |
docs/browser-tools.md(skill 前置读取) |
shared/src/agent/core/prerequisite-manager.ts |
window-state.json、logs/* |
apps/electron/src/main/window-state.ts、logger.ts |
config.json 读取 |
server-core/src/handlers/rpc/auth.ts、shared/src/interceptor-common.ts |
| messaging 状态目录 | apps/electron/src/main/index.ts、packages/server/src/index.ts |
| privileged-actions 审计日志 | server-core/src/services/privileged-execution-broker.ts |
config_validate 会话工具的根目录 |
session-tools-core/src/handlers/config-validate.ts |
结果是:设置了自定义 CRAFT_CONFIG_DIR 的实例会在新目录里生成 config.json、permissions/、themes/ 等,但打开的是默认目录 ~/.craft-agent/ 下的 workspaces、sessions、凭据和日志。两个实例同时运行时,就是两个 SessionManager 在写同一棵 sessions/ 树。
Steps to Reproduce
- 保持已安装的正式版 app 运行(使用默认
~/.craft-agent/) - 在源码目录执行
CRAFT_CONFIG_DIR=$HOME/.craft-agent-dev CRAFT_APP_NAME="Dev" bun run electron:dev - 观察 dev 实例的启动日志和侧边栏
Expected Behavior
dev 实例从空的 ~/.craft-agent-dev/ 启动(onboarding 或新建默认 workspace),完全不碰 ~/.craft-agent/
Actual Behavior
~/.craft-agent-dev/被创建,里面有config.json、docs/、permissions/、themes/……- 但日志输出
Created window for first workspace: <正式版的 workspace 名>和Messaging gateway log path: ~/.craft-agent/logs/messaging-gateway.log - dev 实例直接显示并操作正式版的 workspace 和 sessions
Additional Context
scripts/electron-dev.ts 只在检出目录名以 -<n> 结尾时才设置 CRAFT_CONFIG_DIR,所以大多数人碰不到;一旦手动设置这个变量(例如把 fork 版和已安装的 app 并排跑、或 headless server 想换配置目录)就会触发。
修复见 #1061:所有路径统一走 config/paths.ts 的 CONFIG_DIR(不依赖 shared 的包用同样的 env 回退)。变量未设置时行为不变。
Source: craft-ai-agents/craft-agents-oss