mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-14 04:02:26 +00:00
fix(curator): protect hub skills by frontmatter name
This commit is contained in:
parent
5168226d60
commit
68c1a08ad1
2 changed files with 61 additions and 1 deletions
|
|
@ -225,6 +225,47 @@ def test_agent_created_excludes_hub_installed(skills_home):
|
||||||
assert "hub-skill" not in names
|
assert "hub-skill" not in names
|
||||||
|
|
||||||
|
|
||||||
|
def test_agent_created_excludes_hub_installed_frontmatter_name(skills_home):
|
||||||
|
from tools.skill_usage import is_agent_created, list_agent_created_skill_names
|
||||||
|
|
||||||
|
skills_dir = skills_home / "skills"
|
||||||
|
hub_skill = skills_dir / "productivity" / "getnote"
|
||||||
|
hub_skill.mkdir(parents=True)
|
||||||
|
(hub_skill / "SKILL.md").write_text(
|
||||||
|
"""---
|
||||||
|
name: Get笔记
|
||||||
|
description: test skill
|
||||||
|
---
|
||||||
|
|
||||||
|
# body
|
||||||
|
""",
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
_write_skill(skills_dir, "my-skill")
|
||||||
|
hub_dir = skills_dir / ".hub"
|
||||||
|
hub_dir.mkdir()
|
||||||
|
(hub_dir / "lock.json").write_text(
|
||||||
|
json.dumps(
|
||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"installed": {
|
||||||
|
"getnote": {
|
||||||
|
"source": "taps/main",
|
||||||
|
"install_path": "productivity/getnote",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
names = list_agent_created_skill_names()
|
||||||
|
assert "my-skill" in names
|
||||||
|
assert "Get笔记" not in names
|
||||||
|
assert is_agent_created("Get笔记") is False
|
||||||
|
assert is_agent_created("getnote") is False
|
||||||
|
|
||||||
|
|
||||||
def test_is_agent_created(skills_home):
|
def test_is_agent_created(skills_home):
|
||||||
from tools.skill_usage import is_agent_created
|
from tools.skill_usage import is_agent_created
|
||||||
skills_dir = skills_home / "skills"
|
skills_dir = skills_home / "skills"
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,26 @@ def _read_hub_installed_names() -> Set[str]:
|
||||||
if isinstance(data, dict):
|
if isinstance(data, dict):
|
||||||
installed = data.get("installed") or {}
|
installed = data.get("installed") or {}
|
||||||
if isinstance(installed, dict):
|
if isinstance(installed, dict):
|
||||||
return {str(k) for k in installed.keys()}
|
names = {str(k) for k in installed.keys()}
|
||||||
|
skills_dir = _skills_dir()
|
||||||
|
for entry in installed.values():
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
continue
|
||||||
|
install_path = entry.get("install_path")
|
||||||
|
if not isinstance(install_path, str) or not install_path.strip():
|
||||||
|
continue
|
||||||
|
skill_dir = Path(install_path)
|
||||||
|
if not skill_dir.is_absolute():
|
||||||
|
skill_dir = skills_dir / skill_dir
|
||||||
|
try:
|
||||||
|
resolved = skill_dir.resolve()
|
||||||
|
resolved.relative_to(skills_dir.resolve())
|
||||||
|
except (OSError, ValueError):
|
||||||
|
continue
|
||||||
|
skill_md = resolved / "SKILL.md"
|
||||||
|
if skill_md.exists():
|
||||||
|
names.add(_read_skill_name(skill_md, fallback=resolved.name))
|
||||||
|
return names
|
||||||
except (OSError, json.JSONDecodeError) as e:
|
except (OSError, json.JSONDecodeError) as e:
|
||||||
logger.debug("Failed to read hub lock file: %s", e)
|
logger.debug("Failed to read hub lock file: %s", e)
|
||||||
return set()
|
return set()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue