diff --git a/CONTRIBUTING.es.md b/CONTRIBUTING.es.md index 78c80113c6..0ef0023da0 100644 --- a/CONTRIBUTING.es.md +++ b/CONTRIBUTING.es.md @@ -582,7 +582,7 @@ test(tools): añadir tests unitarios para file_operations ## Reportar Issues - Usa [GitHub Issues](https://github.com/NousResearch/hermes-agent/issues) -- Incluye: SO, versión de Python, versión de Hermes (`hermes version`), traza de error completa +- Incluye: SO, versión de Python, versión de Hermes (`hermes --version`), traza de error completa - Incluye pasos para reproducir - Verifica los issues existentes antes de crear duplicados - Para vulnerabilidades de seguridad, por favor reporta de forma privada diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bb157cc8f8..61bacafbd8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -973,7 +973,7 @@ test(tools): add unit tests for file_operations ## Reporting Issues - Use [GitHub Issues](https://github.com/NousResearch/hermes-agent/issues) -- Include: OS, Python version, Hermes version (`hermes version`), full error traceback +- Include: OS, Python version, Hermes version (`hermes --version`), full error traceback - Include steps to reproduce - Check existing issues before creating duplicates - For security vulnerabilities, please report privately diff --git a/SECURITY.es.md b/SECURITY.es.md index 086656d4f7..1328c11609 100644 --- a/SECURITY.es.md +++ b/SECURITY.es.md @@ -16,7 +16,7 @@ Un informe útil incluye: - Una descripción concisa y evaluación de severidad. - El componente afectado, identificado por ruta de archivo y rango de líneas (ej. `path/to/file.py:120-145`). -- Detalles del entorno (`hermes version`, SHA del commit, SO, versión de Python). +- Detalles del entorno (`hermes --version`, SHA del commit, SO, versión de Python). - Una reproducción contra `main` o el último release. - Una declaración de qué límite de confianza del §2 se cruza. diff --git a/SECURITY.md b/SECURITY.md index 7f5fd42db7..cea2a9a2e8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,7 +16,7 @@ A useful report includes: - A concise description and severity assessment. - The affected component, identified by file path and line range (e.g. `path/to/file.py:120-145`). -- Environment details (`hermes version`, commit SHA, OS, Python +- Environment details (`hermes --version`, commit SHA, OS, Python version). - A reproduction against `main` or the latest release. - A statement of which trust boundary in §2 is crossed. diff --git a/hermes_cli/_startup_fast.py b/hermes_cli/_startup_fast.py index c1c38f364d..d74b421b9c 100644 --- a/hermes_cli/_startup_fast.py +++ b/hermes_cli/_startup_fast.py @@ -73,7 +73,7 @@ def is_termux_env() -> bool: def is_termux_fast_version_argv(argv: list[str]) -> bool: - return argv in (["--version"], ["-V"], ["version"]) + return argv in (["--version"], ["-V"]) def is_global_fast_version_argv(argv: list[str]) -> bool: @@ -180,12 +180,43 @@ def read_install_method() -> str | None: return None -def print_fast_version_info() -> None: - from hermes_cli import __release_date__, __version__ +def print_fast_version_info(*, check_updates: bool = True) -> None: + """THE canonical ``hermes --version`` output (also used by /version). + + The static lines print instantly from stdlib-only probes; everything + heavier (upstream SHA in the version line, authoritative install-method + detection, the update-status check) is lazy-imported AFTER the first + line is already on screen, so perceived latency stays instant while the + output carries the full information that used to require the (removed) + ``hermes version`` subcommand. Every lazy block degrades gracefully — + a broken/heavy import can never take the basic version output down. + """ + # Line 1: registry-owned banner label (includes "· upstream " for + # git installs). banner.py keeps rich/prompt_toolkit lazy, so this + # import is light; fall back to the plain label if anything fails. + try: + from hermes_cli.banner import format_banner_version_label + + print(format_banner_version_label()) + except Exception: + from hermes_cli import __release_date__, __version__ + + print(f"Hermes Agent v{__version__} ({__release_date__})") - print(f"Hermes Agent v{__version__} ({__release_date__})") print(f"Install directory: {project_root_str()}") - install_method = read_install_method() + + # Install method: authoritative resolver first (code-scoped stamp → + # managed → nix → git → pip; also self-heals poisoned shared-home + # 'docker' stamps). Fall back to the cheap stdlib stamp probe only if + # the resolver import/run fails. + try: + from pathlib import Path + + from hermes_cli.config import detect_install_method + + install_method = detect_install_method(Path(project_root_str())) + except Exception: + install_method = read_install_method() if install_method: print(f"Install method: {install_method}") @@ -193,17 +224,39 @@ def print_fast_version_info() -> None: openai_version = read_openai_version() print(f"OpenAI SDK: {openai_version}" if openai_version else "OpenAI SDK: Not installed") - print("Run 'hermes version' for update status.") + + if not check_updates: + return + + # Update status (synchronous — acceptable since the user asked for + # version info). Bounded by check_for_updates' own subprocess/network + # timeouts and its 6-hour cache; any failure prints nothing. + try: + from hermes_cli.banner import UPDATE_AVAILABLE_NO_COUNT, check_for_updates + from hermes_cli.config import recommended_update_command + + behind = check_for_updates() + if behind == UPDATE_AVAILABLE_NO_COUNT: + print(f"Update available — run '{recommended_update_command()}'") + elif behind and behind > 0: + commits_word = "commit" if behind == 1 else "commits" + print( + f"Update available: {behind} {commits_word} behind — " + f"run '{recommended_update_command()}'" + ) + elif behind == 0: + print("Up to date") + except Exception: + pass def try_fast_version(argv: list[str] | None = None) -> bool: """Handle ``hermes --version`` before the heavy import wall. - Termux keeps its historical contract (also accepts the ``version`` - subcommand + the HERMES_TERMUX_DISABLE_FAST_CLI escape hatch). Everywhere - else: only ``--version``/``-V`` (the ``version`` subcommand stays on the - slow path for full output incl. update check), and never when container - mode may need to route the command into the container. + Only ``--version``/``-V`` (the ``version`` subcommand was removed — + ``--version`` now carries the full output incl. update status), and + never when container mode may need to route the command into the + container. Termux keeps the HERMES_TERMUX_DISABLE_FAST_CLI escape hatch. """ if argv is None: argv = sys.argv[1:] diff --git a/hermes_cli/console_engine.py b/hermes_cli/console_engine.py index ab644297c0..b52e7a1194 100644 --- a/hermes_cli/console_engine.py +++ b/hermes_cli/console_engine.py @@ -567,6 +567,7 @@ class HermesConsoleEngine: def _register_defaults(self) -> None: self.register(("status",), "status", "Show Hermes component status.", _status) + self.register(("version",), "version", "Show Hermes version information.", _version) self.register(("doctor",), "doctor", "Run diagnostics without auto-fix.", _doctor) self.register(("logs",), "logs [name] [-n N]", "Show recent Hermes logs.", _logs) self.register(("sessions", "list"), "sessions list [--limit N]", "List recent sessions.", _sessions_list) @@ -613,13 +614,6 @@ class HermesConsoleEngine: """Register non-admin CLI commands that are safe for Hermes Console.""" extracted = { - "version": ( - "hermes_cli.subcommands.version", - "build_version_parser", - "cmd_version", - [()], - set(), - ), "dump": ( "hermes_cli.subcommands.dump", "build_dump_parser", @@ -1280,6 +1274,13 @@ def _apply_confirmed_defaults(args: argparse.Namespace) -> None: setattr(args, "yes", True) +def _version(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "version") + from hermes_cli._startup_fast import print_fast_version_info + + return _capture_output(lambda: print_fast_version_info(check_updates=True)) + + def _status(_engine: HermesConsoleEngine, args: list[str]) -> str: _expect_no_args(args, "status") from types import SimpleNamespace diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 33023ae428..88a0c94a29 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -34,7 +34,7 @@ Usage: hermes honcho identity # Show AI peer identity representation hermes honcho identity # Seed AI peer identity from a file (SOUL.md etc.) hermes honcho migrate # Step-by-step migration guide: OpenClaw native → Hermes + Honcho - hermes version Show version + hermes --version Show version and update status hermes update Update to latest version hermes uninstall Uninstall Hermes Agent hermes acp Run as an ACP server for editor integration @@ -468,7 +468,6 @@ from hermes_cli.subcommands.import_agent import build_import_agent_parser from hermes_cli.subcommands.config import build_config_parser from hermes_cli.subcommands.skin import build_skin_parser from hermes_cli.subcommands.console import build_console_parser -from hermes_cli.subcommands.version import build_version_parser from hermes_cli.subcommands.update import build_update_parser from hermes_cli.subcommands.uninstall import build_uninstall_parser from hermes_cli.subcommands.dashboard import build_dashboard_parser @@ -5700,58 +5699,14 @@ def cmd_import(args): def _print_version_info(*, check_updates: bool = True) -> None: - from hermes_cli.config import detect_install_method - from hermes_cli.slash_exec import CommandContext, execute_command - - # Core version line is registry-owned (shared with the gateway /version); - # the install/python/SDK detail below is CLI-only decoration. - print(execute_command("version", CommandContext(surface="cli")).text) - print(f"Install directory: {PROJECT_ROOT}") - print(f"Install method: {detect_install_method(PROJECT_ROOT)}") - - # Show Python version - print(f"Python: {sys.version.split()[0]}") - - # Check for key dependencies. Use importlib.metadata rather than - # ``import openai`` — the SDK drags in ~800ms of pydantic-backed type - # modules just to expose ``__version__``. Metadata lookup is ~2ms. - try: - from importlib.metadata import version as _pkg_version, PackageNotFoundError - - try: - print(f"OpenAI SDK: {_pkg_version('openai')}") - except PackageNotFoundError: - print("OpenAI SDK: Not installed") - except ImportError: - print("OpenAI SDK: Not installed") - - if not check_updates: - return - - # Show update status (synchronous — acceptable since user asked for version info) - try: - from hermes_cli.banner import UPDATE_AVAILABLE_NO_COUNT, check_for_updates - from hermes_cli.config import recommended_update_command - - behind = check_for_updates() - if behind == UPDATE_AVAILABLE_NO_COUNT: - print( - f"Update available — run '{recommended_update_command()}'" - ) - elif behind and behind > 0: - commits_word = "commit" if behind == 1 else "commits" - print( - f"Update available: {behind} {commits_word} behind — " - f"run '{recommended_update_command()}'" - ) - elif behind == 0: - print("Up to date") - except Exception: - pass + # Single source of truth for version output — shared with the + # `hermes --version` pre-import fast path (the `version` subcommand + # was consolidated into `--version`). + _startup_fast.print_fast_version_info(check_updates=check_updates) def cmd_version(args): - """Show version.""" + """Show version (--version/-V flag).""" _print_version_info(check_updates=True) @@ -10198,7 +10153,6 @@ def _coalesce_session_name_args(argv: list) -> list: "mcp", "sessions", "insights", - "version", "update", "uninstall", "profile", @@ -11644,7 +11598,7 @@ _BUILTIN_SUBCOMMANDS = frozenset( "resume", "send", "sessions", "setup", "skin", "skills", "slack", "status", "sync", "tools", "uninstall", "update", - "version", "webhook", "whatsapp", "whatsapp-cloud", "worktree", "chat", "secrets", "security", + "webhook", "whatsapp", "whatsapp-cloud", "worktree", "chat", "secrets", "security", "verify", # Help-ish invocations — plugin commands not being listed in # top-level --help is an acceptable trade-off for skipping an @@ -12004,7 +11958,7 @@ def _try_termux_fast_cli_launch() -> bool: return False if _is_termux_fast_version_argv(argv): - _print_version_info(check_updates=False) + _print_version_info(check_updates=True) return True first = _first_positional_argv() @@ -12022,7 +11976,7 @@ def _try_termux_fast_cli_launch() -> bool: args = parser.parse_args(_coalesce_session_name_args(argv)) if getattr(args, "version", False): - _print_version_info(check_updates=False) + _print_version_info(check_updates=True) return True if getattr(args, "oneshot", None): @@ -12926,7 +12880,7 @@ def main(): # own argparse tree. No hardcoded plugin commands in main.py. # # Skipped when the invocation is already targeting a known built-in - # subcommand — ``hermes --help``, ``hermes version``, ``hermes logs``, + # subcommand — ``hermes --help``, ``hermes logs``, # etc. This avoids eagerly importing every bundled plugin module # (google.cloud.pubsub_v1, aiohttp, grpc, PIL …) which costs # 500-650ms on typical installs. @@ -13801,10 +13755,8 @@ def main(): # ========================================================================= build_claw_parser(subparsers, cmd_claw=cmd_claw) - # ========================================================================= - # version command (parser built in hermes_cli/subcommands/version.py) - # ========================================================================= - build_version_parser(subparsers, cmd_version=cmd_version) + # NOTE: the `hermes version` subcommand was removed — `hermes --version` + # / `-V` now carries the full output including update status. # ========================================================================= # update command (parser built in hermes_cli/subcommands/update.py) diff --git a/hermes_cli/subcommands/version.py b/hermes_cli/subcommands/version.py deleted file mode 100644 index 54346d02b6..0000000000 --- a/hermes_cli/subcommands/version.py +++ /dev/null @@ -1,18 +0,0 @@ -"""``hermes version`` subcommand parser. - -Extracted verbatim from ``hermes_cli/main.py:main()`` (god-file Phase 2). -Handler injected to avoid importing ``main``. -""" - -from __future__ import annotations - -from typing import Callable - - -def build_version_parser(subparsers, *, cmd_version: Callable) -> None: - """Attach the ``version`` subcommand to ``subparsers``.""" - # ========================================================================= - # version command - # ========================================================================= - version_parser = subparsers.add_parser("version", help="Show version information") - version_parser.set_defaults(func=cmd_version) diff --git a/nix/checks.nix b/nix/checks.nix index a9c32176fc..4ec3b7713c 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -571,7 +571,7 @@ json.dump(sorted(leaf_paths(DEFAULT_CONFIG)), sys.stdout, indent=2) echo "PASS: All binaries present" echo "=== Checking version ===" - ${hermes-agent}/bin/hermes version 2>&1 | grep -qi "hermes" || (echo "FAIL: version check"; exit 1) + ${hermes-agent}/bin/hermes --version 2>&1 | grep -qi "hermes" || (echo "FAIL: version check"; exit 1) echo "PASS: Version check" echo "=== All checks passed ===" diff --git a/tests/hermes_cli/test_startup_plugin_gating.py b/tests/hermes_cli/test_startup_plugin_gating.py index 9fef42b431..5f89d06614 100644 --- a/tests/hermes_cli/test_startup_plugin_gating.py +++ b/tests/hermes_cli/test_startup_plugin_gating.py @@ -2,7 +2,7 @@ ``hermes_cli.main`` skips eager plugin discovery at argparse-setup time when the invocation is clearly targeting a known built-in subcommand. -This saves 500-650ms on ``hermes --help``, ``hermes version``, +This saves 500-650ms on ``hermes --help``, ``hermes --version``, ``hermes logs``, etc., by not importing ``google.cloud.pubsub_v1``, ``aiohttp``, ``grpc``, and friends. diff --git a/tests/hermes_cli/test_subcommands_batch.py b/tests/hermes_cli/test_subcommands_batch.py index 522f1cc238..5c4d57f1f3 100644 --- a/tests/hermes_cli/test_subcommands_batch.py +++ b/tests/hermes_cli/test_subcommands_batch.py @@ -35,7 +35,6 @@ from hermes_cli.subcommands.slack import build_slack_parser from hermes_cli.subcommands.status import build_status_parser from hermes_cli.subcommands.uninstall import build_uninstall_parser from hermes_cli.subcommands.update import build_update_parser -from hermes_cli.subcommands.version import build_version_parser from hermes_cli.subcommands.webhook import build_webhook_parser from hermes_cli.subcommands.whatsapp import build_whatsapp_parser @@ -67,7 +66,6 @@ SINGLE_HANDLER_CASES = [ ("backup", build_backup_parser, "cmd_backup", ["backup"]), ("import", build_import_cmd_parser, "cmd_import", ["import", "/tmp/x.zip"]), ("config", build_config_parser, "cmd_config", ["config"]), - ("version", build_version_parser, "cmd_version", ["version"]), ("update", build_update_parser, "cmd_update", ["update"]), ("uninstall", build_uninstall_parser, "cmd_uninstall", ["uninstall"]), ("gui", build_gui_parser, "cmd_gui", ["gui"]), diff --git a/website/docs/developer-guide/contributing.md b/website/docs/developer-guide/contributing.md index 3ed14ba030..4d3b00d576 100644 --- a/website/docs/developer-guide/contributing.md +++ b/website/docs/developer-guide/contributing.md @@ -287,7 +287,7 @@ When you ask Hermes to review a PR in a repository that has `.agents/checks/`, t ## Reporting Issues - Use [GitHub Issues](https://github.com/NousResearch/hermes-agent/issues) -- Include: OS, Python version, Hermes version (`hermes version`), full error traceback +- Include: OS, Python version, Hermes version (`hermes --version`), full error traceback - Include steps to reproduce - Check existing issues before creating duplicates - For security vulnerabilities, please report privately diff --git a/website/docs/getting-started/nix-setup.md b/website/docs/getting-started/nix-setup.md index 43c2f268bd..a663721a91 100644 --- a/website/docs/getting-started/nix-setup.md +++ b/website/docs/getting-started/nix-setup.md @@ -147,7 +147,7 @@ Setting `addToSystemPackages = true` does two things: puts the `hermes` CLI on y :::info When `container.enable = true` and `addToSystemPackages = true`, **every** `hermes` command on the host automatically routes into the managed container. This means your interactive CLI session runs inside the same environment as the gateway service — with access to all container-installed packages and tools. -- The routing is transparent: `hermes chat`, `hermes sessions list`, `hermes version`, etc. all exec into the container under the hood +- The routing is transparent: `hermes chat`, `hermes sessions list`, `hermes --version`, etc. all exec into the container under the hood - All CLI flags are forwarded as-is - If the container isn't running, the CLI retries briefly (5s with a spinner for interactive use, 10s silently for scripts) then fails with a clear error — no silent fallback - For developers working on the hermes codebase, set `HERMES_DEV=1` to bypass container routing and run the local checkout directly @@ -191,7 +191,7 @@ systemctl status hermes-agent journalctl -u hermes-agent -f # If addToSystemPackages is true, test the CLI -hermes version +hermes --version hermes config # shows the generated config ``` @@ -681,7 +681,7 @@ journalctl --user -u hermes-agent -f launchctl list | grep hermes tail -f ~/Library/Logs/hermes-agent.log -hermes version +hermes --version hermes config # shows the configuration that Nix wrote ``` @@ -937,7 +937,7 @@ nix build .#checks.x86_64-linux.config-roundtrip # merge script preserves use | Check | What it tests | |---|---| -| `package-contents` | `hermes` and `hermes-agent` binaries exist and `hermes version` runs | +| `package-contents` | `hermes` and `hermes-agent` binaries exist and `hermes --version` runs | | `entry-points-sync` | Every `[project.scripts]` entry in `pyproject.toml` has a wrapped binary in the Nix package | | `cli-commands` | `hermes --help` exposes `gateway` and `config` subcommands | | `managed-guard` | `HERMES_MANAGED=true hermes config set ...` prints the NixOS error | @@ -1180,7 +1180,7 @@ nix-store --query --roots $(docker exec hermes-agent readlink /data/current-pack | `Cannot save configuration: managed by NixOS` | CLI guards active | Edit `configuration.nix` and `nixos-rebuild switch` | | `No adapter available for discord` (or telegram/slack) | Messaging deps missing from the sealed Nix venv | Install `#messaging` variant: `nix profile install ...#messaging`. For NixOS module: `extraDependencyGroups = [ "messaging" ]`. Check `journalctl -u hermes-agent` for `FeatureUnavailable` or `requirements not met` for the underlying error. | | Container recreated unexpectedly | `extraVolumes`, `extraOptions`, or `image` changed | Expected — writable layer resets. Reinstall packages or use a custom image | -| `hermes version` shows old version | Container not restarted | `systemctl restart hermes-agent` | +| `hermes --version` shows old version | Container not restarted | `systemctl restart hermes-agent` | | Permission denied on `/var/lib/hermes` | State dir is `0750 hermes:hermes` | Use `docker exec` or `sudo -u hermes` | | `nix-collect-garbage` removed hermes | GC root missing | Restart the service (preStart recreates the GC root) | | `no container with name or ID "hermes-agent"` (Podman) | Podman rootful container not visible to regular user | Add passwordless sudo for podman (see [Container Mode](#container-mode) section) | diff --git a/website/docs/getting-started/termux.md b/website/docs/getting-started/termux.md index 529ed52216..6b31efb30c 100644 --- a/website/docs/getting-started/termux.md +++ b/website/docs/getting-started/termux.md @@ -157,7 +157,7 @@ ln -sf "$PWD/venv/bin/hermes" "$PREFIX/bin/hermes" ### 6. Verify the install ```bash -hermes version +hermes --version hermes doctor ``` diff --git a/website/docs/getting-started/updating.md b/website/docs/getting-started/updating.md index ab51e86541..0181b59f2c 100644 --- a/website/docs/getting-started/updating.md +++ b/website/docs/getting-started/updating.md @@ -170,7 +170,7 @@ You no longer need to wrap `hermes update` in `screen` or `tmux` to survive a te ### Checking your current version ```bash -hermes version +hermes --version ``` Compare against the latest release at the [GitHub releases page](https://github.com/NousResearch/hermes-agent/releases). diff --git a/website/docs/reference/cli-commands.md b/website/docs/reference/cli-commands.md index 226e33db83..7d434df6db 100644 --- a/website/docs/reference/cli-commands.md +++ b/website/docs/reference/cli-commands.md @@ -97,7 +97,7 @@ hermes [global-options] [subcommand/options] | `hermes desktop` (alias `gui`) | Build and launch the native Electron desktop app. | | `hermes profile` | Manage profiles — multiple isolated Hermes instances. | | `hermes completion` | Print shell completion scripts (bash/zsh/fish). | -| `hermes version` | Show version information. | +| `hermes --version` | Show version information. | | `hermes update` | Pull latest code and reinstall dependencies. `--check` previews without installing; `--backup` takes a pre-pull `HERMES_HOME` snapshot. | | `hermes uninstall` | Remove Hermes from the system. | @@ -1758,7 +1758,7 @@ Additional behavior: | Command | Description | |---------|-------------| -| `hermes version` | Print version information. | +| `hermes --version` | Print version information. | | `hermes update` | Pull latest changes and reinstall dependencies. | | `hermes uninstall [--full] [--gui] [--dry-run] [--yes]` | Remove Hermes, optionally deleting all config/data. `--gui` removes only the desktop Chat GUI, leaving the agent intact; `--full` also deletes config/data; `--dry-run` prints what would be removed without changing anything; `--yes` skips prompts. | diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/contributing.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/contributing.md index 2122a16fa2..23abbfd94e 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/contributing.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/contributing.md @@ -237,7 +237,7 @@ fix(security): prevent shell injection in sudo password piping ## 报告问题 - 使用 [GitHub Issues](https://github.com/NousResearch/hermes-agent/issues) -- 请包含:操作系统、Python 版本、Hermes 版本(`hermes version`)、完整错误堆栈 +- 请包含:操作系统、Python 版本、Hermes 版本(`hermes --version`)、完整错误堆栈 - 包含复现步骤 - 创建前请检查是否已有重复 issue - 安全漏洞请私下报告 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/nix-setup.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/nix-setup.md index eb003cd325..dc8f822838 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/nix-setup.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/nix-setup.md @@ -127,7 +127,7 @@ services.hermes-agent.environmentFiles = [ "/var/lib/hermes/env" ]; :::info 当 `container.enable = true` 且 `addToSystemPackages = true` 时,主机上的**所有** `hermes` 命令都会自动路由到托管容器中执行。这意味着你的交互式 CLI 会话在与 gateway 服务相同的环境中运行——可以访问所有容器内安装的包和工具。 -- 路由是透明的:`hermes chat`、`hermes sessions list`、`hermes version` 等命令都会在底层 exec 进容器 +- 路由是透明的:`hermes chat`、`hermes sessions list`、`hermes --version` 等命令都会在底层 exec 进容器 - 所有 CLI 参数原样转发 - 如果容器未运行,CLI 会短暂重试(交互式使用时显示 5 秒 spinner,脚本中静默等待 10 秒),然后以明确的错误退出——不会静默回退 - 对于在 hermes 代码库上工作的开发者,设置 `HERMES_DEV=1` 可绕过容器路由,直接运行本地检出版本 @@ -171,7 +171,7 @@ systemctl status hermes-agent journalctl -u hermes-agent -f # 如果 addToSystemPackages 为 true,测试 CLI -hermes version +hermes --version hermes config # 显示生成的配置 ``` @@ -763,7 +763,7 @@ nix build .#checks.x86_64-linux.config-roundtrip # 合并脚本保留用户 | 检查 | 测试内容 | |---|---| -| `package-contents` | `hermes` 和 `hermes-agent` 二进制文件存在且 `hermes version` 可运行 | +| `package-contents` | `hermes` 和 `hermes-agent` 二进制文件存在且 `hermes --version` 可运行 | | `entry-points-sync` | `pyproject.toml` 中 `[project.scripts]` 的每个条目在 Nix 包中都有对应的封装二进制文件 | | `cli-commands` | `hermes --help` 暴露 `gateway` 和 `config` 子命令 | | `managed-guard` | `HERMES_MANAGED=true hermes config set ...` 打印 NixOS 错误 | @@ -967,7 +967,7 @@ nix-store --query --roots $(docker exec hermes-agent readlink /data/current-pack |---|---|---| | `Cannot save configuration: managed by NixOS` | CLI 守卫已激活 | 编辑 `configuration.nix` 并执行 `nixos-rebuild switch` | | 容器意外重建 | `extraVolumes`、`extraOptions` 或 `image` 发生变更 | 预期行为——可写层重置。重新安装包或使用自定义镜像 | -| `hermes version` 显示旧版本 | 容器未重启 | `systemctl restart hermes-agent` | +| `hermes --version` 显示旧版本 | 容器未重启 | `systemctl restart hermes-agent` | | `/var/lib/hermes` 权限拒绝 | 状态目录为 `0750 hermes:hermes` | 使用 `docker exec` 或 `sudo -u hermes` | | `nix-collect-garbage` 删除了 hermes | GC root 缺失 | 重启服务(preStart 会重新创建 GC root) | | `no container with name or ID "hermes-agent"`(Podman) | Podman rootful 容器对普通用户不可见 | 为 podman 添加免密 sudo(参见[容器模式](#container-mode)章节) | diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/termux.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/termux.md index 1500cc39e1..57d051280b 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/termux.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/termux.md @@ -118,7 +118,7 @@ ln -sf "$PWD/venv/bin/hermes" "$PREFIX/bin/hermes" ### 6. 验证安装 ```bash -hermes version +hermes --version hermes doctor ``` diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/updating.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/updating.md index f3c1b95992..689cb770dc 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/updating.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/getting-started/updating.md @@ -120,7 +120,7 @@ tail -f ~/.hermes/logs/update.log ### 查看当前版本 ```bash -hermes version +hermes --version ``` 与 [GitHub releases 页面](https://github.com/NousResearch/hermes-agent/releases) 上的最新版本进行比较。 diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli-commands.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli-commands.md index 7f51fabb3b..55062381e7 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli-commands.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/reference/cli-commands.md @@ -78,7 +78,7 @@ hermes [global-options] [subcommand/options] | `hermes dashboard` | 启动用于管理配置、API 密钥和会话的 Web 控制台。 | | `hermes profile` | 管理 profile——多个隔离的 Hermes 实例。 | | `hermes completion` | 打印 shell 补全脚本(bash/zsh/fish)。 | -| `hermes version` | 显示版本信息。 | +| `hermes --version` | 显示版本信息。 | | `hermes update` | 拉取最新代码并重新安装依赖。`--check` 预览而不安装;`--backup` 在拉取前对 `HERMES_HOME` 进行快照。 | | `hermes uninstall` | 从系统中删除 Hermes。 | @@ -1246,7 +1246,7 @@ hermes update [--check] [--backup] [--restart-gateway] | 命令 | 说明 | |---------|-------------| -| `hermes version` | 打印版本信息。 | +| `hermes --version` | 打印版本信息。 | | `hermes update` | 拉取最新变更并重新安装依赖。 | | `hermes uninstall [--full] [--yes]` | 删除 Hermes,可选择删除所有 config/数据。 |