mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-03 17:27:37 +08:00
Treat skill views and edits as activity when curator reports and applies lifecycle transitions, so recently loaded or patched skills are not displayed or transitioned as never used.\n\nAdds regression tests for activity derivation, automatic transitions, and CLI status output.
57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
"""Regression tests for curator skill activity timestamps."""
|
|
|
|
import importlib
|
|
from datetime import datetime, timedelta, timezone
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
|
|
def _write_skill(skills_dir: Path, name: str) -> None:
|
|
skill_dir = skills_dir / name
|
|
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
(skill_dir / "SKILL.md").write_text(
|
|
f"---\nname: {name}\ndescription: test skill\n---\n\n# {name}\n",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def curator_modules(tmp_path, monkeypatch):
|
|
home = tmp_path / ".hermes"
|
|
(home / "skills").mkdir(parents=True)
|
|
monkeypatch.setenv("HERMES_HOME", str(home))
|
|
monkeypatch.setattr(Path, "home", lambda: tmp_path)
|
|
|
|
import tools.skill_usage as skill_usage
|
|
import agent.curator as curator
|
|
|
|
importlib.reload(skill_usage)
|
|
importlib.reload(curator)
|
|
return home, skill_usage, curator
|
|
|
|
|
|
def test_recent_view_activity_prevents_false_stale_transition(curator_modules, monkeypatch):
|
|
home, skill_usage, curator = curator_modules
|
|
skills_dir = home / "skills"
|
|
_write_skill(skills_dir, "recently-viewed")
|
|
|
|
now = datetime(2026, 4, 30, tzinfo=timezone.utc)
|
|
created_at = (now - timedelta(days=60)).isoformat()
|
|
last_viewed_at = (now - timedelta(days=1)).isoformat()
|
|
skill_usage.save_usage({
|
|
"recently-viewed": {
|
|
"created_at": created_at,
|
|
"last_viewed_at": last_viewed_at,
|
|
"view_count": 1,
|
|
"state": "active",
|
|
}
|
|
})
|
|
monkeypatch.setattr(curator, "get_stale_after_days", lambda: 30)
|
|
monkeypatch.setattr(curator, "get_archive_after_days", lambda: 90)
|
|
|
|
counts = curator.apply_automatic_transitions(now=now)
|
|
|
|
assert counts["marked_stale"] == 0
|
|
assert skill_usage.get_record("recently-viewed")["state"] == "active"
|