[grade=A] add SKILL_EVOLUTION_SKILLS_DIR env var for per-Hermes-profile skills trees
Forked from Carlo1911/skill-evolution main. Adds env-var override so a single installed pipeline can target per-profile skills trees (default ~/.hermes/skills, krystie ~/.hermes/profiles/krystie/skills, sami-story ~/.hermes/profiles/sami-story/skills) without monkeypatching HOME or the SKILLS_DIR module constant. - scripts/skill_index.py: add resolve_skills_dir() + SKILLS_DIR_ENV_VAR, wire into scan_skills() with explicit-arg > env-var > default resolution order. Read at call time (matches fetch_sessions.get_state_db_path() convention). - tests/test_skill_index.py: 2 new tests covering nonblank env var and blank fallback (the latter monkeypatches SKILLS_DIR + invokes scan_skills() with no args so the test actually exercises the fallback expression, not just the explicit arg path). - 49/49 conformance tests pass. - Codex grade: A (verified 2026-08-05). Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
This commit is contained in:
+24
-3
@@ -15,6 +15,20 @@ from typing import Optional
|
||||
|
||||
|
||||
SKILLS_DIR = os.path.expanduser("~/.hermes/skills")
|
||||
SKILLS_DIR_ENV_VAR = "SKILL_EVOLUTION_SKILLS_DIR"
|
||||
|
||||
|
||||
def resolve_skills_dir() -> str:
|
||||
"""Resolve the skills directory, honouring SKILL_EVOLUTION_SKILLS_DIR.
|
||||
|
||||
Mirrors fetch_sessions.get_state_db_path()'s read-at-call-time shape: the env var
|
||||
is read every call (not frozen at import) so a single installed pipeline can target
|
||||
different skill trees per run (e.g. per-Hermes-profile layouts like
|
||||
~/.hermes/profiles/<name>/skills/) without monkeypatching HOME. Falls back to the
|
||||
default ~/.hermes/skills when unset or blank, so existing callers see no behaviour
|
||||
change.
|
||||
"""
|
||||
return os.environ.get(SKILLS_DIR_ENV_VAR, "").strip() or SKILLS_DIR
|
||||
|
||||
|
||||
def parse_name_description_frontmatter(content: str) -> dict:
|
||||
@@ -62,9 +76,16 @@ def build_skill_record(skill_md: Path, category: str) -> Optional[dict]:
|
||||
}
|
||||
|
||||
|
||||
def scan_skills(skills_dir: str = SKILLS_DIR) -> list:
|
||||
"""Scan skills directory and return structured index."""
|
||||
base = Path(skills_dir)
|
||||
def scan_skills(skills_dir: Optional[str] = None) -> list:
|
||||
"""Scan skills directory and return structured index.
|
||||
|
||||
Resolution order: explicit `skills_dir` arg > SKILL_EVOLUTION_SKILLS_DIR env var >
|
||||
the default ~/.hermes/skills. The env var is read at call time (same as
|
||||
fetch_sessions.get_state_db_path) so a single installed pipeline can target
|
||||
different skill trees per run -- e.g. per-Hermes-profile layouts like
|
||||
~/.hermes/profiles/<name>/skills/ -- without monkeypatching HOME.
|
||||
"""
|
||||
base = Path(skills_dir if skills_dir is not None else resolve_skills_dir())
|
||||
if not base.exists():
|
||||
return []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user