From 46bcd01c49d717c1d40a2e344e63b5c905582caf Mon Sep 17 00:00:00 2001 From: Ronny Date: Sat, 29 Aug 2026 14:58:00 +0200 Subject: [PATCH] fix(core): skip file watcher on filesystem roots --- packages/core/src/filesystem/watcher.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/core/src/filesystem/watcher.ts b/packages/core/src/filesystem/watcher.ts index c5e20631917e..a102c37845b8 100644 --- a/packages/core/src/filesystem/watcher.ts +++ b/packages/core/src/filesystem/watcher.ts @@ -103,10 +103,15 @@ const layer = Layer.effect( ) } + const isRootOrSystemDirectory = (dir: string) => { + const normalized = dir.replace(/\\/g, "/").replace(/\/+$/, "") + return !normalized || /^[a-zA-Z]:$/.test(normalized) || normalized === "/" + } + const config = (yield* (yield* Config.Service).entries()) .filter((entry): entry is Config.Document => entry.type === "document") .flatMap((item) => item.info.watcher?.ignore ?? []) - if (location.vcs && (yield* Flag.OPENCODE_EXPERIMENTAL_FILEWATCHER)) { + if (location.vcs && (yield* Flag.OPENCODE_EXPERIMENTAL_FILEWATCHER) && !isRootOrSystemDirectory(location.directory)) { yield* Effect.forkScoped( subscribe(location.directory, [...Ignore.PATTERNS, ...config, ...protecteds(location.directory)]), ) @@ -115,7 +120,7 @@ const layer = Layer.effect( if (location.vcs?.type === "git") { const resolved = (yield* git.repo.discover(location.directory))?.gitDirectory const vcs = resolved ? yield* fs.realPath(resolved).pipe(Effect.catch(() => Effect.succeed(resolved))) : undefined - if (vcs && !config.includes(".git") && !config.includes(vcs) && (!resolved || !config.includes(resolved))) { + if (vcs && !isRootOrSystemDirectory(vcs) && !config.includes(".git") && !config.includes(vcs) && (!resolved || !config.includes(resolved))) { const ignore = (yield* fs.readDirectoryEntries(vcs).pipe(Effect.catch(() => Effect.succeed([])))).flatMap( (entry) => (entry.name === "HEAD" ? [] : [entry.name]), )