Pular para o conteúdo principal

Documentação oficial desta página · v0.20.6

Windows (Nativo)

O Hermes roda nativamente no Windows 10 e no Windows 11 — sem WSL, sem Cygwin, sem Docker. Esta página é o mergulho profundo: o que funciona nativamente, o que só existe no WSL, o que o instalador realmente faz e os ajustes específicos do Windows que você talvez precise mexer.

Se você só quer instalar, o comando de uma linha da página inicial ou da página de Instalação já basta. Volte aqui quando algo te surpreender.

Prefere o WSL?

Se você prefere um ambiente POSIX de verdade (para o terminal embutido do dashboard, a semântica de fork, observadores de arquivo no estilo Linux etc.), veja o Guia do Windows (WSL2). Os dois convivem sem conflito: os dados nativos ficam em %LOCALAPPDATA%\hermes, os dados do WSL ficam em ~/.hermes.

Instalação rápida​

Abra o PowerShell (ou o Windows Terminal) e rode:

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

Não precisa de direitos de administrador. O instalador vai para %LOCALAPPDATA%\hermes\ e adiciona o hermes ao PATH do seu usuário — abra um terminal novo depois que ele terminar.

Opções do instalador (exigem a forma com scriptblock para passar parâmetros):

& ([scriptblock]::Create((irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1))) -NoVenv -SkipSetup -Branch main
ParâmetroPadrãoPara que serve
-BranchmainClona um branch específico (útil para testar PRs)
-Commitnão definidoFixa a instalação em um SHA de commit específico (sobrepõe o -Branch)
-Tagnão definidoFixa a instalação em uma tag git específica (ex.: v0.14.0)
-NoVenvdesligadoPula a criação do venv (avançado — você mesmo cuida do Python)
-SkipSetupdesligadoPula o assistente hermes setup pós-instalação
-HermesHome%LOCALAPPDATA%\hermesMuda o diretório de dados
-InstallDir%LOCALAPPDATA%\hermes\hermes-agentMuda o local do código

O instalador tenta de novo automaticamente quando um fetch do git falha e remove o BOM de qualquer payload de install.ps1 baixado, então um BOM UTF-8 pego durante o trânsito HTTP não quebra mais a forma [scriptblock]::Create((irm ...)).

Instalador desktop (alternativa)​

Também existe um instalador gráfico enxuto — útil se você preferir dar dois cliques em um .exe a abrir o PowerShell. Baixe o Hermes Desktop, rode o instalador e, na primeira execução, a interface chama o install.ps1 por baixo dos panos para provisionar Python (via uv), Node, PortableGit e o resto do bootstrap de dependências descrito abaixo. Depois da primeira execução, o aplicativo desktop e a CLI hermes instalada pelo PowerShell compartilham a mesma instalação em %LOCALAPPDATA%\hermes\hermes-agent e o mesmo diretório de dados %LOCALAPPDATA%\hermes — alterne entre a interface gráfica e a CLI à vontade.

Use o instalador desktop quando quiser uma experiência de instalação familiar do Windows ou quando estiver entregando o Hermes para alguém que não é desenvolvedor; use o comando de uma linha do PowerShell quando você já estiver no terminal.

Bootstrap de dependências (dep_ensure)​

Na primeira execução (e sob demanda, quando uma ferramenta ausente é detectada), o Hermes roda um pequeno bootstrapper em Python — hermes_cli/dep_ensure.py — que verifica e instala preguiçosamente as dependências não-Python de que precisa. No Windows, as relevantes são:

DependênciaPor que o Hermes precisa dela
PortableGitFornece o bash.exe para a ferramenta de terminal e o git para clones dentro da sessão. Provisionado na hora da instalação, não pelo dep_ensure.
Node.js 26Necessário para a ferramenta de navegador (agent-browser), a ponte web da TUI e a ponte do WhatsApp.
ffmpegConversão de formato de áudio para TTS / mensagens de voz.
ripgrepBusca rápida em arquivos — cai para o grep se não estiver disponível.
pacotes npmO agent-browser, o Chromium do Playwright e quaisquer dependências Node por toolset são instalados uma vez, no primeiro uso da ferramenta de navegador.

Cada dependência tem uma checagem no estilo shutil.which(...); se um binário estiver faltando e a execução for interativa, o dep_ensure oferece instalá-lo (delegando a instalação de fato para scripts\install.ps1 -ensure <dep>). Execuções não interativas (gateway, cron, aberturas headless do desktop) pulam a pergunta e mostram um erro claro do tipo this feature needs <dep>.

O que o instalador realmente faz​

De cima a baixo, em ordem:

  1. Faz o bootstrap do uv — o gerenciador rápido de Python da Astral. Instalado em %USERPROFILE%\.local\bin.
  2. Instala o Python 3.11 via uv. Não precisa de nenhum Python existente.
  3. Instala o Node.js 26 (winget se disponível, senão um tarball portátil do Node descompactado em %LOCALAPPDATA%\hermes\node). Usado pela ferramenta de navegador e pela ponte do WhatsApp.
  4. Instala o Git portátil — se o git já estiver no PATH, o instalador usa ele; caso contrário, baixa um PortableGit enxuto e autocontido (~45 MB, da release oficial do git-for-windows) em %LOCALAPPDATA%\hermes\git. Sem admin, sem registro de instalador do Windows, sem interferir em mais nada da máquina.
  5. Clona o repositório em %LOCALAPPDATA%\hermes\hermes-agent e cria um virtualenv dentro dele.
  6. uv pip install em camadas — tenta o .[all] primeiro e vai caindo para conjuntos progressivamente menores ([messaging,dashboard,ext] → [messaging] → .) se alguma dependência git+https falhar por limite de taxa do GitHub. Evita o modo de falha "um tropeço te deixa com uma instalação pelada".
  7. Instala automaticamente os SDKs de mensagens com base no .env — se TELEGRAM_BOT_TOKEN / DISCORD_BOT_TOKEN / SLACK_BOT_TOKEN / SLACK_APP_TOKEN / WHATSAPP_ENABLED estiverem presentes, roda python -m ensurepip --upgrade e chamadas pip install direcionadas para que o SDK de cada plataforma seja de fato importável.
  8. Define HERMES_GIT_BASH_PATH para o bash.exe resolvido, para que o Hermes o encontre de forma determinística em shells novos.
  9. Adiciona %LOCALAPPDATA%\hermes\bin ao PATH do usuário e define HERMES_HOME=%LOCALAPPDATA%\hermes — expõe o comando hermes (e o aponta para o seu diretório de dados) depois que você abrir um terminal novo. Só os lançadores hermes.exe / hermes-acp.exe são copiados para esse diretório bin; o venv\Scripts completo não é colocado no PATH de propósito, para que o Hermes nunca sombreie o seu próprio comando python.
  10. Roda o hermes setup — o assistente normal de primeira execução (modelo, provedor, toolsets). Pule com -SkipSetup.
Pule a caça a provedores no Windows

No Windows, configurar chave de API por ferramenta (Firecrawl, FAL, Browser Use, OpenAI TTS) é a parte mais chata de conseguir um agente útil. Uma assinatura do Nous Portal cobre o modelo e todas essas ferramentas com um único login OAuth. Depois que o instalador terminar, rode hermes setup --portal para ligar tudo.

Matriz de recursos​

Tudo, exceto o painel de terminal embutido do dashboard, roda nativamente no Windows.

RecursoWindows nativoWSL2
CLI (hermes chat, hermes setup, hermes gateway, …)✓✓
TUI interativa (hermes --tui)✓✓
Gateway de mensagens (Telegram, Discord, Slack, WhatsApp, mais de 15 plataformas)✓✓
Agendador cron✓✓
Ferramenta de navegador (Chromium via Node)✓✓
Servidores MCP (stdio e HTTP)✓✓
Ollama / LM Studio / llama-server locais✓✓ (via rede do WSL)
Dashboard web (sessões, jobs, métricas, configuração)✓✓
Painel de terminal embutido em /chat no dashboard✗ (precisa de PTY POSIX)✓
Início automático no login✓ (schtasks)✓ (systemd)

A aba /chat do dashboard embute um terminal de verdade via um PTY POSIX (ptyprocess). O Windows nativo não tem primitiva equivalente; o pywinpty do Python / o ConPTY do Windows funcionariam, mas são uma implementação separada — trate como trabalho futuro. O resto do dashboard funciona nativamente — só essa aba mostra um aviso de "use o WSL2 para isso".

Como o Hermes roda comandos de shell no Windows​

A ferramenta de terminal do Hermes roda comandos pelo Git Bash, a mesma estratégia que o Claude Code usa. Isso contorna a diferença entre POSIX e Windows sem reescrever cada ferramenta.

Ordem de resolução do bash.exe:

  1. A variável de ambiente HERMES_GIT_BASH_PATH, se estiver definida.
  2. %LOCALAPPDATA%\hermes\git\usr\bin\bash.exe (PortableGit gerenciado pelo instalador).
  3. %LOCALAPPDATA%\hermes\git\bin\bash.exe (layout antigo do Git-for-Windows).
  4. Instalação do Git-for-Windows do sistema (%ProgramFiles%\Git\bin\bash.exe etc.).
  5. MSYS2, Cygwin ou qualquer bash.exe no PATH, como último recurso.

O instalador define o HERMES_GIT_BASH_PATH explicitamente para que sessões novas do PowerShell não tenham que redescobrir. Sobrescreva se quiser que o Hermes use um bash específico — por exemplo, o Git Bash do seu sistema ou um bash hospedado no WSL via symlink.

Pegadinha: o layout do MinGit é diferente do instalador completo do Git-for-Windows — o bash fica em usr\bin\bash.exe, não em bin\bash.exe. O Hermes verifica os dois. Se você estiver descompactando um zip do MinGit na mão, escolha a variante não-busybox (MinGit-*-64-bit.zip, não MinGit-*-busybox*.zip) — builds busybox trazem o ash no lugar do bash e faltam quase todos os coreutils.

Console UTF-8 no Windows​

O stdio padrão do Python no Windows usa a página de código ativa do console (normalmente cp1252 ou cp437). O banner do Hermes, a lista de comandos com barra, o feed de ferramentas, os painéis do Rich e as descrições de skills contêm Unicode. Sem intervenção, qualquer um deles quebra com UnicodeEncodeError: 'charmap' codec can't encode character….

A correção está em hermes_cli/stdio.py::configure_windows_stdio(), chamada cedo em todo ponto de entrada (cli.py::main, hermes_cli/main.py::main, gateway/run.py::main). Ela:

  1. Vira a página de código do console para CP_UTF8 (65001) via kernel32.SetConsoleCP / SetConsoleOutputCP.
  2. Reconfigura sys.stdout / sys.stderr / sys.stdin para UTF-8 com errors='replace'.
  3. Define PYTHONIOENCODING=utf-8 e PYTHONUTF8=1 (via setdefault, então valores explícitos do usuário ganham) para que subprocessos Python filhos herdem o UTF-8.
  4. Define EDITOR=notepad se nem EDITOR nem VISUAL estiverem definidos (veja a seção do editor abaixo).

É idempotente. Não faz nada fora do Windows.

Como recusar: HERMES_DISABLE_WINDOWS_UTF8=1 no ambiente volta ao caminho antigo de stdio em cp1252. Útil para bissecar um bug de codificação; dificilmente é a configuração certa no uso normal.

O editor (Ctrl-X Ctrl-E, /edit)​

Antes do #21561, apertar Ctrl-X Ctrl-E ou digitar /edit não fazia nada no Windows, em silêncio. O prompt_toolkit tem uma lista de fallback com caminhos POSIX absolutos fixos no código (/usr/bin/nano, /usr/bin/pico, /usr/bin/vi, …) que nunca resolve no Windows — nem com o Git for Windows completo instalado.

O shim de stdio do Hermes para Windows agora define EDITOR=notepad como padrão. O Bloco de Notas vem em toda instalação do Windows e funciona como editor bloqueante — subprocess.call(["notepad", file]) bloqueia até a janela fechar.

As suas sobrescritas continuam ganhando (elas são checadas antes do setdefault):

EditorComando no PowerShell
VS Code$env:EDITOR = "code --wait"
Notepad++$env:EDITOR = "'C:\Program Files\Notepad++\notepad++.exe' -multiInst -nosession"
Neovim$env:EDITOR = "nvim"
Helix$env:EDITOR = "hx"

A opção --wait no VS Code é essencial — sem ela o editor retorna na hora e o Hermes recebe um buffer vazio de volta.

Defina permanentemente no seu perfil do PowerShell:

# No $PROFILE
$env:EDITOR = "code --wait"

Ou como variável de ambiente de usuário nas Configurações do Sistema, para que todo shell novo pegue.

Ctrl+Enter para nova linha na CLI​

O Windows Terminal repassa o Ctrl+Enter como uma sequência de teclas dedicada. O Hermes associa isso a "inserir nova linha", para que você componha prompts de várias linhas na CLI sem recorrer a Esc-depois-Enter. Funciona no Windows Terminal, no terminal integrado do VS Code e em qualquer host de console moderno do Windows que respeite sequências de escape VT.

Em consoles cmd.exe antigos, o Ctrl+Enter vira um Enter simples — use Esc Enter no lugar, ou migre para o Windows Terminal (é grátis e já vem instalado no Windows 11).

Rodando o gateway no login do Windows​

O hermes gateway install no Windows usa Tarefas Agendadas com fallback para a pasta de Inicialização — sem precisar de admin.

Instalar​

hermes gateway install

O que acontece por baixo dos panos:

  1. schtasks /Create /SC ONLOGON /RL LIMITED /TN HermesGateway — registra uma tarefa que roda no seu login com permissões padrão (não elevadas). Sem prompt do UAC.
  2. Se o schtasks estiver bloqueado por política de grupo, cai para escrever um atalho start /min cmd.exe /d /c <wrapper> em %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup. Mesmo efeito, um pouco mais rústico.
  3. Cria o gateway destacado, via pythonw.exe — não python.exe. O pythonw.exe não tem console anexado, o que o imuniza contra transmissões de CTRL_C_EVENT de processos irmãos (um problema real que costumava matar o gateway quando você dava Ctrl+C em qualquer coisa do mesmo grupo de processos).

Flags usadas na criação: DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB.

Gerenciar​

hermes gateway status # Visão combinada: schtasks + pasta Startup + PID em execução
hermes gateway start # Inicia a tarefa agendada agora
hermes gateway stop # Equivalente a um SIGTERM gracioso (TerminateProcess via psutil)
hermes gateway restart
hermes gateway uninstall # Remove a entrada do schtasks, o atalho do Startup e o arquivo de pid

O hermes gateway status é idempotente — chame mil vezes seguidas e ele nunca vai matar o gateway sem querer. (Antes do PR #21561 ele matava, em silêncio, porque os.kill(pid, 0) colidia com o CTRL_C_EVENT no nível do C — veja "detalhes internos do gerenciamento de processos" abaixo se você quiser a história.)

Por que não um Serviço do Windows?​

Serviços exigem direitos de administrador para instalar e amarram o ciclo de vida do gateway ao boot da máquina, e não ao login do usuário. O usuário típico do Hermes quer: fez login → gateway disponível, saiu → gateway sumiu. As Tarefas Agendadas fazem exatamente isso sem elevação. Se você realmente quiser um serviço, use nssm ou sc create na mão — mas provavelmente não quer.

Organização dos dados​

CaminhoConteúdo
%LOCALAPPDATA%\hermes\hermes-agent\Checkout do git + venv. Pode dar Remove-Item -Recurse e reinstalar sem medo.
%LOCALAPPDATA%\hermes\git\PortableGit (só se o instalador provisionou).
%LOCALAPPDATA%\hermes\node\Node.js portátil (só se o instalador provisionou).
%LOCALAPPDATA%\hermes\bin\Os lançadores hermes / hermes-acp e o uv.exe gerenciado pelo Hermes (o gerenciador de Python que ele usa nas atualizações).
%LOCALAPPDATA%\hermes\ (raiz)Sua configuração, autenticação, skills, sessões e logs (config.yaml, .env, skills\, sessions\, logs\, …). Sobrevive a reinstalações.

No Windows nativo o instalador define HERMES_HOME=%LOCALAPPDATA%\hermes, então seus dados e a instalação descartável ficam sob a mesma raiz %LOCALAPPDATA%\hermes: a instalação/runtime são os subdiretórios hermes-agent\, git\, node\ e bin\, enquanto seus arquivos de dados ficam direto em %LOCALAPPDATA%\hermes. Reinstalar só substitui o checkout em hermes-agent\, então seus dados sobrevivem — mas, como os dois compartilham a raiz, não rode Remove-Item -Recurse %LOCALAPPDATA%\hermes se você quiser manter seus dados; apague o subdiretório hermes-agent\ no lugar. Seu diretório de dados tem exatamente o mesmo formato de um ~/.hermes do Linux, então dá para espelhá-lo entre máquinas.

Sobrescrever o HERMES_HOME: defina a variável de ambiente apontando para outro diretório de dados (ex.: %USERPROFILE%\.hermes para combinar com o layout do Linux/WSL). Funciona igual ao Linux.

Ferramenta de navegador​

A ferramenta de navegador usa o agent-browser (um auxiliar em Node) para controlar o Chromium. No Windows:

  • O instalador coloca o agent-browser no PATH via npm.
  • O shutil.which("agent-browser", path=...) pega o shim .cmd automaticamente — o CreateProcessW não consegue executar um shebang sem extensão, então o Hermes sempre resolve para o wrapper .CMD. Não invoque o script com shebang na mão; passe sempre pelo .cmd.
  • O Chromium do Playwright é instalado automaticamente na primeira execução (npx playwright install chromium). Se a instalação falhar, o hermes doctor mostra o problema com uma dica de correção.

Rodando o Hermes no Windows — notas práticas​

PATH depois da instalação​

O instalador adiciona %LOCALAPPDATA%\hermes\bin ao PATH do seu usuário via [Environment]::SetEnvironmentVariable. Terminais já abertos não pegam isso — abra uma janela nova do PowerShell (ou uma aba nova do Windows Terminal) depois da instalação. Feche e reabra; não faça $env:PATH += … na mão, a não ser que você saiba o que está fazendo.

Confira:

Get-Command hermes # deve imprimir C:\Users\<voce>\AppData\Local\hermes\bin\hermes.exe
hermes --version

Variáveis de ambiente​

O Hermes respeita tanto $env:X (escopo de processo) quanto variáveis de ambiente de usuário (permanentes, definidas em Propriedades do Sistema → Variáveis de Ambiente). Colocar as chaves de API em %LOCALAPPDATA%\hermes\.env (o seu HERMES_HOME) é o caminho normal — igual ao Linux:

OPENROUTER_API_KEY=sk-or-...
TELEGRAM_BOT_TOKEN=...

Não coloque segredos em variáveis de ambiente de usuário, a menos que você queira mesmo que todo processo do Windows os enxergue (não é o que você quer).

Variáveis de ambiente específicas do Windows​

Estas só afetam instalações nativas no Windows:

VariávelEfeito
HERMES_GIT_BASH_PATHSobrescreve a descoberta do bash.exe. Aponte para qualquer bash — Git-for-Windows completo, bash do WSL via symlink, MSYS2, Cygwin. O instalador define isso automaticamente.
HERMES_DISABLE_WINDOWS_UTF8Defina como 1 para desligar o shim de stdio UTF-8 e voltar à página de código do locale. Útil para bissecar um bug de codificação.
EDITOR / VISUALSeu editor para /edit e Ctrl-X Ctrl-E. O Hermes usa notepad por padrão se os dois estiverem vazios.

Desinstalar​

Pelo PowerShell:

hermes uninstall

Esse é o caminho limpo — remove a entrada do schtasks, o atalho da pasta de Inicialização e o shim hermes.cmd, apaga %LOCALAPPDATA%\hermes\hermes-agent\ e limpa o PATH do usuário. Ele não mexe no resto de %LOCALAPPDATA%\hermes\ (sua configuração, autenticação, skills, sessões e logs), caso você vá reinstalar.

Para apagar tudo:

hermes uninstall
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\hermes"
# Remova também um diretório de dados antigo da CLI/WSL, se você já usou um:
Remove-Item -Recurse -Force "$env:USERPROFILE\.hermes"

O subcomando hermes uninstall da CLI também dá conta do caso em que a entrada do schtasks foi registrada com outro nome de tarefa (instalações antigas) — ele busca pelo caminho de instalação, não por um nome de tarefa fixo no código.

Detalhes internos do gerenciamento de processos​

Isto é material de fundo — pule, a menos que você esteja depurando alguma esquisitice do tipo "ele está se matando".

No Linux e no macOS, o idioma POSIX os.kill(pid, 0) é uma checagem de permissão que não faz nada: "esse PID está vivo e eu posso sinalizar para ele?". No Windows, o os.kill do Python mapeia sig=0 para CTRL_C_EVENT — eles colidem no valor inteiro 0 — e roteia pelo GenerateConsoleCtrlEvent(0, pid), que transmite o Ctrl+C para o grupo inteiro de processos do console que contém o PID alvo. Esse é o bpo-14484, aberto desde 2012. Não vai ser corrigido porque mudar isso quebraria scripts que dependem do comportamento atual.

Consequência: qualquer trecho de código que dizia "veja se esse PID está vivo" via os.kill(pid, 0) no Windows estava matando o alvo em silêncio. O Hermes migrou todos esses pontos (14 em 11 arquivos) para o gateway.status._pid_exists(), que usa o psutil.pid_exists() (que, por sua vez, usa OpenProcess + GetExitCodeProcess no Windows — sem sinais). Se você estiver escrevendo um plugin ou um patch, use o psutil.pid_exists() direto ou o gateway.status._pid_exists() — nunca o os.kill(pid, 0).

O scripts/check-windows-footguns.py impõe isso na CI: qualquer chamada nova a os.kill(pid, 0) reprova a verificação Windows footguns (blocking), a não ser que a linha traga um marcador # windows-footgun: ok — <motivo>.

Pegadinhas comuns​

hermes: command not found logo depois da instalação. Abra uma janela nova do PowerShell. O instalador adicionou %LOCALAPPDATA%\hermes\bin ao PATH do usuário, mas shells já abertos precisam ser reiniciados para pegar. Enquanto isso, você pode rodar & "$env:LOCALAPPDATA\hermes\bin\hermes.exe".

WinError 193: %1 is not a valid Win32 application ao rodar uma ferramenta. Você caiu em uma invocação de script com shebang que passou por cima do shim .cmd. O Hermes resolve comandos com shutil.which(cmd, path=local_bin) para que o PATHEXT pegue o .CMD — se você está chamando a ferramenta por um caminho fixo, troque pela variante .cmd (ex.: npx.cmd, não npx).

[scriptblock]::Create(...) falha com The assignment expression is not valid. Seu download do install.ps1 pegou um BOM UTF-8. A forma irm | iex remove BOMs automaticamente; a [scriptblock]::Create((irm ...)) não. Rode de novo com a forma simples irm | iex, ou baixe o script na mão e salve sem BOM com [IO.File]::WriteAllText($path, $text, (New-Object Text.UTF8Encoding $false)).

O gateway não continua rodando depois de reiniciar. Veja o hermes gateway status — ele combina a entrada do schtasks, o atalho da pasta de Inicialização (se usado) e o PID vivo. Se o schtasks está registrado mas não está rodando, pode ser que a política de grupo esteja bloqueando gatilhos ONLOGON. Rode schtasks /Query /TN HermesGateway /V /FO LIST para ver o motivo da falha da tarefa, ou volte para o caminho da pasta de Inicialização desinstalando e reinstalando com HERMES_GATEWAY_FORCE_STARTUP=1.

O /edit continua não fazendo nada depois de eu definir $env:EDITOR. Você definiu só no processo atual; feche e reabra o shell, ou defina no escopo de usuário em Propriedades do Sistema → Variáveis de Ambiente. Confira com echo $env:EDITOR em uma janela nova do PowerShell.

A ferramenta de navegador abre, mas as ferramentas dão timeout. O Chromium é instalado automaticamente na primeira execução. Se a instalação falhou (limite de taxa do GitHub, soluço na CDN do Playwright), rode o hermes doctor — ele mostra o Chromium ausente e imprime o comando npx playwright install chromium exato para corrigir.

O agent-browser falha com um erro estranho de versão do Node. O instalador provisiona o Node 26 em %LOCALAPPDATA%\hermes\node, mas o seu PATH pode ter um Node 18 do sistema antes dele. Ou mova o diretório node do Hermes para antes no PATH, ou apague a instalação do sistema se você não usa Node em mais nada.

Caracteres chineses / japoneses / árabes aparecem como ? na CLI. O shim de stdio UTF-8 não ativou. Verifique se o HERMES_DISABLE_WINDOWS_UTF8 NÃO está definido (Get-ChildItem env:HERMES_DISABLE_WINDOWS_UTF8). Se estiver vazio e você ainda ver ?, o host de console (um cmd.exe bem antigo) pode simplesmente não suportar UTF-8 — mude para o Windows Terminal.

O gateway não consegue enviar fotos no Telegram — "BadRequest: payload contains invalid characters". Isso não tem a ver com o Windows, mas às vezes aparece primeiro nele. Normalmente significa que o caminho do seu arquivo tem barras invertidas sem escape dentro de um corpo JSON. O Telegram deveria estar recebendo caminhos normalizados pelo Hermes, não caminhos crus do Windows — se você está vendo isso dentro de um plugin próprio, garanta que está passando o caminho fornecido pelo Hermes, e não um str(Path(...)) vindo de entrada do usuário.

Esquisitice de codificação do tipo "funciona na minha outra máquina" depois de um git pull. Se você editou a configuração do Hermes ou uma skill no Windows usando um editor que não é UTF-8 (o Bloco de Notas de versões antigas do Windows, alguns IMEs chineses), o arquivo pode ter sido salvo com BOM. O Hermes tolera utf-8-sig na maioria das leituras de configuração, mas um BOM dentro de um escalar YAML dobrado (description: >) quebra silenciosamente o parsing do YAML. Salve o arquivo de novo como UTF-8 puro, sem BOM.

Para onde ir depois​