fix: add AGENTS.md and .claude/CLAUDE.md to instruction file cascade

Fixes #3156

The discover_instruction_files() function now searches for:
- AGENTS.md (in each directory)
- .claude/CLAUDE.md (in each directory's .claude subdirectory)

This enables interoperability with:
- AGENTS.md files used by other agent frameworks
- .claude/CLAUDE.md files used by standard Claude Code config

Updated the discovers_instruction_files_from_ancestor_chain test to
verify the new files are discovered in the correct order.
This commit is contained in:
zhih 2026-05-28 12:17:33 -07:00
parent 0800d7ae88
commit c8c1cedaaa
1 changed files with 21 additions and 0 deletions

View File

@ -241,7 +241,9 @@ fn discover_instruction_files(cwd: &Path) -> std::io::Result<Vec<ContextFile>> {
for candidate in [ for candidate in [
dir.join("CLAUDE.md"), dir.join("CLAUDE.md"),
dir.join("CLAUDE.local.md"), dir.join("CLAUDE.local.md"),
dir.join("AGENTS.md"),
dir.join(".claw").join("CLAUDE.md"), dir.join(".claw").join("CLAUDE.md"),
dir.join(".claude").join("CLAUDE.md"),
dir.join(".claw").join("instructions.md"), dir.join(".claw").join("instructions.md"),
] { ] {
push_context_file(&mut files, candidate)?; push_context_file(&mut files, candidate)?;
@ -595,20 +597,35 @@ mod tests {
let root = temp_dir(); let root = temp_dir();
let nested = root.join("apps").join("api"); let nested = root.join("apps").join("api");
fs::create_dir_all(nested.join(".claw")).expect("nested claw dir"); fs::create_dir_all(nested.join(".claw")).expect("nested claw dir");
fs::create_dir_all(nested.join(".claude")).expect("nested claude dir");
fs::write(root.join("CLAUDE.md"), "root instructions").expect("write root instructions"); fs::write(root.join("CLAUDE.md"), "root instructions").expect("write root instructions");
fs::write(root.join("CLAUDE.local.md"), "local instructions") fs::write(root.join("CLAUDE.local.md"), "local instructions")
.expect("write local instructions"); .expect("write local instructions");
fs::write(root.join("AGENTS.md"), "root agents").expect("write root agents");
fs::create_dir_all(root.join("apps")).expect("apps dir"); fs::create_dir_all(root.join("apps")).expect("apps dir");
fs::create_dir_all(root.join("apps").join(".claw")).expect("apps claw dir"); fs::create_dir_all(root.join("apps").join(".claw")).expect("apps claw dir");
fs::create_dir_all(root.join("apps").join(".claude")).expect("apps claude dir");
fs::write(root.join("apps").join("CLAUDE.md"), "apps instructions") fs::write(root.join("apps").join("CLAUDE.md"), "apps instructions")
.expect("write apps instructions"); .expect("write apps instructions");
fs::write(root.join("apps").join("AGENTS.md"), "apps agents")
.expect("write apps agents");
fs::write( fs::write(
root.join("apps").join(".claw").join("instructions.md"), root.join("apps").join(".claw").join("instructions.md"),
"apps dot claude instructions", "apps dot claude instructions",
) )
.expect("write apps dot claude instructions"); .expect("write apps dot claude instructions");
fs::write(
root.join("apps").join(".claude").join("CLAUDE.md"),
"apps claude dir instructions",
)
.expect("write apps claude dir instructions");
fs::write(nested.join(".claw").join("CLAUDE.md"), "nested rules") fs::write(nested.join(".claw").join("CLAUDE.md"), "nested rules")
.expect("write nested rules"); .expect("write nested rules");
fs::write(
nested.join(".claude").join("CLAUDE.md"),
"nested claude dir rules",
)
.expect("write nested claude dir rules");
fs::write( fs::write(
nested.join(".claw").join("instructions.md"), nested.join(".claw").join("instructions.md"),
"nested instructions", "nested instructions",
@ -627,9 +644,13 @@ mod tests {
vec![ vec![
"root instructions", "root instructions",
"local instructions", "local instructions",
"root agents",
"apps instructions", "apps instructions",
"apps agents",
"apps claude dir instructions",
"apps dot claude instructions", "apps dot claude instructions",
"nested rules", "nested rules",
"nested claude dir rules",
"nested instructions" "nested instructions"
] ]
); );