| 1 | from pathlib import Path |
| 2 | |
| 3 | ROOT = Path(__file__).resolve().parents[1] |
| 4 | SKILL_ROOT = ROOT / "skills" / "last30days" |
| 5 | |
| 6 | |
| 7 | def _skillignore_entries() -> set[str]: |
| 8 | text = (SKILL_ROOT / ".skillignore").read_text(encoding="utf-8") |
| 9 | return { |
| 10 | line.strip() |
| 11 | for line in text.splitlines() |
| 12 | if line.strip() and not line.lstrip().startswith("#") |
| 13 | } |
| 14 | |
| 15 | |
| 16 | def test_hermes_skillignore_excludes_non_runtime_scan_surface() -> None: |
| 17 | entries = _skillignore_entries() |
| 18 | |
| 19 | expected = { |
| 20 | "assets/", |
| 21 | "agents/", |
| 22 | "scripts/build-skill.sh", |
| 23 | "scripts/compare.sh", |
| 24 | "scripts/evaluate_search_quality.py", |
| 25 | "scripts/test_device_auth.py", |
| 26 | "scripts/test-v1-vs-v2.sh", |
| 27 | "scripts/verify_v3.py", |
| 28 | } |
| 29 | |
| 30 | assert expected <= entries |
| 31 | for entry in sorted(expected): |
| 32 | assert (SKILL_ROOT / entry.rstrip("/")).exists() |
| 33 | |
| 34 | |
| 35 | def test_hermes_skillignore_keeps_runtime_contract_scannable() -> None: |
| 36 | entries = _skillignore_entries() |
| 37 | |
| 38 | expected_scannable = { |
| 39 | "SKILL.md", |
| 40 | "references", |
| 41 | "references/", |
| 42 | "references/save-html-brief.md", |
| 43 | "scripts/last30days.py", |
| 44 | "scripts/lib/", |
| 45 | } |
| 46 | |
| 47 | for entry in sorted(expected_scannable): |
| 48 | assert entry not in entries |
| 49 | assert (SKILL_ROOT / entry.rstrip("/")).exists() |
| 50 |