fix: prevent duplicate AGENTS.md injection when reading instruction files (#11581)

Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
This commit is contained in:
YeonGyu-Kim
2026-02-02 04:46:08 +09:00
committed by GitHub
parent eace76e525
commit 16145af480
2 changed files with 31 additions and 6 deletions

View File

@@ -75,7 +75,9 @@ export namespace InstructionPrompt {
for (const file of FILES) { for (const file of FILES) {
const matches = await Filesystem.findUp(file, Instance.directory, Instance.worktree) const matches = await Filesystem.findUp(file, Instance.directory, Instance.worktree)
if (matches.length > 0) { if (matches.length > 0) {
matches.forEach((p) => paths.add(path.resolve(p))) matches.forEach((p) => {
paths.add(path.resolve(p))
})
break break
} }
} }
@@ -103,7 +105,9 @@ export namespace InstructionPrompt {
}), }),
).catch(() => []) ).catch(() => [])
: await resolveRelative(instruction) : await resolveRelative(instruction)
matches.forEach((p) => paths.add(path.resolve(p))) matches.forEach((p) => {
paths.add(path.resolve(p))
})
} }
} }
@@ -168,12 +172,14 @@ export namespace InstructionPrompt {
const already = loaded(messages) const already = loaded(messages)
const results: { filepath: string; content: string }[] = [] const results: { filepath: string; content: string }[] = []
let current = path.dirname(path.resolve(filepath)) const target = path.resolve(filepath)
let current = path.dirname(target)
const root = path.resolve(Instance.directory) const root = path.resolve(Instance.directory)
while (current.startsWith(root)) { while (current.startsWith(root) && current !== root) {
const found = await find(current) const found = await find(current)
if (found && !system.has(found) && !already.has(found) && !isClaimed(messageID, found)) {
if (found && found !== target && !system.has(found) && !already.has(found) && !isClaimed(messageID, found)) {
claim(messageID, found) claim(messageID, found)
const content = await Bun.file(found) const content = await Bun.file(found)
.text() .text()
@@ -182,7 +188,6 @@ export namespace InstructionPrompt {
results.push({ filepath: found, content: "Instructions from: " + found + "\n" + content }) results.push({ filepath: found, content: "Instructions from: " + found + "\n" + content })
} }
} }
if (current === root) break
current = path.dirname(current) current = path.dirname(current)
} }

View File

@@ -47,4 +47,24 @@ describe("InstructionPrompt.resolve", () => {
}, },
}) })
}) })
test("doesn't reload AGENTS.md when reading it directly", async () => {
await using tmp = await tmpdir({
init: async (dir) => {
await Bun.write(path.join(dir, "subdir", "AGENTS.md"), "# Subdir Instructions")
await Bun.write(path.join(dir, "subdir", "nested", "file.ts"), "const x = 1")
},
})
await Instance.provide({
directory: tmp.path,
fn: async () => {
const filepath = path.join(tmp.path, "subdir", "AGENTS.md")
const system = await InstructionPrompt.systemPaths()
expect(system.has(filepath)).toBe(false)
const results = await InstructionPrompt.resolve([], filepath, "test-message-2")
expect(results).toEqual([])
},
})
})
}) })