diff --git a/src/main/claude-accounts/claude-profile-installed-router.ts b/src/main/claude-accounts/claude-profile-installed-router.ts index 83dd26159d1..58b129a2fb1 100644 --- a/src/main/claude-accounts/claude-profile-installed-router.ts +++ b/src/main/claude-accounts/claude-profile-installed-router.ts @@ -54,7 +54,9 @@ export function withClaudeProfileTerminalEnv return profileEnv ? { ...env, ...profileEnv } : env } -/** Include account history only where setup could not link it into System default. */ +/** Account homes plus the user's CLAUDE_CONFIG_DIR, which a Dock launch only learns from the login shell. */ export function claudeProfileHistoryDirs(surface: 'projects' | 'transcripts'): string[] { - return (installed?.accountHomes() ?? []).map((home) => join(home, surface)).filter(isDirectory) + const userConfigDir = installed?.userConfigDir() + const homes = [...(userConfigDir ? [userConfigDir] : []), ...(installed?.accountHomes() ?? [])] + return homes.map((home) => join(home, surface)).filter(isDirectory) } diff --git a/src/main/claude-accounts/claude-profile-router.test.ts b/src/main/claude-accounts/claude-profile-router.test.ts index c7c4cc8e9f4..6f1fec2d4cd 100644 --- a/src/main/claude-accounts/claude-profile-router.test.ts +++ b/src/main/claude-accounts/claude-profile-router.test.ts @@ -547,4 +547,12 @@ describe('ClaudeProfileRouter', () => { expect(claudeProfileHistoryDirs('projects')).toEqual([join(f.home('a'), 'projects')]) } ) + + it('lists history under the CLAUDE_CONFIG_DIR only the login shell exports', () => { + const configDir = join(tmpdir(), `claude-router-own-${process.pid}`) + roots.push(configDir) + mkdirSync(join(configDir, 'projects'), { recursive: true }) + installClaudeProfileRouter(fixture({ CLAUDE_CONFIG_DIR: configDir }).router) + expect(claudeProfileHistoryDirs('projects')).toEqual([join(configDir, 'projects')]) + }) }) diff --git a/src/main/claude-usage/transcript-file-discovery.ts b/src/main/claude-usage/transcript-file-discovery.ts index 90d48411114..c534b058bcc 100644 --- a/src/main/claude-usage/transcript-file-discovery.ts +++ b/src/main/claude-usage/transcript-file-discovery.ts @@ -45,7 +45,7 @@ export function claudeProfileTranscriptDirs(): string[] { export async function listClaudeTranscriptFiles( profileDirs = claudeProfileTranscriptDirs() ): Promise { - const roots = [CLAUDE_PROJECTS_DIR, CLAUDE_TRANSCRIPTS_DIR, ...profileDirs] - const files = await Promise.all(roots.map((root) => walkJsonlFiles(root))) + const roots = new Set([CLAUDE_PROJECTS_DIR, CLAUDE_TRANSCRIPTS_DIR, ...profileDirs]) + const files = await Promise.all([...roots].map((root) => walkJsonlFiles(root))) return [...new Set(files.flat())].sort() } diff --git a/src/main/worktree-retirement-discovery.ts b/src/main/worktree-retirement-discovery.ts index 3aef34cdced..fe0f06145fd 100644 --- a/src/main/worktree-retirement-discovery.ts +++ b/src/main/worktree-retirement-discovery.ts @@ -116,10 +116,10 @@ async function claudeProjectsSources(args: { let complete = true const hostParents = encodeParents(args.workspaceRoots) if (hostParents.length > 0) { - for (const projectsDir of [ + for (const projectsDir of new Set([ getClaudeProjectsDir(args.home ?? homedir(), args.env ?? process.env), ...claudeProfileHistoryDirs('projects') - ]) { + ])) { sources.push({ projectsDir, encodedParents: hostParents }) } }