fix(skills): apply global|platform disabled union to all resolution sites
The platform-disabled fix landed only in agent.skill_utils.get_disabled_skill_names (the system-prompt path). Two sibling resolvers still used the old replace-not-union semantics, so the same skill could be hidden from the <available_skills> prompt yet reported enabled elsewhere: - hermes_cli/skills_config.get_disabled_skills (the 'hermes skills config' UI) returned only the platform list, so a globally-disabled skill showed as enabled (unchecked) on any platform with a platform_disabled entry. - tools/skills_tool._is_skill_disabled (gates whether skill_view loads a skill) ignored the global list when a platform list existed, so a globally-disabled skill could still be loaded on such a platform. Both now union the global list with the platform list, matching get_disabled_skill_names. An explicit empty platform list no longer re-enables a globally-disabled skill — global disables hold on every platform (#46201). Also: fix the now-stale get_disabled_skill_names docstring and drop a stray blank line. Regression tests added for both sites (proven to fail on the old replace semantics).
This commit is contained in:
@@ -22,7 +22,19 @@ class TestGetDisabledSkills:
|
||||
"disabled": ["skill-a"],
|
||||
"platform_disabled": {"telegram": ["skill-b"]}
|
||||
}}
|
||||
assert get_disabled_skills(config, platform="telegram") == {"skill-b"}
|
||||
# Union of global + platform: a globally-disabled skill stays disabled
|
||||
# on every platform, and the platform list adds to it.
|
||||
assert get_disabled_skills(config, platform="telegram") == {"skill-a", "skill-b"}
|
||||
|
||||
def test_platform_list_unions_with_global(self):
|
||||
from hermes_cli.skills_config import get_disabled_skills
|
||||
config = {"skills": {
|
||||
"disabled": ["global-skill"],
|
||||
"platform_disabled": {"telegram": []}
|
||||
}}
|
||||
# An explicit empty platform list does NOT re-enable a globally-disabled
|
||||
# skill (matches issue #46201 — global disables hold everywhere).
|
||||
assert get_disabled_skills(config, platform="telegram") == {"global-skill"}
|
||||
|
||||
def test_platform_falls_back_to_global(self):
|
||||
from hermes_cli.skills_config import get_disabled_skills
|
||||
@@ -102,14 +114,27 @@ class TestIsSkillDisabled:
|
||||
assert _is_skill_disabled("tg-skill", platform="telegram") is True
|
||||
|
||||
@patch("hermes_cli.config.load_config")
|
||||
def test_platform_enabled_overrides_global(self, mock_load):
|
||||
def test_globally_disabled_stays_disabled_on_platform(self, mock_load):
|
||||
mock_load.return_value = {"skills": {
|
||||
"disabled": ["skill-a"],
|
||||
"platform_disabled": {"telegram": ["tg-skill"]}
|
||||
}}
|
||||
from tools.skills_tool import _is_skill_disabled
|
||||
# Union: a globally-disabled skill stays disabled on a platform that
|
||||
# has its own platform_disabled list (matches issue #46201).
|
||||
assert _is_skill_disabled("skill-a", platform="telegram") is True
|
||||
assert _is_skill_disabled("tg-skill", platform="telegram") is True
|
||||
|
||||
@patch("hermes_cli.config.load_config")
|
||||
def test_empty_platform_list_keeps_global_disabled(self, mock_load):
|
||||
mock_load.return_value = {"skills": {
|
||||
"disabled": ["skill-a"],
|
||||
"platform_disabled": {"telegram": []}
|
||||
}}
|
||||
from tools.skills_tool import _is_skill_disabled
|
||||
# telegram has explicit empty list -> skill-a is NOT disabled for telegram
|
||||
assert _is_skill_disabled("skill-a", platform="telegram") is False
|
||||
# An explicit empty platform list does NOT re-enable a globally-disabled
|
||||
# skill — global disables hold on every platform.
|
||||
assert _is_skill_disabled("skill-a", platform="telegram") is True
|
||||
|
||||
@patch("hermes_cli.config.load_config")
|
||||
def test_platform_falls_back_to_global(self, mock_load):
|
||||
|
||||
Reference in New Issue
Block a user