diff --git a/src/renderer/store/utils/pathResolution.ts b/src/renderer/store/utils/pathResolution.ts index 43b58f0f..8984f710 100644 --- a/src/renderer/store/utils/pathResolution.ts +++ b/src/renderer/store/utils/pathResolution.ts @@ -27,6 +27,10 @@ export function resolveFilePath(base: string, relativePath: string): string { cleanRelative = cleanRelative.slice(1); } + if (isAbsolutePath(cleanRelative)) { + return cleanRelative; + } + // Tilde paths (~/) are home-relative absolute paths - pass through as-is // The main process will expand ~ to the actual home directory if (cleanRelative.startsWith('~/') || cleanRelative.startsWith('~\\') || cleanRelative === '~') { diff --git a/src/renderer/utils/claudeMdTracker.ts b/src/renderer/utils/claudeMdTracker.ts index ac045070..661f0e95 100644 --- a/src/renderer/utils/claudeMdTracker.ts +++ b/src/renderer/utils/claudeMdTracker.ts @@ -99,6 +99,9 @@ function joinPaths(base: string, relative: string): string { if (cleanRelative.startsWith('@')) { cleanRelative = cleanRelative.slice(1); } + if (isAbsolutePath(cleanRelative)) { + return cleanRelative; + } // Handle ./ prefix (current directory) if (cleanRelative.startsWith('./') || cleanRelative.startsWith('.\\')) { diff --git a/src/renderer/utils/contextTracker.ts b/src/renderer/utils/contextTracker.ts index ec8ecd8e..e9bd85f9 100644 --- a/src/renderer/utils/contextTracker.ts +++ b/src/renderer/utils/contextTracker.ts @@ -482,6 +482,9 @@ function joinPaths(base: string, relative: string): string { if (cleanRelative.startsWith('@')) { cleanRelative = cleanRelative.slice(1); } + if (isAbsolutePath(cleanRelative)) { + return cleanRelative; + } // Handle ./ prefix (current directory) if (cleanRelative.startsWith('./') || cleanRelative.startsWith('.\\')) { diff --git a/test/renderer/store/pathResolution.test.ts b/test/renderer/store/pathResolution.test.ts index 218390dc..c6331c4b 100644 --- a/test/renderer/store/pathResolution.test.ts +++ b/test/renderer/store/pathResolution.test.ts @@ -41,6 +41,14 @@ describe('resolveFilePath', () => { expect(resolveFilePath('/repo', '@~/some/file.ts')).toBe('~/some/file.ts'); }); + it('passes through @-prefixed absolute paths after stripping the mention marker', () => { + expect(resolveFilePath('/repo', '@/outside/file.ts')).toBe('/outside/file.ts'); + expect(resolveFilePath('C:\\repo', '@C:\\outside\\file.ts')).toBe('C:\\outside\\file.ts'); + expect(resolveFilePath('C:\\repo', '@\\\\server\\share\\file.ts')).toBe( + '\\\\server\\share\\file.ts' + ); + }); + it('passes through bare tilde as-is', () => { expect(resolveFilePath('/repo', '~')).toBe('~'); }); diff --git a/test/renderer/utils/claudeMdTracker.test.ts b/test/renderer/utils/claudeMdTracker.test.ts index 32f2199d..fa1c28b9 100644 --- a/test/renderer/utils/claudeMdTracker.test.ts +++ b/test/renderer/utils/claudeMdTracker.test.ts @@ -195,4 +195,13 @@ describe('extractUserMentionPaths Windows paths', () => { ['~\\.claude\\CLAUDE.md'] ); }); + + it('strips mention markers before preserving absolute mention paths', () => { + expect(extractUserMentionPaths(userGroupWithPath('@C:\\Other\\file.ts'), 'C:\\Repo')).toEqual([ + 'C:\\Other\\file.ts', + ]); + expect( + extractUserMentionPaths(userGroupWithPath('@\\\\server\\share\\file.ts'), 'C:\\Repo') + ).toEqual(['\\\\server\\share\\file.ts']); + }); });