/** * Root finder — nearest ancestor containing a marker file, bounded at cwd. */ export async function findRoot( startDir: string, cwd: string, markers: readonly string[], exists: (path: string) => Promise, ): Promise { const normalizedStart = normalizePath(startDir); const normalizedCwd = normalizePath(cwd); let current = normalizedStart; while (true) { for (const marker of markers) { const markerPath = current === "/" ? `/${marker}` : `${current}/${marker}`; if (await exists(markerPath)) { return current; } } if (current === normalizedCwd || current === "/") { return normalizedCwd; } const parent = getParent(current); if (parent === current) return normalizedCwd; current = parent; } } function normalizePath(p: string): string { let normalized = p.replace(/\\/g, "/"); if (normalized.length > 1 && normalized.endsWith("/")) { normalized = normalized.slice(0, -1); } return normalized || "/"; } function getParent(p: string): string { if (p === "/") return "/"; const lastSlash = p.lastIndexOf("/"); if (lastSlash <= 0) return "/"; return p.slice(0, lastSlash) || "/"; }