Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion hermes_cli/skills_hub.py
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ def do_list(source_filter: str = "all", console: Optional[Console] = None) -> No
source_display = hub_entry.get("source", "hub")
trust = hub_entry.get("trust_level", "community")
hub_count += 1
elif name in builtin_names:
elif name in builtin_names or skill.get("dir_name", name) in builtin_names:
source_type = "builtin"
source_display = "builtin"
trust = "builtin"
Expand Down
30 changes: 30 additions & 0 deletions tests/hermes_cli/test_skills_hub.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,36 @@ def test_do_list_filter_builtin(three_source_env):
output = _capture(source_filter="builtin")

assert "builtin-skill" in output


def test_do_list_builtin_dir_name_mismatch(monkeypatch, hub_env):
"""Builtin skill whose directory name differs from frontmatter name is still classified as builtin.

Regression test for issue #5433: skills_sync stores manifest keys by directory name
while _find_all_skills returns frontmatter name; when they differ the skill was wrongly
shown as local.
"""
import tools.skills_hub as hub
import tools.skills_sync as skills_sync
import tools.skills_tool as skills_tool

# directory name is "vllm" but SKILL.md frontmatter says "serving-llms-vllm"
_skills = [
{"name": "serving-llms-vllm", "dir_name": "vllm", "category": "mlops", "description": "vllm"},
]
_manifest = {"vllm": "deadbeef"} # manifest key = directory name

monkeypatch.setattr(hub, "HubLockFile", lambda: _DummyLockFile([]))
monkeypatch.setattr(skills_tool, "_find_all_skills", lambda: list(_skills))
monkeypatch.setattr(skills_sync, "_read_manifest", lambda: dict(_manifest))

sink = StringIO()
console = Console(file=sink, force_terminal=False, color_system=None)
do_list(console=console)
output = sink.getvalue()

assert "serving-llms-vllm" in output
assert "0 hub-installed, 1 builtin, 0 local" in output
assert "hub-skill" not in output
assert "local-skill" not in output

Expand Down
1 change: 1 addition & 0 deletions tools/skills_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,7 @@ def _find_all_skills(*, skip_disabled: bool = False) -> List[Dict[str, Any]]:
seen_names.add(name)
skills.append({
"name": name,
"dir_name": skill_dir.name,
"description": description,
"category": category,
})
Expand Down