From 83b7039422b853f4eeb21427707b5691f6f4af20 Mon Sep 17 00:00:00 2001 From: betegon Date: Tue, 11 Aug 2026 09:24:53 +0200 Subject: [PATCH] fix(init): surface directory read errors --- packages/cli/src/lib/init/tools/list-dir.ts | 12 +++--------- .../test/lib/init/tools/filesystem-tools.test.ts | 15 +++++++++++++++ packages/cli/test/lib/init/tools/list-dir.test.ts | 11 ++++------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/packages/cli/src/lib/init/tools/list-dir.ts b/packages/cli/src/lib/init/tools/list-dir.ts index a79ec475e..957c8cb98 100644 --- a/packages/cli/src/lib/init/tools/list-dir.ts +++ b/packages/cli/src/lib/init/tools/list-dir.ts @@ -72,14 +72,6 @@ type WalkState = { truncated: boolean; }; -async function readDirEntries(dir: string): Promise { - try { - return await fs.promises.readdir(dir, { withFileTypes: true }); - } catch { - return []; - } -} - function omissionReason( entry: fs.Dirent, state: WalkState, @@ -147,7 +139,9 @@ async function walkDirectory( return; } - for (const entry of await readDirEntries(dir)) { + for (const entry of await fs.promises.readdir(dir, { + withFileTypes: true, + })) { if (state.entries.length >= state.maxEntries) { state.truncated = true; return; diff --git a/packages/cli/test/lib/init/tools/filesystem-tools.test.ts b/packages/cli/test/lib/init/tools/filesystem-tools.test.ts index eba414474..cfc3e0f71 100644 --- a/packages/cli/test/lib/init/tools/filesystem-tools.test.ts +++ b/packages/cli/test/lib/init/tools/filesystem-tools.test.ts @@ -49,6 +49,21 @@ describe("filesystem tools", () => { expect(result.error).toContain("outside project directory"); }); + test("returns a failed tool result when a directory cannot be read", async () => { + const result = await executeTool( + { + type: "tool", + operation: "list-dir", + cwd: testDir, + params: { path: "does-not-exist" }, + }, + makeContext(testDir) + ); + + expect(result.ok).toBe(false); + expect(result.error).toContain("ENOENT"); + }); + test("lists and precomputes directory contents", async () => { fs.writeFileSync(path.join(testDir, "index.ts"), "export {};\n"); fs.mkdirSync(path.join(testDir, "src")); diff --git a/packages/cli/test/lib/init/tools/list-dir.test.ts b/packages/cli/test/lib/init/tools/list-dir.test.ts index e59bda84f..9c2754e3e 100644 --- a/packages/cli/test/lib/init/tools/list-dir.test.ts +++ b/packages/cli/test/lib/init/tools/list-dir.test.ts @@ -327,12 +327,9 @@ describe("listDir", () => { } }); - test("returns empty entries for a missing subpath", async () => { - // `safePath` allows nonexistent paths under the sandbox; `readdir` - // throws, which the walker swallows. - const entries = entriesOf( - await listDir(makePayload(testDir, { path: "does-not-exist" })) - ); - expect(entries).toEqual([]); + test("surfaces readdir errors for a missing subpath", async () => { + await expect( + listDir(makePayload(testDir, { path: "does-not-exist" })) + ).rejects.toMatchObject({ code: "ENOENT" }); }); });