Co-Authored-By: Quentin Torroba <quentin.torroba@mistral.ai>
Co-Authored-By: Michel Thomazo <michel.thomazo@mistral.ai>
Co-Authored-By: Clément Drouin <clement.drouin@mistral.ai>
Co-Authored-By: Vincent Guilloux <vincent.guilloux@mistral.ai>
Co-Authored-By: Clément Siriex <clement.sirieix@mistral.ai>
Co-Authored-By: Kim-Adeline Miguel <kimadeline.miguel@mistral.ai>
Co-Authored-By: Thaddee Tyl <thaddee.tyl@gmail.com>
Co-Authored-By: David Brochart <david.brochart@gmail.com>
Co-Authored-By: Joseph Guhlin <joseph.guhlin@gmail.com>
Co-Authored-By: Thomas Kenbeek <thomaskenbeek@gmail.com>
Co-Authored-By: Remenby31 <baptiste.cruvellier31@gmail.com>
This commit is contained in:
Mathias Gesbert 2026-01-27 16:39:30 +01:00 committed by Mathias Gesbert
parent 79f215d91c
commit d33db9fff8
217 changed files with 16911 additions and 4305 deletions

View file

@ -273,3 +273,191 @@ class TestSkillManagerGetSkill:
def test_returns_none_for_unknown_skill(self, skill_manager: SkillManager) -> None:
assert skill_manager.get_skill("nonexistent-skill") is None
class TestSkillManagerFiltering:
def test_enabled_skills_filters_to_only_enabled(self, skills_dir: Path) -> None:
create_skill(skills_dir, "skill-a", "Skill A")
create_skill(skills_dir, "skill-b", "Skill B")
create_skill(skills_dir, "skill-c", "Skill C")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
enabled_skills=["skill-a", "skill-c"],
)
manager = SkillManager(lambda: config)
skills = manager.available_skills
assert len(skills) == 2
assert "skill-a" in skills
assert "skill-b" not in skills
assert "skill-c" in skills
def test_disabled_skills_excludes_disabled(self, skills_dir: Path) -> None:
create_skill(skills_dir, "skill-a", "Skill A")
create_skill(skills_dir, "skill-b", "Skill B")
create_skill(skills_dir, "skill-c", "Skill C")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
disabled_skills=["skill-b"],
)
manager = SkillManager(lambda: config)
skills = manager.available_skills
assert len(skills) == 2
assert "skill-a" in skills
assert "skill-b" not in skills
assert "skill-c" in skills
def test_enabled_skills_takes_precedence_over_disabled(
self, skills_dir: Path
) -> None:
create_skill(skills_dir, "skill-a", "Skill A")
create_skill(skills_dir, "skill-b", "Skill B")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
enabled_skills=["skill-a"],
disabled_skills=["skill-a"], # Should be ignored
)
manager = SkillManager(lambda: config)
skills = manager.available_skills
assert len(skills) == 1
assert "skill-a" in skills
def test_glob_pattern_matching(self, skills_dir: Path) -> None:
create_skill(skills_dir, "search-code", "Search code")
create_skill(skills_dir, "search-docs", "Search docs")
create_skill(skills_dir, "other-skill", "Other skill")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
enabled_skills=["search-*"],
)
manager = SkillManager(lambda: config)
skills = manager.available_skills
assert len(skills) == 2
assert "search-code" in skills
assert "search-docs" in skills
assert "other-skill" not in skills
def test_regex_pattern_matching(self, skills_dir: Path) -> None:
create_skill(skills_dir, "skill-v1", "Skill v1")
create_skill(skills_dir, "skill-v2", "Skill v2")
create_skill(skills_dir, "other-skill", "Other skill")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
enabled_skills=["re:skill-v\\d+"],
)
manager = SkillManager(lambda: config)
skills = manager.available_skills
assert len(skills) == 2
assert "skill-v1" in skills
assert "skill-v2" in skills
assert "other-skill" not in skills
def test_get_skill_respects_filtering(self, skills_dir: Path) -> None:
create_skill(skills_dir, "enabled-skill", "Enabled")
create_skill(skills_dir, "disabled-skill", "Disabled")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
disabled_skills=["disabled-skill"],
)
manager = SkillManager(lambda: config)
assert manager.get_skill("enabled-skill") is not None
assert manager.get_skill("disabled-skill") is None
class TestSkillUserInvocable:
def test_user_invocable_defaults_to_true(self, skills_dir: Path) -> None:
create_skill(skills_dir, "default-skill", "A default skill")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
)
manager = SkillManager(lambda: config)
skill = manager.get_skill("default-skill")
assert skill is not None
assert skill.user_invocable is True
def test_user_invocable_can_be_set_to_false(self, skills_dir: Path) -> None:
create_skill(skills_dir, "hidden-skill", "A hidden skill", user_invocable=False)
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
)
manager = SkillManager(lambda: config)
skill = manager.get_skill("hidden-skill")
assert skill is not None
assert skill.user_invocable is False
def test_user_invocable_can_be_explicitly_set_to_true(
self, skills_dir: Path
) -> None:
create_skill(
skills_dir, "explicit-skill", "An explicit skill", user_invocable=True
)
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
)
manager = SkillManager(lambda: config)
skill = manager.get_skill("explicit-skill")
assert skill is not None
assert skill.user_invocable is True
def test_mixed_user_invocable_skills(self, skills_dir: Path) -> None:
create_skill(skills_dir, "visible-skill", "Visible", user_invocable=True)
create_skill(skills_dir, "hidden-skill", "Hidden", user_invocable=False)
create_skill(skills_dir, "default-skill", "Default")
config = VibeConfig(
session_logging=SessionLoggingConfig(enabled=False),
system_prompt_id="tests",
include_project_context=False,
skill_paths=[skills_dir],
)
manager = SkillManager(lambda: config)
skills = manager.available_skills
assert len(skills) == 3
assert skills["visible-skill"].user_invocable is True
assert skills["hidden-skill"].user_invocable is False
assert skills["default-skill"].user_invocable is True