NousResearch/hermes-agent

Fix hardcoded ~/.hermes paths in output and text

Cluster 7697. Data as of

Nothing open on GitHub. Fix merged in #10285 on 15 Apr 2026. Check it covers your case.

The short answer

0open issues
0open PRs
3items grouped
Known?
Yes. 3 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #10285. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this unresolved. That is separate from the fix event.
Still open
Nothing open on GitHub.

These issues and PRs address places where the literal path ~/.hermes is hardcoded in user-facing text and schema defaults, which becomes misleading when HERMES_HOME or profiles point elsewhere. The fixes replace hardcoded references with dynamic resolution.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #10285 fix: replace hardcoded ~/.hermes with display_hermes_home() in agent-facing text

    merged to main

    files: agent/skill_commands.py, tools/cronjob_tools.py, tools/skill_manager_tool.py, tools/skills_tool.py, tools/tts_tool.py

    Show the diff
    • agent/skill_commands.py
      @@ -12,6 +12,8 @@
       from pathlib import Path
       from typing import Any, Dict, Optional
       
      +from hermes_constants import display_hermes_home
      +
       logger = logging.getLogger(__name__)
       
       _skill_commands: Dict[str, Dict[str, Any]] = {}
      @@ -108,7 +110,7 @@ def _inject_skill_config(loaded_skill: dict[str, Any], parts: list[str]) -> None
               if not resolved:
                   return
       
      -        lines = ["", "[Skill config (from ~/.hermes/config.yaml):"]
      +        lines = ["", f"[Skill config (from {display_hermes_home()}/config.yaml):"]
               for key, value in resolved.items():
                   display_val = str(value) if value else "(not set)"
                   lines.append(f"  {key} = {display_val}")
    • tools/cronjob_tools.py
      @@ -13,6 +13,8 @@
       from pathlib import Path
       from typing import Any, Dict, List, Optional
       
      +from hermes_constants import display_hermes_home
      +
       logger = logging.getLogger(__name__)
       
       # Import from cron module (will be available when properly installed)
      @@ -455,7 +457,7 @@ def cronjob(
                   },
                   "script": {
                       "type": "string",
      -                "description": "Optional path to a Python script that runs before each cron job execution. Its stdout is injected into the prompt as context. Use for data collection and change detection. Relative paths resolve under ~/.hermes/scripts/. On update, pass empty string to clear."
      +                "description": f"Optional path to a Python script that runs before each cron job execution. Its stdout is injected into the prompt as context. Use for data collection and change detection. Relative paths resolve under {display_hermes_home()}/scripts/. On update, pass empty string to clear."
                   },
               },
               "required": ["action"]
    • tools/skill_manager_tool.py
      @@ -39,7 +39,7 @@
       import shutil
       import tempfile
       from pathlib import Path
      -from hermes_constants import get_hermes_home
      +from hermes_constants import get_hermes_home, display_hermes_home
       from typing import Dict, Any, Optional, Tuple
       
       logger = logging.getLogger(__name__)
      @@ -655,7 +655,7 @@ def skill_manage(
           "description": (
               "Manage skills (create, update, delete). Skills are your procedural "
               "memory — reusable approaches for recurring task types. "
      -        "New skills go to ~/.hermes/skills/; existing skills can be modified wherever they live.\n\n"
      +        f"New skills go to {display_hermes_home()}/skills/; existing skills can be modified wherever they live.\n\n"
               "Actions: create (full SKILL.md + optional category), "
               "patch (old_string/new_string — preferred for fixes), "
               "edit (full SKILL.md rewrite — major overhauls only), "
    • tools/skills_tool.py
      @@ -69,7 +69,7 @@
       import json
       import logging
       
      -from hermes_constants import get_hermes_home
      +from hermes_constants import get_hermes_home, display_hermes_home
       import os
       import re
       from enum import Enum
      @@ -408,7 +408,7 @@ def _gateway_setup_hint() -> str:
       
               return GATEWAY_SECRET_CAPTURE_UNSUPPORTED_MESSAGE
           except Exception:
      -        return "Secure secret entry is not available. Load this skill in the local CLI to be prompted, or add the key to ~/.hermes/.env manually."
      +        return f"Secure secret entry is not available. Load this skill in the local CLI to be prompted, or add the key to {display_hermes_home()}/.env manually."
       
       
       def _build_setup_note(
      @@ -666,7 +666,7 @@ def skills_list(category: str = None, task_id: str = None) -> str:
                           "success": True,
                           "skills": [],
                           "categories": [],
      -                    "message": "No skills found. Skills directory created at ~/.hermes/skills/",
      +                    "message": f"No skills found. Skills directory created at {display_hermes_home()}/skills/",
                       },
                       ensure_ascii=False,
                   )
    • tools/tts_tool.py
      @@ -40,6 +40,8 @@
       from typing import Callable, Dict, Any, Optional
       from urllib.parse import urljoin
       
      +from hermes_constants import display_hermes_home
      +
       logger = logging.getLogger(__name__)
       from tools.managed_tool_gateway import resolve_managed_tool_gateway
       from tools.tool_backend_helpers import managed_nous_tools_enabled, resolve_openai_audio_api_key
      @@ -1050,7 +1052,7 @@ def _check(importer, label):
                   },
                   "output_path": {
                       "type": "string",
      -                "description": "Optional custom file path to save the audio. Defaults to ~/.hermes/audio_cache/<timestamp>.mp3"
      +                "description": f"Optional custom file path to save the audio. Defaults to {display_hermes_home()}/audio_cache/<timestamp>.mp3"
                   }
               },
               "required": ["text"]

1 PR closed without merging

From the close comments: done elsewhere 1

  • #7732 fix(tts): make schema default output path profile-safe · done elsewhere → 722331a, #10285
Closed issues · 1
  • Closed#7697text_to_speech schema hardcodes ~/.hermes default path (misleading with HERMES_HOME / profiles)
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.67: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Merged PRs
#10285
Closed issues
1
Attempts
1 PR closed without merging
Fix link checked
15 Apr 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.

For your agent

The same facts, typed.