diff --git a/packages/coding-agent/src/core/resource-loader.ts b/packages/coding-agent/src/core/resource-loader.ts index c8b6e2c21..6632315ed 100644 --- a/packages/coding-agent/src/core/resource-loader.ts +++ b/packages/coding-agent/src/core/resource-loader.ts @@ -70,6 +70,9 @@ function loadContextFileFromDir(dir: string): { path: string; content: string } const filePath = join(dir, filename); if (existsSync(filePath)) { try { + if (!statSync(filePath).isFile()) { + continue; + } return { path: filePath, content: readFileSync(filePath, "utf-8"), diff --git a/packages/coding-agent/test/resource-loader.test.ts b/packages/coding-agent/test/resource-loader.test.ts index e458ec7bd..9989ab1ce 100644 --- a/packages/coding-agent/test/resource-loader.test.ts +++ b/packages/coding-agent/test/resource-loader.test.ts @@ -2,7 +2,7 @@ import { mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "nod import { tmpdir } from "node:os"; import { join } from "node:path"; import { pathToFileURL } from "node:url"; -import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { AuthStorage } from "../src/core/auth-storage.ts"; import { ExtensionRunner } from "../src/core/extensions/runner.ts"; import { DefaultResourceLoader } from "../src/core/resource-loader.ts"; @@ -355,6 +355,22 @@ Content`, expect(agentsFiles.some((f) => f.path.includes("AGENTS.md"))).toBe(true); }); + it("should ignore context file candidates that are directories", async () => { + mkdirSync(join(cwd, "AGENTS.md")); + writeFileSync(join(cwd, "CLAUDE.md"), "Fallback instructions"); + const consoleError = vi.spyOn(console, "error").mockImplementation(() => {}); + + const loader = new DefaultResourceLoader({ cwd, agentDir }); + await loader.reload(); + + expect(loader.getAgentsFiles().agentsFiles).toContainEqual({ + path: join(cwd, "CLAUDE.md"), + content: "Fallback instructions", + }); + expect(consoleError).not.toHaveBeenCalledWith(expect.stringContaining(join(cwd, "AGENTS.md"))); + consoleError.mockRestore(); + }); + it("should skip AGENTS.md and CLAUDE.md discovery when noContextFiles is true", async () => { writeFileSync(join(cwd, "AGENTS.md"), "# Project Guidelines\n\nBe helpful."); writeFileSync(join(cwd, "CLAUDE.md"), "# Claude Guidelines\n\nBe helpful.");