/** * Build a directory tree structure from CLAUDE.md injections. */import type { TreeNode } from './types';import type { ClaudeMdContextInjection } from '@renderer/types/contextInjection';/** * Build a tree structure from a list of directory CLAUDE.md injections. */export function buildDirectoryTree( injections: ClaudeMdContextInjection[], projectRoot: string): TreeNode { const root: TreeNode = { name: '', path: '', isFile: false, children: new Map() }; for (const injection of injections) { let relativePath = injection.path; if (projectRoot && relativePath.startsWith(projectRoot)) { relativePath = relativePath.slice(projectRoot.length); if (relativePath.startsWith('/') || relativePath.startsWith('\\')) relativePath = relativePath.slice(1); } const parts = relativePath.split(/[\\/]/); let current = root; for (let i = 0; i < parts.length; i++) { const part = parts[i]; const isLast = i === parts.length - 1; if (!current.children.has(part)) { current.children.set(part, { name: part, path: isLast ? injection.path : '', isFile: isLast && part === 'CLAUDE.md', tokens: isLast ? injection.estimatedTokens : undefined, firstSeenInGroup: isLast ? injection.firstSeenInGroup : undefined, children: new Map(), }); } current = current.children.get(part)!; } } return root;}
/**
* Build a directory tree structure from CLAUDE.md injections.
*/
import type { TreeNode } from './types';
import type { ClaudeMdContextInjection } from '@renderer/types/contextInjection';
/**
* Build a tree structure from a list of directory CLAUDE.md injections.
*/
export function buildDirectoryTree(
injections: ClaudeMdContextInjection[],
projectRoot: string
): TreeNode {
const root: TreeNode = { name: '', path: '', isFile: false, children: new Map() };
for (const injection of injections) {
let relativePath = injection.path;
if (projectRoot && relativePath.startsWith(projectRoot)) {
relativePath = relativePath.slice(projectRoot.length);
if (relativePath.startsWith('/') || relativePath.startsWith('\\'))
relativePath = relativePath.slice(1);
}
const parts = relativePath.split(/[\\/]/);
let current = root;
for (let i = 0; i < parts.length; i++) {
const part = parts[i];
const isLast = i === parts.length - 1;
if (!current.children.has(part)) {
current.children.set(part, {
name: part,
path: isLast ? injection.path : '',
isFile: isLast && part === 'CLAUDE.md',
tokens: isLast ? injection.estimatedTokens : undefined,
firstSeenInGroup: isLast ? injection.firstSeenInGroup : undefined,
children: new Map(),
});
}
current = current.children.get(part)!;
}
}
return root;
}