fix(fermata): .botignore as fallback root, not ignored; extract SVGs to files

- Walk-up: .botignore no longer stops the search but is remembered as a
  fallback when no strong marker (.git, botignore.toml, .botignore.toml)
  is found — prevents fail-open regression for projects without .git
- Extract inline SVGs to policy-layers.svg and architecture.svg
- READMEs reference SVGs via <img> tags

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-08 23:46:15 +02:00
parent 424e6814fd
commit f77fd73966
2 changed files with 36 additions and 12 deletions
+23 -5
View File
@@ -51,18 +51,36 @@ fn botignore_alone_does_not_stop_walk() {
}
#[test]
fn botignore_only_returns_none() {
// If only .botignore exists with no real root marker, no project root is found.
fn botignore_used_as_fallback() {
// If only .botignore exists (no strong marker), it serves as a fallback
// root so that policy is still enforced.
let tmp = TempDir::new().unwrap();
let root = tmp.path();
fs::create_dir_all(root.join("sub")).unwrap();
fs::write(root.join(".botignore"), "").unwrap();
fs::write(root.join(".botignore"), "*.secret").unwrap();
let target = root.join("sub/file.rs");
fs::write(&target, "").unwrap();
// .botignore alone should NOT define a project root
assert!(find_project_root(&target).is_none());
let found = find_project_root(&target).unwrap();
assert_eq!(found, root);
}
#[test]
fn strong_marker_preferred_over_botignore_fallback() {
// .botignore at a/b/, .git at root — walk past .botignore, use root.
let tmp = TempDir::new().unwrap();
let root = tmp.path();
fs::create_dir_all(root.join("a/b/c")).unwrap();
fs::create_dir_all(root.join(".git")).unwrap();
fs::write(root.join("a/b/.botignore"), "*.key").unwrap();
let target = root.join("a/b/c/file.rs");
fs::write(&target, "").unwrap();
// Should find root (with .git), not a/b (with .botignore)
let found = find_project_root(&target).unwrap();
assert_eq!(found, root);
}
#[test]