fix(watcher): exclude ignored dirs before watching to prevent inotify exhaustion (#276)
The file watcher registered a recursive watch over the entire project (node_modules, build output, caches included) and filtered only in the callback — exhausting the Linux inotify budget on large repos (#276). It now uses chokidar and excludes the same directories the indexer ignores (built-in default-ignore set + the project .gitignore) BEFORE registering a watch, so the watch count on a 900-dir node_modules drops from ~1200 to ~14 even with no .gitignore. Stacks with the shared daemon (#411): one watcher across agents, now small. Also hardens the #411 daemon lockfile against a concurrent-startup race the new watcher timing made reproducible — the lock is now created atomically with its content (temp-write + hard-link), so racing daemons can never both win. Validated on macOS, Linux (Docker), and Windows (chokidar + fs.linkSync on NTFS). Co-Authored-By: Colby McHenry <me@colbymchenry.com> Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Colby McHenry
Claude Opus 4.7
parent
995da54430
commit
b09b23cf54
@@ -166,7 +166,7 @@ const DEFAULT_IGNORE_PATTERNS: string[] = [
|
||||
* the defaults apply to tracked files too (committing a dependency dir doesn't make
|
||||
* it project code; the explicit `.gitignore` negation is the only opt-in).
|
||||
*/
|
||||
function buildDefaultIgnore(rootDir: string): Ignore {
|
||||
export function buildDefaultIgnore(rootDir: string): Ignore {
|
||||
const ig = ignore().add(DEFAULT_IGNORE_PATTERNS);
|
||||
try {
|
||||
const rootGitignore = path.join(rootDir, '.gitignore');
|
||||
|
||||
Reference in New Issue
Block a user