fix: prevent duplicate AGENTS.md injection when reading instruction files (#11581)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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([])
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user