Hermes Agent 正式支持真正的 Windows 原生运行:一行 PowerShell 命令安装,不需要管理员权限,不需要 WSL,不需要 Docker。
文档不只是安装说明——它详细披露了每个 Windows 专属技术决策的动机,是一份难得一见的技术深度文档。
一行安装
iex (irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1)
安装程序做的事:
- 通过
uv安装 Python 3.11(不需要已有 Python) - 安装 Node.js 22(浏览器工具和 TUI Web bridge 需要)
- 安装 PortableGit(~45MB,不干扰系统已有的 Git)
- Clone 仓库到
%LOCALAPPDATA%\hermes\hermes-agent - 配置虚拟环境,安装所有依赖
- 自动读取
.env里的 Token 配置,按需安装对应平台 SDK - 添加到 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 查找顺序:
HERMES_GIT_BASH_PATH环境变量(安装程序自动设置)%LOCALAPPDATA%\hermes\git\usr\bin\bash.exe(安装程序管理的 PortableGit)- 系统已有的 Git-for-Windows
UTF-8 问题
Python 默认 stdio 在 Windows 上用的是控制台活动代码页(通常是 cp1252),而 Hermes 的 banner、slash 命令列表、Skill 描述都包含 Unicode——没有干预的话全部 UnicodeEncodeError。
修复逻辑在 hermes_cli/stdio.py::configure_windows_stdio(),每次启动自动调用:
- 把控制台代码页切换到 CP_UTF8
- 把
sys.stdout/sys.stderr/sys.stdin重配置为 UTF-8 - 设置
PYTHONIOENCODING=utf-8和PYTHONUTF8=1供子进程继承 - 如果没设置
EDITOR或VISUAL,默认设为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.kill 把 sig=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 原生支持的技术文档写成这样——每一个坑都写出动机、解决方案和替代方案比较——这是开源项目少见的工程态度。