v2.5.0 (#495)
Co-authored-by: Quentin Torroba <quentin.torroba@mistral.ai> Co-authored-by: Clement Sirieix <clem.sirieix@gmail.com> Co-authored-by: Kim-Adeline Miguel <kimadeline.miguel@mistral.ai> Co-authored-by: Simon Van de Kerckhove <simon.vandekerckhove@mistral.ai> Co-authored-by: Vincent Guilloux <vincent.guilloux@mistral.ai> Co-authored-by: Michel Thomazo <michel.thomazo@mistral.ai> Co-authored-by: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
parent
9421fbc08e
commit
5103019b01
104 changed files with 7277 additions and 691 deletions
|
|
@ -237,6 +237,236 @@ class TestUserAgentsDirs:
|
|||
assert mgr.user_agents_dirs == [agents_dir]
|
||||
|
||||
|
||||
class TestLoadProjectDocs:
|
||||
def test_returns_empty_when_project_not_in_sources(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
mgr = HarnessFilesManager(sources=("user",))
|
||||
assert mgr.load_project_docs() == []
|
||||
|
||||
def test_returns_empty_when_not_trusted(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: False)
|
||||
(tmp_path / "AGENTS.md").write_text("# Hello", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.load_project_docs() == []
|
||||
|
||||
def test_returns_single_doc_when_trust_root_is_cwd(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
monkeypatch.setattr(
|
||||
trusted_folders_manager, "find_trust_root", lambda _: tmp_path.resolve()
|
||||
)
|
||||
(tmp_path / "AGENTS.md").write_text("# Root doc", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.load_project_docs()
|
||||
assert len(docs) == 1
|
||||
assert docs[0] == (tmp_path.resolve(), "# Root doc")
|
||||
|
||||
def test_walks_up_to_trust_root(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
child = tmp_path / "sub" / "deep"
|
||||
child.mkdir(parents=True)
|
||||
monkeypatch.chdir(child)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
monkeypatch.setattr(
|
||||
trusted_folders_manager, "find_trust_root", lambda _: tmp_path.resolve()
|
||||
)
|
||||
(tmp_path / "AGENTS.md").write_text("# Root", encoding="utf-8")
|
||||
(child / "AGENTS.md").write_text("# Child", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.load_project_docs()
|
||||
# outermost first
|
||||
assert docs[0] == (tmp_path.resolve(), "# Root")
|
||||
assert docs[-1] == (child.resolve(), "# Child")
|
||||
|
||||
def test_skips_dirs_without_agents_md(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
child = tmp_path / "sub" / "deep"
|
||||
child.mkdir(parents=True)
|
||||
monkeypatch.chdir(child)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
monkeypatch.setattr(
|
||||
trusted_folders_manager, "find_trust_root", lambda _: tmp_path.resolve()
|
||||
)
|
||||
# Only root has AGENTS.md, intermediate "sub" does not
|
||||
(tmp_path / "AGENTS.md").write_text("# Root", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.load_project_docs()
|
||||
assert len(docs) == 1
|
||||
assert docs[0] == (tmp_path.resolve(), "# Root")
|
||||
|
||||
def test_stops_at_trust_root_boundary(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
trust_root = tmp_path / "root"
|
||||
child = trust_root / "sub"
|
||||
child.mkdir(parents=True)
|
||||
monkeypatch.chdir(child)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
monkeypatch.setattr(
|
||||
trusted_folders_manager, "find_trust_root", lambda _: trust_root.resolve()
|
||||
)
|
||||
# Place AGENTS.md above trust root — should NOT be loaded
|
||||
(tmp_path / "AGENTS.md").write_text("# Above root", encoding="utf-8")
|
||||
(trust_root / "AGENTS.md").write_text("# At root", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.load_project_docs()
|
||||
assert len(docs) == 1
|
||||
assert docs[0][0] == trust_root.resolve()
|
||||
|
||||
def test_returns_empty_when_trust_root_not_ancestor(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
child = tmp_path / "project" / "sub"
|
||||
child.mkdir(parents=True)
|
||||
trust_root = tmp_path / "other-root"
|
||||
trust_root.mkdir()
|
||||
monkeypatch.chdir(child)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
monkeypatch.setattr(
|
||||
trusted_folders_manager, "find_trust_root", lambda _: trust_root.resolve()
|
||||
)
|
||||
(tmp_path / "AGENTS.md").write_text("# Outside", encoding="utf-8")
|
||||
(child / "AGENTS.md").write_text("# Child", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.load_project_docs() == []
|
||||
|
||||
def test_ignores_empty_agents_md(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
monkeypatch.setattr(
|
||||
trusted_folders_manager, "find_trust_root", lambda _: tmp_path.resolve()
|
||||
)
|
||||
(tmp_path / "AGENTS.md").write_text(" \n ", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.load_project_docs() == []
|
||||
|
||||
|
||||
class TestFindSubdirectoryAgentsMd:
|
||||
def test_returns_empty_when_project_not_in_sources(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
sub = tmp_path / "sub"
|
||||
sub.mkdir()
|
||||
(sub / "AGENTS.md").write_text("# Sub", encoding="utf-8")
|
||||
target = sub / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user",))
|
||||
assert mgr.find_subdirectory_agents_md(target) == []
|
||||
|
||||
def test_returns_empty_when_not_trusted(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "find_trust_root", lambda _: None)
|
||||
sub = tmp_path / "sub"
|
||||
sub.mkdir()
|
||||
(sub / "AGENTS.md").write_text("# Sub", encoding="utf-8")
|
||||
target = sub / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.find_subdirectory_agents_md(target) == []
|
||||
|
||||
def test_returns_empty_when_file_outside_cwd(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
cwd = tmp_path / "project"
|
||||
cwd.mkdir()
|
||||
monkeypatch.chdir(cwd)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
outside = tmp_path / "other" / "file.py"
|
||||
outside.parent.mkdir(parents=True)
|
||||
outside.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.find_subdirectory_agents_md(outside) == []
|
||||
|
||||
def test_returns_empty_when_file_directly_in_cwd(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
(tmp_path / "AGENTS.md").write_text("# Root", encoding="utf-8")
|
||||
target = tmp_path / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
# cwd-level AGENTS.md is handled by load_project_docs, not this method
|
||||
assert mgr.find_subdirectory_agents_md(target) == []
|
||||
|
||||
def test_returns_agents_md_from_file_parent(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
sub = tmp_path / "sub"
|
||||
sub.mkdir()
|
||||
(sub / "AGENTS.md").write_text("# Sub instructions", encoding="utf-8")
|
||||
target = sub / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.find_subdirectory_agents_md(target)
|
||||
assert len(docs) == 1
|
||||
assert docs[0] == (sub.resolve(), "# Sub instructions")
|
||||
|
||||
def test_returns_multiple_agents_md_outermost_first(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
outer = tmp_path / "a"
|
||||
inner = outer / "b"
|
||||
inner.mkdir(parents=True)
|
||||
(outer / "AGENTS.md").write_text("# Outer", encoding="utf-8")
|
||||
(inner / "AGENTS.md").write_text("# Inner", encoding="utf-8")
|
||||
target = inner / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.find_subdirectory_agents_md(target)
|
||||
assert len(docs) == 2
|
||||
assert docs[0] == (outer.resolve(), "# Outer")
|
||||
assert docs[1] == (inner.resolve(), "# Inner")
|
||||
|
||||
def test_skips_dirs_without_agents_md(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
outer = tmp_path / "a"
|
||||
inner = outer / "b"
|
||||
inner.mkdir(parents=True)
|
||||
# Only inner has AGENTS.md
|
||||
(inner / "AGENTS.md").write_text("# Inner", encoding="utf-8")
|
||||
target = inner / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
docs = mgr.find_subdirectory_agents_md(target)
|
||||
assert len(docs) == 1
|
||||
assert docs[0] == (inner.resolve(), "# Inner")
|
||||
|
||||
def test_ignores_empty_agents_md(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.chdir(tmp_path)
|
||||
monkeypatch.setattr(trusted_folders_manager, "is_trusted", lambda _: True)
|
||||
sub = tmp_path / "sub"
|
||||
sub.mkdir()
|
||||
(sub / "AGENTS.md").write_text(" \n ", encoding="utf-8")
|
||||
target = sub / "file.py"
|
||||
target.write_text("", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.find_subdirectory_agents_md(target) == []
|
||||
|
||||
|
||||
class TestProjectSkillsDirs:
|
||||
def test_returns_empty_list_when_no_skills_dirs(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
|
|
@ -332,3 +562,33 @@ class TestProjectSkillsDirs:
|
|||
(tmp_path / "node_modules" / ".vibe" / "skills").mkdir(parents=True)
|
||||
mgr = HarnessFilesManager(sources=("user", "project"))
|
||||
assert mgr.project_skills_dirs == [tmp_path / ".vibe" / "skills"]
|
||||
|
||||
|
||||
class TestLoadUserDoc:
|
||||
def test_returns_empty_when_user_not_in_sources(self) -> None:
|
||||
mgr = HarnessFilesManager(sources=("project",))
|
||||
assert mgr.load_user_doc() == ""
|
||||
|
||||
def test_returns_empty_when_file_does_not_exist(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.setattr("vibe.core.paths._vibe_home._DEFAULT_VIBE_HOME", tmp_path)
|
||||
mgr = HarnessFilesManager(sources=("user",))
|
||||
assert mgr.load_user_doc() == ""
|
||||
|
||||
def test_returns_file_content_when_file_exists(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
monkeypatch.setattr("vibe.core.paths._vibe_home._DEFAULT_VIBE_HOME", tmp_path)
|
||||
(tmp_path / "AGENTS.md").write_text("# User instructions", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user",))
|
||||
assert mgr.load_user_doc() == "# User instructions"
|
||||
|
||||
def test_returns_empty_string_for_whitespace_only_file(
|
||||
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
# load_user_doc strips — consistent with _collect_agents_md
|
||||
monkeypatch.setattr("vibe.core.paths._vibe_home._DEFAULT_VIBE_HOME", tmp_path)
|
||||
(tmp_path / "AGENTS.md").write_text(" \n ", encoding="utf-8")
|
||||
mgr = HarnessFilesManager(sources=("user",))
|
||||
assert mgr.load_user_doc() == ""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue