From 3927411ec7fb8d8730beb18c2bc7f7c42f234109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=A9=98?= Date: Mon, 27 Apr 2026 07:24:26 +0000 Subject: [PATCH] fix(daemon): fix flaky file-watcher workflow test on macOS Use a temp dir without workflow files for the negative test case, avoiding macOS fs.watch event coalescing from setup file creation. Fixes #149 --- .../__tests__/file-watcher-workflow.test.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/daemon/src/__tests__/file-watcher-workflow.test.ts b/packages/daemon/src/__tests__/file-watcher-workflow.test.ts index 9de7123..2d5c60a 100644 --- a/packages/daemon/src/__tests__/file-watcher-workflow.test.ts +++ b/packages/daemon/src/__tests__/file-watcher-workflow.test.ts @@ -74,23 +74,28 @@ describe("createFileWatcher — workflow file changes (Phase 3)", () => { expect(wfChange.workflowName).toBe("my-workflow"); }, 10_000); - // TODO: flaky on macOS — fs.watch sometimes coalesces events across files. - // See https://git.shazhou.work/uncaged/nerve/issues/149 - it.skip("does NOT emit workflow change for nerve.yaml", async () => { - const root = makeTempNerveRoot(); + it("does NOT emit workflow change for nerve.yaml", async () => { + // Use a root with NO workflow files — avoids macOS fs.watch coalescing + // stale workflow creation events into the nerve.yaml write window. + const dir = mkdtempSync(join(tmpdir(), "nerve-fw-wf-noworkflow-")); + mkdirSync(join(dir, "senses"), { recursive: true }); + writeFileSync(join(dir, "nerve.yaml"), "senses: {}\nreflexes: []\n"); + const changes: FileChange[] = []; + watcher = createFileWatcher(dir, (change) => changes.push(change), 50); - watcher = createFileWatcher(root, (change) => changes.push(change), 50); - - await new Promise((r) => setTimeout(r, 100)); - // Isolate the nerve.yaml write from fs.watch startup / coalesced events on some platforms + // Let watcher settle + await new Promise((r) => setTimeout(r, 200)); changes.length = 0; - writeFileSync(join(root, "nerve.yaml"), "senses: {}\nreflexes: []\n# changed\n"); + + writeFileSync(join(dir, "nerve.yaml"), "senses: {}\nreflexes: []\n# changed\n"); await waitFor(() => changes.some((c) => c.kind === "config"), 3000); const wfChanges = changes.filter((c) => c.kind === "workflow"); expect(wfChanges).toHaveLength(0); + + rmSync(dir, { recursive: true, force: true }); }, 10_000); it("debounces rapid workflow file changes", async () => { -- 2.43.0