# NousResearch/hermes-agent · Fix hardcoded ~/.hermes paths in output and text

## Open now

- 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.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #10285. Verify it addresses your case.
- **Recommended:** read PR #10285 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `unresolved`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member 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.

## Closed / duplicate issues

- #7697: text_to_speech schema hardcodes ~/.hermes default path (misleading with HERMES_HOME / profiles)

## Prior & competing PRs

- **#10285: fix: replace hardcoded ~/.hermes with display_hermes_home() in agent-facing text**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `agent/skill_commands.py`, `tools/cronjob_tools.py`, `tools/skill_manager_tool.py`, `tools/skills_tool.py`, `tools/tts_tool.py`
  - fix hunks:
  - `agent/skill_commands.py`

    ```diff
    @@ -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]] = {}
    ```

    ```diff
    @@ -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`

    ```diff
    @@ -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)
    ```

    ```diff
    @@ -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`

    ```diff
    @@ -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__)
    ```

    ```diff
    @@ -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`

    ```diff
    @@ -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
    ```

    ```diff
    @@ -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(
    ```

    ```diff
    @@ -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`

    ```diff
    @@ -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
    ```

    ```diff
    @@ -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"]
    ```
- **#7732: fix(tts): make schema default output path profile-safe**. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `722331a57`, `#10285`

## Fix status

- Merged to main in PR #10285 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-04-15`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
