mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-26 06:01:49 +00:00
docs: deep audit — fix stale config keys, missing commands, and registry drift (#22784)
* docs: deep audit — fix stale config keys, missing commands, and registry drift Cross-checked ~80 high-impact docs pages (getting-started, reference, top-level user-guide, user-guide/features) against the live registries: hermes_cli/commands.py COMMAND_REGISTRY (slash commands) hermes_cli/auth.py PROVIDER_REGISTRY (providers) hermes_cli/config.py DEFAULT_CONFIG (config keys) toolsets.py TOOLSETS (toolsets) tools/registry.py get_all_tool_names() (tools) python -m hermes_cli.main <subcmd> --help (CLI args) reference/ - cli-commands.md: drop duplicate hermes fallback row + duplicate section, add stepfun/lmstudio to --provider enum, expand auth/mcp/curator subcommand lists to match --help output (status/logout/spotify, login, archive/prune/ list-archived). - slash-commands.md: add missing /sessions and /reload-skills entries + correct the cross-platform Notes line. - tools-reference.md: drop bogus '68 tools' headline, drop fictional 'browser-cdp toolset' (these tools live in 'browser' and are runtime-gated), add missing 'kanban' and 'video' toolset sections, fix MCP example to use the real mcp_<server>_<tool> prefix. - toolsets-reference.md: list browser_cdp/browser_dialog inside the 'browser' row, add missing 'kanban' and 'video' toolset rows, drop the stale '38 tools' count for hermes-cli. - profile-commands.md: add missing install/update/info subcommands, document fish completion. - environment-variables.md: dedupe GMI_API_KEY/GMI_BASE_URL rows (kept the one with the correct gmi-serving.com default). - faq.md: Anthropic/Google/OpenAI examples — direct providers exist (not just via OpenRouter), refresh the OpenAI model list. getting-started/ - installation.md: PortableGit (not MinGit) is what the Windows installer fetches; document the 32-bit MinGit fallback. - installation.md / termux.md: installer prefers .[termux-all] then falls back to .[termux]. - nix-setup.md: Python 3.12 (not 3.11), Node.js 22 (not 20); fix invalid 'nix flake update --flake' invocation. - updating.md: 'hermes backup restore --state pre-update' doesn't exist — point at the snapshot/quick-snapshot flow; correct config key 'updates.pre_update_backup' (was 'update.backup'). user-guide/ - configuration.md: api_max_retries default 3 (not 2); display.runtime_footer is the real key (not display.runtime_metadata_footer); checkpoints defaults enabled=false / max_snapshots=20 (not true / 50). - configuring-models.md: 'hermes model list' / 'hermes model set ...' don't exist — hermes model is interactive only. - tui.md: busy_indicator -> tui_status_indicator with values kaomoji|emoji|unicode|ascii (not kawaii|minimal|dots|wings|none). - security.md: SSH backend keys (TERMINAL_SSH_HOST/USER/KEY) live in .env, not config.yaml. - windows-wsl-quickstart.md: there is no 'hermes api' subcommand — the OpenAI-compatible API server runs inside hermes gateway. user-guide/features/ - computer-use.md: approvals.mode (not security.approval_level); fix broken ./browser-use.md link to ./browser.md. - fallback-providers.md: top-level fallback_providers (not model.fallback_providers); the picker is subcommand-based, not modal. - api-server.md: API_SERVER_* are env vars — write to per-profile .env, not 'hermes config set' which targets YAML. - web-search.md: drop web_crawl as a registered tool (it isn't); deep-crawl modes are exposed through web_extract. - kanban.md: failure_limit default is 2, not '~5'. - plugins.md: drop hard-coded '33 providers' count. - honcho.md: fix unclosed quote in echo HONCHO_API_KEY snippet; document that 'hermes honcho' subcommand is gated on memory.provider=honcho; reconcile subcommand list with actual --help output. - memory-providers.md: legacy 'hermes honcho setup' redirect documented. Verified via 'npm run build' — site builds cleanly; broken-link count went from 149 to 146 (no regressions, fixed a few in passing). * docs: round 2 audit fixes + regenerate skill catalogs Follow-up to the previous commit on this branch: Round 2 manual fixes: - quickstart.md: KIMI_CODING_API_KEY mentioned alongside KIMI_API_KEY; voice-mode and ACP install commands rewritten — bare 'pip install ...' doesn't work for curl-installed setups (no pip on PATH, not in repo dir); replaced with 'cd ~/.hermes/hermes-agent && uv pip install -e ".[voice]"'. ACP already ships in [all] so the curl install includes it. - cli.md / configuration.md: 'auxiliary.compression.model' shown as 'google/gemini-3-flash-preview' (the doc's own claimed default); actual default is empty (= use main model). Reworded as 'leave empty (default) or pin a cheap model'. - built-in-plugins.md: added the bundled 'kanban/dashboard' plugin row that was missing from the table. Regenerated skill catalogs: - ran website/scripts/generate-skill-docs.py to refresh all 163 per-skill pages and both reference catalogs (skills-catalog.md, optional-skills-catalog.md). This adds the entries that were genuinely missing — productivity/teams-meeting-pipeline (bundled), optional/finance/* (entire category — 7 skills: 3-statement-model, comps-analysis, dcf-model, excel-author, lbo-model, merger-model, pptx-author), creative/hyperframes, creative/kanban-video-orchestrator, devops/watchers, productivity/shop-app, research/searxng-search, apple/macos-computer-use — and rewrites every other per-skill page from the current SKILL.md. Most diffs are tiny (one line of refreshed metadata). Validation: - 'npm run build' succeeded. - Broken-link count moved 146 -> 155 — the +9 are zh-Hans translation shells that lag every newly-added skill page (pre-existing pattern). No regressions on any en/ page.
This commit is contained in:
parent
ea2d66ddc0
commit
252d68fd45
181 changed files with 5498 additions and 122 deletions
|
|
@ -19,6 +19,7 @@ Delegate coding to Claude Code CLI (features, PRs).
|
|||
| Version | `2.2.0` |
|
||||
| Author | Hermes Agent + Teknium |
|
||||
| License | MIT |
|
||||
| Platforms | linux, macos, windows |
|
||||
| Tags | `Coding-Agent`, `Claude`, `Anthropic`, `Code-Review`, `Refactoring`, `PTY`, `Automation` |
|
||||
| Related skills | [`codex`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-codex), [`hermes-agent`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-hermes-agent), [`opencode`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-opencode) |
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ Delegate coding to OpenAI Codex CLI (features, PRs).
|
|||
| Version | `1.0.0` |
|
||||
| Author | Hermes Agent |
|
||||
| License | MIT |
|
||||
| Platforms | linux, macos, windows |
|
||||
| Tags | `Coding-Agent`, `Codex`, `OpenAI`, `Code-Review`, `Refactoring` |
|
||||
| Related skills | [`claude-code`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-claude-code), [`hermes-agent`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-hermes-agent) |
|
||||
|
||||
|
|
|
|||
|
|
@ -16,9 +16,10 @@ Configure, extend, or contribute to Hermes Agent.
|
|||
|---|---|
|
||||
| Source | Bundled (installed by default) |
|
||||
| Path | `skills/autonomous-ai-agents/hermes-agent` |
|
||||
| Version | `2.0.0` |
|
||||
| Version | `2.1.0` |
|
||||
| Author | Hermes Agent + Teknium |
|
||||
| License | MIT |
|
||||
| Platforms | linux, macos, windows |
|
||||
| Tags | `hermes`, `setup`, `configuration`, `multi-agent`, `spawning`, `cli`, `gateway`, `development` |
|
||||
| Related skills | [`claude-code`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-claude-code), [`codex`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-codex), [`opencode`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-opencode) |
|
||||
|
||||
|
|
@ -165,7 +166,7 @@ hermes gateway status Check status
|
|||
hermes gateway setup Configure platforms
|
||||
```
|
||||
|
||||
Supported platforms: Telegram, Discord, Slack, WhatsApp, Signal, Email, SMS, Matrix, Mattermost, Home Assistant, DingTalk, Feishu, WeCom, BlueBubbles (iMessage), Weixin (WeChat), Microsoft Teams, API Server, Webhooks. Open WebUI connects via the API Server adapter.
|
||||
Supported platforms: Telegram, Discord, Slack, WhatsApp, Signal, Email, SMS, Matrix, Mattermost, Home Assistant, DingTalk, Feishu, WeCom, BlueBubbles (iMessage), Weixin (WeChat), API Server, Webhooks. Open WebUI connects via the API Server adapter.
|
||||
|
||||
Platform docs: https://hermes-agent.nousresearch.com/docs/user-guide/messaging/
|
||||
|
||||
|
|
@ -244,7 +245,11 @@ hermes uninstall Uninstall Hermes
|
|||
|
||||
## Slash Commands (In-Session)
|
||||
|
||||
Type these during an interactive chat session.
|
||||
Type these during an interactive chat session. New commands land fairly
|
||||
often; if something below looks stale, run `/help` in-session for the
|
||||
authoritative list or see the [live slash commands reference](https://hermes-agent.nousresearch.com/docs/reference/slash-commands).
|
||||
The registry of record is `hermes_cli/commands.py` — every consumer
|
||||
(autocomplete, Telegram menu, Slack mapping, `/help`) derives from it.
|
||||
|
||||
### Session Control
|
||||
```
|
||||
|
|
@ -256,9 +261,15 @@ Type these during an interactive chat session.
|
|||
/compress Manually compress context
|
||||
/stop Kill background processes
|
||||
/rollback [N] Restore filesystem checkpoint
|
||||
/snapshot [sub] Create or restore state snapshots of Hermes config/state (CLI)
|
||||
/background <prompt> Run prompt in background
|
||||
/queue <prompt> Queue for next turn
|
||||
/steer <prompt> Inject a message after the next tool call without interrupting
|
||||
/agents (/tasks) Show active agents and running tasks
|
||||
/resume [name] Resume a named session
|
||||
/goal [text|sub] Set a standing goal Hermes works on across turns until achieved
|
||||
(subcommands: status, pause, resume, clear)
|
||||
/redraw Force a full UI repaint (CLI)
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
|
@ -270,6 +281,11 @@ Type these during an interactive chat session.
|
|||
/verbose Cycle: off → new → all → verbose
|
||||
/voice [on|off|tts] Voice mode
|
||||
/yolo Toggle approval bypass
|
||||
/busy [sub] Control what Enter does while Hermes is working (CLI)
|
||||
(subcommands: queue, steer, interrupt, status)
|
||||
/indicator [style] Pick the TUI busy-indicator style (CLI)
|
||||
(styles: kaomoji, emoji, unicode, ascii)
|
||||
/footer [on|off] Toggle gateway runtime-metadata footer on final replies
|
||||
/skin [name] Change theme (CLI)
|
||||
/statusbar Toggle status bar (CLI)
|
||||
```
|
||||
|
|
@ -280,8 +296,12 @@ Type these during an interactive chat session.
|
|||
/toolsets List toolsets (CLI)
|
||||
/skills Search/install skills (CLI)
|
||||
/skill <name> Load a skill into session
|
||||
/cron Manage cron jobs (CLI)
|
||||
/reload-skills Re-scan ~/.hermes/skills/ for added/removed skills
|
||||
/reload Reload .env variables into the running session (CLI)
|
||||
/reload-mcp Reload MCP servers
|
||||
/cron Manage cron jobs (CLI)
|
||||
/curator [sub] Background skill maintenance (status, run, pin, archive, …)
|
||||
/kanban [sub] Multi-profile collaboration board (tasks, links, comments)
|
||||
/plugins List plugins (CLI)
|
||||
```
|
||||
|
||||
|
|
@ -292,6 +312,7 @@ Type these during an interactive chat session.
|
|||
/restart Restart gateway (gateway)
|
||||
/sethome Set current chat as home channel (gateway)
|
||||
/update Update Hermes to latest (gateway)
|
||||
/topic [sub] Enable or inspect Telegram DM topic sessions (gateway)
|
||||
/platforms (/gateway) Show platform connection status (gateway)
|
||||
```
|
||||
|
||||
|
|
@ -302,6 +323,7 @@ Type these during an interactive chat session.
|
|||
/browser Open CDP browser connection
|
||||
/history Show conversation history (CLI)
|
||||
/save Save conversation to file (CLI)
|
||||
/copy [N] Copy the last assistant response to clipboard (CLI)
|
||||
/paste Attach clipboard image (CLI)
|
||||
/image Attach local image file (CLI)
|
||||
```
|
||||
|
|
@ -312,8 +334,10 @@ Type these during an interactive chat session.
|
|||
/commands [page] Browse all commands (gateway)
|
||||
/usage Token usage
|
||||
/insights [days] Usage analytics
|
||||
/gquota Show Google Gemini Code Assist quota usage (CLI)
|
||||
/status Session info (gateway)
|
||||
/profile Active profile info
|
||||
/debug Upload debug report (system info + logs) and get shareable links
|
||||
```
|
||||
|
||||
### Exit
|
||||
|
|
@ -395,12 +419,14 @@ Enable/disable via `hermes tools` (interactive) or `hermes tools enable/disable
|
|||
| Toolset | What it provides |
|
||||
|---------|-----------------|
|
||||
| `web` | Web search and content extraction |
|
||||
| `search` | Web search only (subset of `web`) |
|
||||
| `browser` | Browser automation (Browserbase, Camofox, or local Chromium) |
|
||||
| `terminal` | Shell commands and process management |
|
||||
| `file` | File read/write/search/patch |
|
||||
| `code_execution` | Sandboxed Python execution |
|
||||
| `vision` | Image analysis |
|
||||
| `image_gen` | AI image generation |
|
||||
| `video` | Video analysis and generation |
|
||||
| `tts` | Text-to-speech |
|
||||
| `skills` | Skill browsing and management |
|
||||
| `memory` | Persistent cross-session memory |
|
||||
|
|
@ -409,11 +435,21 @@ Enable/disable via `hermes tools` (interactive) or `hermes tools enable/disable
|
|||
| `cronjob` | Scheduled task management |
|
||||
| `clarify` | Ask user clarifying questions |
|
||||
| `messaging` | Cross-platform message sending |
|
||||
| `search` | Web search only (subset of `web`) |
|
||||
| `todo` | In-session task planning and tracking |
|
||||
| `kanban` | Multi-agent work-queue tools (gated to workers) |
|
||||
| `debugging` | Extra introspection/debug tools (off by default) |
|
||||
| `safe` | Minimal, low-risk toolset for locked-down sessions |
|
||||
| `spotify` | Spotify playback and playlist control |
|
||||
| `homeassistant` | Smart home control (off by default) |
|
||||
| `discord` | Discord integration tools |
|
||||
| `discord_admin` | Discord admin/moderation tools |
|
||||
| `feishu_doc` | Feishu (Lark) document tools |
|
||||
| `feishu_drive` | Feishu (Lark) drive tools |
|
||||
| `yuanbao` | Yuanbao integration tools |
|
||||
| `rl` | Reinforcement learning tools (off by default) |
|
||||
| `moa` | Mixture of Agents (off by default) |
|
||||
| `homeassistant` | Smart home control (off by default) |
|
||||
|
||||
Full enumeration lives in `toolsets.py` as the `TOOLSETS` dict; `_HERMES_CORE_TOOLS` is the default bundle most platforms inherit from.
|
||||
|
||||
Tool changes take effect on `/reset` (new session). They do NOT apply mid-conversation to preserve prompt caching.
|
||||
|
||||
|
|
@ -593,6 +629,185 @@ terminal(command="tmux new-session -d -s resumed 'hermes --resume 20260225_14305
|
|||
|
||||
---
|
||||
|
||||
## Durable & Background Systems
|
||||
|
||||
Four systems run alongside the main conversation loop. Quick reference
|
||||
here; full developer notes live in `AGENTS.md`, user-facing docs under
|
||||
`website/docs/user-guide/features/`.
|
||||
|
||||
### Delegation (`delegate_task`)
|
||||
|
||||
Synchronous subagent spawn — the parent waits for the child's summary
|
||||
before continuing its own loop. Isolated context + terminal session.
|
||||
|
||||
- **Single:** `delegate_task(goal, context, toolsets)`.
|
||||
- **Batch:** `delegate_task(tasks=[{goal, ...}, ...])` runs children in
|
||||
parallel, capped by `delegation.max_concurrent_children` (default 3).
|
||||
- **Roles:** `leaf` (default; cannot re-delegate) vs `orchestrator`
|
||||
(can spawn its own workers, bounded by `delegation.max_spawn_depth`).
|
||||
- **Not durable.** If the parent is interrupted, the child is
|
||||
cancelled. For work that must outlive the turn, use `cronjob` or
|
||||
`terminal(background=True, notify_on_complete=True)`.
|
||||
|
||||
Config: `delegation.*` in `config.yaml`.
|
||||
|
||||
### Cron (scheduled jobs)
|
||||
|
||||
Durable scheduler — `cron/jobs.py` + `cron/scheduler.py`. Drive it via
|
||||
the `cronjob` tool, the `hermes cron` CLI (`list`, `add`, `edit`,
|
||||
`pause`, `resume`, `run`, `remove`), or the `/cron` slash command.
|
||||
|
||||
- **Schedules:** duration (`"30m"`, `"2h"`), "every" phrase
|
||||
(`"every monday 9am"`), 5-field cron (`"0 9 * * *"`), or ISO timestamp.
|
||||
- **Per-job knobs:** `skills`, `model`/`provider` override, `script`
|
||||
(pre-run data collection; `no_agent=True` makes the script the whole
|
||||
job), `context_from` (chain job A's output into job B), `workdir`
|
||||
(run in a specific dir with its `AGENTS.md` / `CLAUDE.md` loaded),
|
||||
multi-platform delivery.
|
||||
- **Invariants:** 3-minute hard interrupt per run, `.tick.lock` file
|
||||
prevents duplicate ticks across processes, cron sessions pass
|
||||
`skip_memory=True` by default, and cron deliveries are framed with a
|
||||
header/footer instead of being mirrored into the target gateway
|
||||
session (keeps role alternation intact).
|
||||
|
||||
User docs: https://hermes-agent.nousresearch.com/docs/user-guide/features/cron
|
||||
|
||||
### Curator (skill lifecycle)
|
||||
|
||||
Background maintenance for agent-created skills. Tracks usage, marks
|
||||
idle skills stale, archives stale ones, keeps a pre-run tar.gz backup
|
||||
so nothing is lost.
|
||||
|
||||
- **CLI:** `hermes curator <verb>` — `status`, `run`, `pause`, `resume`,
|
||||
`pin`, `unpin`, `archive`, `restore`, `prune`, `backup`, `rollback`.
|
||||
- **Slash:** `/curator <subcommand>` mirrors the CLI.
|
||||
- **Scope:** only touches skills with `created_by: "agent"` provenance.
|
||||
Bundled + hub-installed skills are off-limits. **Never deletes** —
|
||||
max destructive action is archive. Pinned skills are exempt from
|
||||
every auto-transition and every LLM review pass.
|
||||
- **Telemetry:** sidecar at `~/.hermes/skills/.usage.json` holds
|
||||
per-skill `use_count`, `view_count`, `patch_count`,
|
||||
`last_activity_at`, `state`, `pinned`.
|
||||
|
||||
Config: `curator.*` (`enabled`, `interval_hours`, `min_idle_hours`,
|
||||
`stale_after_days`, `archive_after_days`, `backup.*`).
|
||||
User docs: https://hermes-agent.nousresearch.com/docs/user-guide/features/curator
|
||||
|
||||
### Kanban (multi-agent work queue)
|
||||
|
||||
Durable SQLite board for multi-profile / multi-worker collaboration.
|
||||
Users drive it via `hermes kanban <verb>`; dispatcher-spawned workers
|
||||
see a focused `kanban_*` toolset gated by `HERMES_KANBAN_TASK` so the
|
||||
schema footprint is zero outside worker processes.
|
||||
|
||||
- **CLI verbs (common):** `init`, `create`, `list` (alias `ls`),
|
||||
`show`, `assign`, `link`, `unlink`, `comment`, `complete`, `block`,
|
||||
`unblock`, `archive`, `tail`. Less common: `watch`, `stats`, `runs`,
|
||||
`log`, `dispatch`, `daemon`, `gc`.
|
||||
- **Worker toolset:** `kanban_show`, `kanban_complete`, `kanban_block`,
|
||||
`kanban_heartbeat`, `kanban_comment`, `kanban_create`, `kanban_link`.
|
||||
- **Dispatcher** runs inside the gateway by default
|
||||
(`kanban.dispatch_in_gateway: true`) — reclaims stale claims,
|
||||
promotes ready tasks, atomically claims, spawns assigned profiles.
|
||||
Auto-blocks a task after ~5 consecutive spawn failures.
|
||||
- **Isolation:** board is the hard boundary (workers get
|
||||
`HERMES_KANBAN_BOARD` pinned in env); tenant is a soft namespace
|
||||
within a board for workspace-path + memory-key isolation.
|
||||
|
||||
User docs: https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban
|
||||
|
||||
---
|
||||
|
||||
## Windows-Specific Quirks
|
||||
|
||||
Hermes runs natively on Windows (PowerShell, cmd, Windows Terminal, git-bash
|
||||
mintty, VS Code integrated terminal). Most of it just works, but a handful
|
||||
of differences between Win32 and POSIX have bitten us — document new ones
|
||||
here as you hit them so the next person (or the next session) doesn't
|
||||
rediscover them from scratch.
|
||||
|
||||
### Input / Keybindings
|
||||
|
||||
**Alt+Enter doesn't insert a newline.** Windows Terminal intercepts Alt+Enter
|
||||
at the terminal layer to toggle fullscreen — the keystroke never reaches
|
||||
prompt_toolkit. Use **Ctrl+Enter** instead. Windows Terminal delivers
|
||||
Ctrl+Enter as LF (`c-j`), distinct from plain Enter (`c-m` / CR), and the
|
||||
CLI binds `c-j` to newline insertion on `win32` only (see
|
||||
`_bind_prompt_submit_keys` + the Windows-only `c-j` binding in `cli.py`).
|
||||
Side effect: the raw Ctrl+J keystroke also inserts a newline on Windows —
|
||||
unavoidable, because Windows Terminal collapses Ctrl+Enter and Ctrl+J to
|
||||
the same keycode at the Win32 console API layer. No conflicting binding
|
||||
existed for Ctrl+J on Windows, so this is a harmless side effect.
|
||||
|
||||
mintty / git-bash behaves the same (fullscreen on Alt+Enter) unless you
|
||||
disable Alt+Fn shortcuts in Options → Keys. Easier to just use Ctrl+Enter.
|
||||
|
||||
**Diagnosing keybindings.** Run `python scripts/keystroke_diagnostic.py`
|
||||
(repo root) to see exactly how prompt_toolkit identifies each keystroke
|
||||
in the current terminal. Answers questions like "does Shift+Enter come
|
||||
through as a distinct key?" (almost never — most terminals collapse it
|
||||
to plain Enter) or "what byte sequence is my terminal sending for
|
||||
Ctrl+Enter?" This is how the Ctrl+Enter = c-j fact was established.
|
||||
|
||||
### Config / Files
|
||||
|
||||
**HTTP 400 "No models provided" on first run.** `config.yaml` was saved
|
||||
with a UTF-8 BOM (common when Windows apps write it). Re-save as UTF-8
|
||||
without BOM. `hermes config edit` writes without BOM; manual edits in
|
||||
Notepad are the usual culprit.
|
||||
|
||||
### `execute_code` / Sandbox
|
||||
|
||||
**WinError 10106** ("The requested service provider could not be loaded
|
||||
or initialized") from the sandbox child process — it can't create an
|
||||
`AF_INET` socket, so the loopback-TCP RPC fallback fails before
|
||||
`connect()`. Root cause is usually **not** a broken Winsock LSP; it's
|
||||
Hermes's own env scrubber dropping `SYSTEMROOT` / `WINDIR` / `COMSPEC`
|
||||
from the child env. Python's `socket` module needs `SYSTEMROOT` to locate
|
||||
`mswsock.dll`. Fixed via the `_WINDOWS_ESSENTIAL_ENV_VARS` allowlist in
|
||||
`tools/code_execution_tool.py`. If you still hit it, echo `os.environ`
|
||||
inside an `execute_code` block to confirm `SYSTEMROOT` is set. Full
|
||||
diagnostic recipe in `references/execute-code-sandbox-env-windows.md`.
|
||||
|
||||
### Testing / Contributing
|
||||
|
||||
**`scripts/run_tests.sh` doesn't work as-is on Windows** — it looks for
|
||||
POSIX venv layouts (`.venv/bin/activate`). The Hermes-installed venv at
|
||||
`venv/Scripts/` has no pip or pytest either (stripped for install size).
|
||||
Workaround: install `pytest + pytest-xdist + pyyaml` into a system Python
|
||||
3.11 user site, then invoke pytest directly with `PYTHONPATH` set:
|
||||
|
||||
```bash
|
||||
"/c/Program Files/Python311/python" -m pip install --user pytest pytest-xdist pyyaml
|
||||
export PYTHONPATH="$(pwd)"
|
||||
"/c/Program Files/Python311/python" -m pytest tests/foo/test_bar.py -v --tb=short -n 0
|
||||
```
|
||||
|
||||
Use `-n 0`, not `-n 4` — `pyproject.toml`'s default `addopts` already
|
||||
includes `-n`, and the wrapper's CI-parity guarantees don't apply off POSIX.
|
||||
|
||||
**POSIX-only tests need skip guards.** Common markers already in the codebase:
|
||||
- Symlinks — elevated privileges on Windows
|
||||
- `0o600` file modes — POSIX mode bits not enforced on NTFS by default
|
||||
- `signal.SIGALRM` — Unix-only (see `tests/conftest.py::_enforce_test_timeout`)
|
||||
- Winsock / Windows-specific regressions — `@pytest.mark.skipif(sys.platform != "win32", ...)`
|
||||
|
||||
Use the existing skip-pattern style (`sys.platform == "win32"` or
|
||||
`sys.platform.startswith("win")`) to stay consistent with the rest of the
|
||||
suite.
|
||||
|
||||
### Path / Filesystem
|
||||
|
||||
**Line endings.** Git may warn `LF will be replaced by CRLF the next time
|
||||
Git touches it`. Cosmetic — the repo's `.gitattributes` normalizes. Don't
|
||||
let editors auto-convert committed POSIX-newline files to CRLF.
|
||||
|
||||
**Forward slashes work almost everywhere.** `C:/Users/...` is accepted by
|
||||
every Hermes tool and most Windows APIs. Prefer forward slashes in code
|
||||
and logs — avoids shell-escaping backslashes in bash.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Voice not working
|
||||
|
|
@ -635,7 +850,7 @@ Common gateway problems:
|
|||
### Platform-specific issues
|
||||
- **Discord bot silent**: Must enable **Message Content Intent** in Bot → Privileged Gateway Intents.
|
||||
- **Slack bot only works in DMs**: Must subscribe to `message.channels` event. Without it, the bot ignores public channels.
|
||||
- **Windows HTTP 400 "No models provided"**: Config file encoding issue (BOM). Ensure `config.yaml` is saved as UTF-8 without BOM.
|
||||
- **Windows-specific issues** (`Alt+Enter` newline, WinError 10106, UTF-8 BOM config, test suite, line endings): see the dedicated **Windows-Specific Quirks** section above.
|
||||
|
||||
### Auxiliary models not working
|
||||
If `auxiliary` tasks (vision, compression, session_search) fail silently, the `auto` provider can't find a backend. Either set `OPENROUTER_API_KEY` or `GOOGLE_API_KEY`, or explicitly configure each auxiliary task's provider:
|
||||
|
|
@ -760,6 +975,44 @@ python -m pytest tests/tools/ -q # Specific area
|
|||
- Run full suite before pushing any change
|
||||
- Use `-o 'addopts='` to clear any baked-in pytest flags
|
||||
|
||||
**Windows contributors:** `scripts/run_tests.sh` currently looks for POSIX venvs (`.venv/bin/activate` / `venv/bin/activate`) and will error out on Windows where the layout is `venv/Scripts/activate` + `python.exe`. The Hermes-installed venv at `venv/Scripts/` also has no `pip` or `pytest` — it's stripped for end-user install size. Workaround: install pytest + pytest-xdist + pyyaml into a system Python 3.11 user site (`/c/Program Files/Python311/python -m pip install --user pytest pytest-xdist pyyaml`), then run tests directly:
|
||||
|
||||
```bash
|
||||
export PYTHONPATH="$(pwd)"
|
||||
"/c/Program Files/Python311/python" -m pytest tests/tools/test_foo.py -v --tb=short -n 0
|
||||
```
|
||||
|
||||
Use `-n 0` (not `-n 4`) because `pyproject.toml`'s default `addopts` already includes `-n`, and the wrapper's CI-parity story doesn't apply off-POSIX.
|
||||
|
||||
**Cross-platform test guards:** tests that use POSIX-only syscalls need a skip marker. Common ones already in the codebase:
|
||||
- Symlink creation → `@pytest.mark.skipif(sys.platform == "win32", reason="Symlinks require elevated privileges on Windows")` (see `tests/cron/test_cron_script.py`)
|
||||
- POSIX file modes (0o600, etc.) → `@pytest.mark.skipif(sys.platform.startswith("win"), reason="POSIX mode bits not enforced on Windows")` (see `tests/hermes_cli/test_auth_toctou_file_modes.py`)
|
||||
- `signal.SIGALRM` → Unix-only (see `tests/conftest.py::_enforce_test_timeout`)
|
||||
- Live Winsock / Windows-specific regression tests → `@pytest.mark.skipif(sys.platform != "win32", reason="Windows-specific regression")`
|
||||
|
||||
**Monkeypatching `sys.platform` is not enough** when the code under test also calls `platform.system()` / `platform.release()` / `platform.mac_ver()`. Those functions re-read the real OS independently, so a test that sets `sys.platform = "linux"` on a Windows runner will still see `platform.system() == "Windows"` and route through the Windows branch. Patch all three together:
|
||||
|
||||
```python
|
||||
monkeypatch.setattr(sys, "platform", "linux")
|
||||
monkeypatch.setattr(platform, "system", lambda: "Linux")
|
||||
monkeypatch.setattr(platform, "release", lambda: "6.8.0-generic")
|
||||
```
|
||||
|
||||
See `tests/agent/test_prompt_builder.py::TestEnvironmentHints` for a worked example.
|
||||
|
||||
### Extending the system prompt's execution-environment block
|
||||
|
||||
Factual guidance about the host OS, user home, cwd, terminal backend, and shell (bash vs. PowerShell on Windows) is emitted from `agent/prompt_builder.py::build_environment_hints()`. This is also where the WSL hint and per-backend probe logic live. The convention:
|
||||
|
||||
- **Local terminal backend** → emit host info (OS, `$HOME`, cwd) + Windows-specific notes (hostname ≠ username, `terminal` uses bash not PowerShell).
|
||||
- **Remote terminal backend** (anything in `_REMOTE_TERMINAL_BACKENDS`: `docker, singularity, modal, daytona, ssh, vercel_sandbox, managed_modal`) → **suppress** host info entirely and describe only the backend. A live `uname`/`whoami`/`pwd` probe runs inside the backend via `tools.environments.get_environment(...).execute(...)`, cached per process in `_BACKEND_PROBE_CACHE`, with a static fallback if the probe times out.
|
||||
- **Key fact for prompt authoring:** when `TERMINAL_ENV != "local"`, *every* file tool (`read_file`, `write_file`, `patch`, `search_files`) runs inside the backend container, not on the host. The system prompt must never describe the host in that case — the agent can't touch it.
|
||||
|
||||
Full design notes, the exact emitted strings, and testing pitfalls:
|
||||
`references/prompt-builder-environment-hints.md`.
|
||||
|
||||
**Refactor-safety pattern (POSIX-equivalence guard):** when you extract inline logic into a helper that adds Windows/platform-specific behavior, keep a `_legacy_<name>` oracle function in the test file that's a verbatim copy of the old code, then parametrize-diff against it. Example: `tests/tools/test_code_execution_windows_env.py::TestPosixEquivalence`. This locks in the invariant that POSIX behavior is bit-for-bit identical and makes any future drift fail loudly with a clear diff.
|
||||
|
||||
### Commit Conventions
|
||||
|
||||
```
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ Delegate coding to OpenCode CLI (features, PR review).
|
|||
| Version | `1.2.0` |
|
||||
| Author | Hermes Agent |
|
||||
| License | MIT |
|
||||
| Platforms | linux, macos, windows |
|
||||
| Tags | `Coding-Agent`, `OpenCode`, `Autonomous`, `Refactoring`, `Code-Review` |
|
||||
| Related skills | [`claude-code`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-claude-code), [`codex`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-codex), [`hermes-agent`](/docs/user-guide/skills/bundled/autonomous-ai-agents/autonomous-ai-agents-hermes-agent) |
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue