From ea13f9a575ea33bb18b9f1e301e149f762089133 Mon Sep 17 00:00:00 2001 From: catlog22 Date: Mon, 19 Jan 2026 11:28:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(config):=20=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=B1=A1=E6=9F=93=E7=94=A8=E6=88=B7=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E6=94=AF=E6=8C=81=20CCW=5F?= =?UTF-8?q?DATA=5FDIR=20=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改内容: - getGlobalConfigPath() 和 getGlobalSettingsPath() 现在尊重 CCW_DATA_DIR 环境变量 - ensureClaudeCliTools()、saveClaudeCliTools()、saveClaudeCliSettings() 同步更新 - 测试现在使用独立的临时目录,不会修改用户的生产配置文件 ~/.claude/cli-tools.json 修复问题: - 集成测试会修改用户的 gemini primaryModel 为 test-model - 导致后续 Codex CLI 执行时读取到错误的配置 验证: - 所有集成测试通过 (4/4) - 用户配置保持不变 - 生产环境默认行为不受影响 --- ccw/src/tools/claude-cli-tools.ts | 42 ++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/ccw/src/tools/claude-cli-tools.ts b/ccw/src/tools/claude-cli-tools.ts index b8776ac9..6033447d 100644 --- a/ccw/src/tools/claude-cli-tools.ts +++ b/ccw/src/tools/claude-cli-tools.ts @@ -212,11 +212,19 @@ function getProjectSettingsPath(projectDir: string): string { } function getGlobalConfigPath(): string { - return path.join(os.homedir(), '.claude', 'cli-tools.json'); + // Support CCW_DATA_DIR for test isolation + const claudeHome = process.env.CCW_DATA_DIR + ? path.join(process.env.CCW_DATA_DIR, '.claude') + : path.join(os.homedir(), '.claude'); + return path.join(claudeHome, 'cli-tools.json'); } function getGlobalSettingsPath(): string { - return path.join(os.homedir(), '.claude', 'cli-settings.json'); + // Support CCW_DATA_DIR for test isolation + const claudeHome = process.env.CCW_DATA_DIR + ? path.join(process.env.CCW_DATA_DIR, '.claude') + : path.join(os.homedir(), '.claude'); + return path.join(claudeHome, 'cli-settings.json'); } /** @@ -391,10 +399,12 @@ export function ensureClaudeCliTools(projectDir: string, createInProject: boolea const defaultConfig: ClaudeCliToolsConfig = { ...DEFAULT_TOOLS_CONFIG }; - // Always create in global directory (user-level config) - const globalDir = path.join(os.homedir(), '.claude'); - if (!fs.existsSync(globalDir)) { - fs.mkdirSync(globalDir, { recursive: true }); + // Always create in global directory (user-level config), respecting CCW_DATA_DIR + const claudeHome = process.env.CCW_DATA_DIR + ? path.join(process.env.CCW_DATA_DIR, '.claude') + : path.join(os.homedir(), '.claude'); + if (!fs.existsSync(claudeHome)) { + fs.mkdirSync(claudeHome, { recursive: true }); } const globalPath = getGlobalConfigPath(); try { @@ -471,10 +481,12 @@ export function loadClaudeCliTools(projectDir: string): ClaudeCliToolsConfig & { export function saveClaudeCliTools(projectDir: string, config: ClaudeCliToolsConfig & { _source?: string }): void { const { _source, ...configToSave } = config; - // Always save to global directory - const globalDir = path.join(os.homedir(), '.claude'); - if (!fs.existsSync(globalDir)) { - fs.mkdirSync(globalDir, { recursive: true }); + // Always save to global directory, respecting CCW_DATA_DIR + const claudeHome = process.env.CCW_DATA_DIR + ? path.join(process.env.CCW_DATA_DIR, '.claude') + : path.join(os.homedir(), '.claude'); + if (!fs.existsSync(claudeHome)) { + fs.mkdirSync(claudeHome, { recursive: true }); } const configPath = getGlobalConfigPath(); @@ -531,10 +543,12 @@ export function loadClaudeCliSettings(projectDir: string): ClaudeCliSettingsConf export function saveClaudeCliSettings(projectDir: string, config: ClaudeCliSettingsConfig & { _source?: string }): void { const { _source, ...configToSave } = config; - // Always save to global directory - const globalDir = path.join(os.homedir(), '.claude'); - if (!fs.existsSync(globalDir)) { - fs.mkdirSync(globalDir, { recursive: true }); + // Always save to global directory, respecting CCW_DATA_DIR + const claudeHome = process.env.CCW_DATA_DIR + ? path.join(process.env.CCW_DATA_DIR, '.claude') + : path.join(os.homedir(), '.claude'); + if (!fs.existsSync(claudeHome)) { + fs.mkdirSync(claudeHome, { recursive: true }); } const settingsPath = getGlobalSettingsPath();