返回 FEED
AGENT2026-06-02

Hermes 发布 Windows 原生版:一个命令安装,无需 WSL

Hermes Agent 正式支持真正的 Windows 原生运行:一行 PowerShell 命令安装,不需要管理员权限,不需要 WSL,不需要 Docker。

文档不只是安装说明——它详细披露了每个 Windows 专属技术决策的动机,是一份难得一见的技术深度文档。

一行安装

iex (irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1)

安装程序做的事:

  1. 通过 uv 安装 Python 3.11(不需要已有 Python)
  2. 安装 Node.js 22(浏览器工具和 TUI Web bridge 需要)
  3. 安装 PortableGit(~45MB,不干扰系统已有的 Git)
  4. Clone 仓库到 %LOCALAPPDATA%\hermes\hermes-agent
  5. 配置虚拟环境,安装所有依赖
  6. 自动读取 .env 里的 Token 配置,按需安装对应平台 SDK
  7. 添加到 User PATH

数据布局设计很清晰:

路径内容
%LOCALAPPDATA%\hermes\可丢弃的基础设施(重装可恢复)
%USERPROFILE%\.hermes\你的配置、认证、Skills、Session(重装保留)

功能矩阵

除了 Dashboard 的嵌入式终端面板,其他所有功能都已在 Windows 原生支持:

功能原生WSL2
CLI / TUI
Messaging gateway(Telegram、Discord、WhatsApp 等 15+ 平台)
Cron scheduler
浏览器工具(Chromium)
MCP servers
Dashboard(会话、Jobs、指标)
Dashboard /chat 嵌入式终端

Dashboard 的 /chat 标签页嵌入的是真正的 POSIX PTY,Windows 原生没有等价原语,所以这个 Tab 只能显示"请用 WSL2"。其余所有面板都正常。

Shell 命令怎么跑

Hermes 的终端工具通过 Git Bash 执行命令,和 Claude Code 一样的策略。好处是不需要重写任何一个工具脚本。

bash.exe 查找顺序:

  1. HERMES_GIT_BASH_PATH 环境变量(安装程序自动设置)
  2. %LOCALAPPDATA%\hermes\git\usr\bin\bash.exe(安装程序管理的 PortableGit)
  3. 系统已有的 Git-for-Windows

UTF-8 问题

Python 默认 stdio 在 Windows 上用的是控制台活动代码页(通常是 cp1252),而 Hermes 的 banner、slash 命令列表、Skill 描述都包含 Unicode——没有干预的话全部 UnicodeEncodeError

修复逻辑在 hermes_cli/stdio.py::configure_windows_stdio(),每次启动自动调用:

  1. 把控制台代码页切换到 CP_UTF8
  2. sys.stdout / sys.stderr / sys.stdin 重配置为 UTF-8
  3. 设置 PYTHONIOENCODING=utf-8PYTHONUTF8=1 供子进程继承
  4. 如果没设置 EDITORVISUAL,默认设为 notepad

编辑器配置

Ctrl-X Ctrl-E 或输入 /edit 会打开外部编辑器。Windows 上 prompt_toolkit 有一个硬编码的 POSIX 绝对路径列表(/usr/bin/nano 等),在 Windows 上永远不生效。Hermes 的 stdio shim 默认设置 EDITOR=notepad,保证每个 Windows 安装都能用。

其他编辑器配置:

# VS Code(--wait 标志是关键,否则编辑器立即返回,Hermes 收到空 buffer)
$env:EDITOR = "code --wait"

# 永久写入 PowerShell 配置文件
# In $PROFILE
$env:EDITOR = "code --wait"

开机自启

hermes gateway install 使用 Scheduled Tasks(不需要管理员权限):

hermes gateway install   # 注册 ONLOGON 触发任务
hermes gateway status    # 查看任务状态 + 当前 PID
hermes gateway stop      # 优雅停止
hermes gateway restart
hermes gateway uninstall # 移除任务,保留用户数据

为什么不用 Windows Service?Service 需要管理员权限,且绑定到机器启动而不是用户登录。典型用户的需求是"登录 → gateway 可用,登出 → gateway 关闭",Scheduled Tasks 完美匹配。

Gateway 通过 pythonw.exe 守护进程启动(无控制台),免疫同级进程组的 CTRL_C_EVENT 广播——这是 Windows 上一个真实的坑。

那个 Python 2012 年的 Bug

文档里有一段"Process management internals",值得单独提:

在 Linux 和 macOS,os.kill(pid, 0) 是权限检查:"这个 PID 活着吗?"在 Windows 上,Python 的 os.killsig=0 映射到 CTRL_C_EVENT,并通过 GenerateConsoleCtrlEvent(0, pid) 广播到目标 PID 所在的整个控制台进程组。这是 Python 官方的 bpo-14484,2012 年开放,至今未修复。

后果:任何用 os.kill(pid, 0)"检查进程是否存活"的代码,在 Windows 上实际在杀掉目标进程。Hermes 迁移了 11 个文件里的 14 处,全部改成 psutil.pid_exists()(底层用 OpenProcess + GetExitCodeProcess,不发送信号)。CI 里有一个 scripts/check-windows-footguns.py 强制检查,新代码里出现 os.kill(pid, 0) 会直接 CI 失败。


Windows 原生支持的技术文档写成这样——每一个坑都写出动机、解决方案和替代方案比较——这是开源项目少见的工程态度。