
Cómo migrar de OpenClaw a Hermes Agent sin perder memoria ni skills
Respuesta corta (60 segundos): la migración es preview → aplicar → verificar → limpiar. (1) Instalá y verificá Hermes Agent en la misma máquina donde ya corre OpenClaw. (2) Previsualizá con
hermes claw migrate --dry-runpara ver qué importará sin tocar nada. (3) Aplicá la migración conhermes claw migrate(o la variante opt-inhermes claw migrate --preset full --migrate-secrets --yessi querés un viaje completo que también lleve API keys sin prompts). (4) Verificá conhermes doctor,hermes statusyhermes config show, más una sesión nueva que ya vea las skills importadas. (5) Revisá canales (incluido el re-emparejado de WhatsApp con QR) y los archivos archivados. (6) Recién después de validar todo, pará OpenClaw conopenclaw gateway stop, previsualizá la limpieza conhermes claw cleanup --dry-run, y recién entonces corréhermes claw cleanup. Para un borrado total de OpenClaw al final, seguí la guía de desinstalación.
Si corrés OpenClaw hace un tiempo y querés pasarte a Hermes Agent sin perder ni memoria ni skills, hay un comando oficial: hermes claw migrate. Lee de ~/.openclaw/ (con fallback a ~/.clawdbot/ y ~/.moltbot/), importa todo lo compatible y deja archivado lo que no tiene equivalente. Esta guía es la versión corta, sin olores, de la guía oficial de migración, con foco en qué se lleva solo, qué queda archivado, y cómo validar antes de tocar nada importante.
Qué migra automáticamente
La tabla resume, por área, qué toma hermes claw migrate desde tu instalación de OpenClaw y dónde lo deja en Hermes. Los flags importantes son --preset full (todo compatible) o --preset user-data (excluye infra). Ningún preset importa secretos solo: si querés API keys y tokens, agregá --migrate-secrets.
| Área | Origen (OpenClaw) | Destino (Hermes) | Notas |
|---|---|---|---|
| Persona / instrucciones | workspace/SOUL.md | ~/.hermes/SOUL.md | Copia directa |
| Instrucciones de workspace | workspace/AGENTS.md | AGENTS.md en --workspace-target | Requiere --workspace-target |
| Memoria de largo plazo | workspace/MEMORY.md | ~/.hermes/memories/MEMORY.md | Parseado a entries, merge con dedupe, delimitador § |
| Perfil del usuario | workspace/USER.md | ~/.hermes/memories/USER.md | Misma lógica de merge por entries |
| Memoria diaria | workspace/memory/*.md | ~/.hermes/memories/MEMORY.md | Todos los archivos diarios se mergean al principal |
| Skills (4 fuentes) | workspace/skills/, ~/.openclaw/skills/, ~/.agents/skills/, workspace/.agents/skills/ | ~/.hermes/skills/openclaw-imports/ | Conflictos: --skill-conflict skip (default), overwrite o rename |
| Modelo default | agents.defaults.model | config.yaml → model | Acepta string u objeto {primary, fallbacks} |
| Custom providers | models.providers.* | config.yaml → custom_providers (migrado a providers: en el próximo hermes update) | Mapea baseUrl, apiType/api y nombres cortos o con guión |
| API keys de providers | models.providers.*.apiKey | ~/.hermes/.env | Requiere --migrate-secrets, allowlist estricto |
| Comportamiento del agente | agents.defaults.timeoutSeconds, verboseDefault, thinkingDefault, agents.defaults.compaction.mode, agents.defaults.compaction.model, humanDelay.*, userTimezone, tools.exec.timeoutSec, agents.defaults.sandbox.* | agent.*, compression.enabled, compression.summary_model, human_delay.*, timezone, terminal.* | Mappings con normalización (ej. timeoutSeconds / 10, cap 200) |
| Reset de sesión | session.reset.* (o fallback session.resetTriggers) | session_reset.* | Modos daily / idle |
| MCP servers | mcp.servers.* | mcp_servers.* | Stdio y HTTP/SSE, con tools.include / tools.exclude |
| TTS | messages.tts.providers.* (canónico), talk.providers.* (fallback), formato plano viejo | config.yaml → tts.*, assets en ~/.hermes/tts/ | Soporta ElevenLabs, OpenAI, Edge/Microsoft |
| Canales (Telegram, Discord, Slack, etc.) | channels.<plat>.botToken / accounts.default.* | Variables en ~/.hermes/.env (TELEGRAM_BOT_TOKEN, DISCORD_BOT_TOKEN, SLACK_BOT_TOKEN/SLACK_APP_TOKEN, SIGNAL_ACCOUNT, SIGNAL_HTTP_URL, SIGNAL_ALLOWED_USERS, MATRIX_ACCESS_TOKEN, MATTERMOST_BOT_TOKEN) | Tokens pueden ser string, ${VAR} o SecretRef |
| Lista blanca de canales | channels.<plat>.allowFrom[] | <PLAT>_ALLOWED_USERS | Lista join con comas |
| Aprobaciones / exec | approvals.exec.mode, exec-approvals.json | config.yaml → approvals.mode, command_allowlist | Modes mapeados, patterns merged y deduped |
| Browser | browser.cdpUrl, browser.headless | config.yaml → browser.cdp_url, browser.headless | |
| Brave search | tools.web.search.brave.apiKey | .env → BRAVE_API_KEY | Requiere --migrate-secrets |
| Gateway auth | gateway.auth.token | .env → HERMES_GATEWAY_TOKEN | Requiere --migrate-secrets |
| Working dir | agents.defaults.workspace | config.yaml → terminal.cwd | Legacy puede emitir MESSAGING_CWD |
Qué no migra automáticamente
Lo que sigue se archiva bajo ~/.hermes/migration/openclaw/<timestamp>/archive/ para revisión manual. Son piezas que en Hermes se construyen con otros comandos o no tienen equivalente directo.
| No migra | Dónde queda | Cómo recrearlo en Hermes |
|---|---|---|
IDENTITY.md | archive/workspace/IDENTITY.md | Merge manual en ~/.hermes/SOUL.md |
TOOLS.md | archive/workspace/TOOLS.md | Hermes ya trae instrucciones de tools integradas |
HEARTBEAT.md | archive/workspace/HEARTBEAT.md | Usá hermes cron create para tareas periódicas |
BOOTSTRAP.md | archive/workspace/BOOTSTRAP.md | Usá context files o skills |
| Cron jobs | archive/cron-config.json | Recrear con hermes cron create |
| Plugins | archive/plugins-config.json | Ver guía de hooks |
| Hooks / webhooks | archive/hooks-config.json | Usá hermes webhook o gateway hooks |
| Memory backend | archive/memory-backend-config.json | Configurar con hermes honcho |
| Skills registry | archive/skills-registry-config.json | Usá hermes skills config |
| UI / identity | archive/ui-identity-config.json | Comando /skin |
| Logging / diagnostics | archive/logging-diagnostics-config.json | Sección logging en config.yaml |
| Multi-agent list | archive/agents-list.json | Usá perfiles de Hermes |
| Channel bindings | archive/bindings.json | Setup manual por plataforma |
| Canales con config profunda | archive/channels-deep-config.json | Config manual por plataforma |
Además hay dos plataformas que requieren acción manual: WhatsApp (re-emparejar por QR con hermes whatsapp) y cualquier token que en OpenClaw use source: file o source: exec como SecretRef — la migración avisa sobre estos y los deja sin resolver.
Paso 1 · Instalar y verificar Hermes
Antes de mover nada, asegurate de tener Hermes Agent funcionando en la misma máquina y con hermes --version verde. La guía completa de instalación (Linux, macOS, WSL2, Android, Windows nativo, paths sin sudo) está acá:
~# Después de instalar Hermes, confirmá el binario y el Gateway hermes --version hermes doctor
Si ya lo tenés instalado y actualizado, podés saltearte a la previsualización. Si no, instalá Hermes Agent y volvé. Tener los dos corriendo en paralelo es exactamente lo que querés durante la transición.
Paso 2 · Previsualizar la migración
Antes de tocar nada, mirá qué va a hacer el comando. La previsualización lee todo el state de OpenClaw, busca skills, providers, canales y memoria, y te imprime el plan completo sin escribir nada:
~# Previsualizar la migración sin modificar nada hermes claw migrate --dry-run
Por default lee de ~/.openclaw/. Si tu instalación vive en otro lado (por ejemplo, un profile custom o un contenedor), pasale la ruta explícita:
~# Fuente en una ruta custom (ej. profile o contenedor) hermes claw migrate --dry-run --source /ruta/a/openclaw
El preview te muestra: archivos a copiar, skills a importar, providers y canales detectados, secretos que no se van a copiar (por default), y conflictos. Revisalo con cuidado: si hay algo que no querés tocar, ajustalo antes de aplicar.
Paso 3 · Ejecutar la migración
Una vez que el preview te cierra, aplicá la migración:
~# Aplicar la migración (vuelve a mostrar el preview y pide confirmación) hermes claw migrate
Si querés un camino completo en una sola corrida — incluyendo API keys y sin prompts — usá esta variante opt-in. Cuidado: lleva secretos, leelos dos veces antes de correrlo:
~# Camino opt-in completo (incluye API keys, sin confirmación) # --preset full: importa todo lo compatible # --migrate-secrets: también API keys y tokens (allowlist estricto) # --yes: salta el prompt de confirmación hermes claw migrate --preset full --migrate-secrets --yes
Flags útiles si tu situación lo amerita:
--workspace-target /ruta: a dónde vaAGENTS.md(necesario para copiar las instrucciones del workspace).--overwrite: fuerza pisar archivos de Hermes que entren en conflicto. Sin este flag, la migración se niega a aplicar si hay conflictos.--no-backup: saltea el snapshot pre-migración en~/.hermes/backups/pre-migration-*.zip. Por default se escribe siempre un restore point antes de aplicar.--skill-conflict skip | overwrite | rename: cómo resolver skills duplicadas.renamedeja la importada con sufijo-importeden el basename (p. ej.mi-skill→mi-skill-imported).
Paso 4 · Verificar Hermes
Después de aplicar, lo crítico es validar que Hermes quedó funcional. Cuatro comandos, en este orden:
~# 1) Chequeo completo de config y deps hermes doctor # 2) Autenticación con los providers migrados hermes status # 3) Config efectiva: revisá session_reset, terminal.cwd, model, providers hermes config show
Después de los chequeos, arrancá una sesión nueva (las skills importadas y los memory entries toman efecto en sesiones nuevas, no en la actual):
~# 4) Sesión nueva: acá deberían aparecer las skills importadas hermes
Si algo no aparece, hermes config show te dice qué keys efectivamente quedaron seteadas. Si falta una API key, agregala con hermes config set OPENROUTER_API_KEY tu_key (o la variable que corresponda). /skills te lista las skills cargadas.
Paso 5 · Revisar canales y archivos archivados
Los tokens de los canales quedan en ~/.hermes/.env, pero el Gateway no los recarga solo. Reinicialo:
~# Reiniciar el Gateway para que tome los tokens migrados systemctl --user restart hermes-gateway
Si usás WhatsApp, la migración no puede llevarse la sesión (WhatsApp usa QR pairing con Baileys, no token). Quedó guardado el WHATSAPP_ALLOWED_USERS para que mantenga la lista blanca, pero hay que re-emparejar:
~# Re-emparejar WhatsApp con QR después de migrar hermes whatsapp
Para todo lo que no migra automáticamente (cron, plugins, hooks, multi-agent, channel bindings, IDENTITY.md, TOOLS.md, HEARTBEAT.md, etc.), revisá el directorio:
~# Archivos archivados para revisión manual ls -la ~/.hermes/migration/openclaw/$(ls -t ~/.hermes/migration/openclaw/ | head -1)/archive/
Cada carpeta adentro (workspace/, cron-config.json, plugins-config.json, hooks-config.json, bindings.json, etc.) corresponde a la columna "Cómo recrearlo en Hermes" de la tabla de arriba. Recreá lo que necesites desde la columna correspondiente.
Paso 6 · Limpiar solo después de validar
La limpieza se hace al final y solo cuando todo lo anterior esté verde. El flujo:
- Pará el Gateway de OpenClaw para que no siga procesando:
openclaw gateway stop. - Previsualizá qué va a renombrar la limpieza de Hermes.
- Aplicá la limpieza: renombra los directorios de OpenClaw a
.pre-migration/para evitar confusión de state entre los dos agentes.
~# 1) Parar OpenClaw para que no compita con Hermes openclaw gateway stop # 2) Previsualizar qué va a renombrar la limpieza de Hermes hermes claw cleanup --dry-run # 3) Aplicar la limpieza (renombra dirs de OpenClaw a .pre-migration/) hermes claw cleanup
Si querés borrar OpenClaw por completo (CLI + Gateway + state + workspace + app), seguí la guía de desinstalación de OpenClaw después de la limpieza. No borres OpenClaw antes de validar que Hermes está estable.
Troubleshooting
Los cuatro errores más comunes durante una migración, con la solución exacta.
| Problema | Causa | Solución |
|---|---|---|
| "OpenClaw directory not found" | La instalación no está en ~/.openclaw/ | Pasá --source /ruta/a/openclaw. La migración también busca en ~/.clawdbot/ y ~/.moltbot/. |
| "No provider API keys found" | Las keys viven en una ruta no leída por la migración, o son SecretRefs con source: file / source: exec | Agregá las keys con hermes config set OPENAI_API_KEY tu_key (etc.) después de la migración. Los SecretRefs source: file / source: exec no se resuelven automáticamente. |
Conflictos al aplicar (--overwrite requerido) | Hay archivos que se pisan entre la config existente de Hermes y la importada | Releé el preview, decidí qué queda, y agregá --overwrite si querés forzar, o --skill-conflict rename para skills duplicadas. |
| Skills importadas no aparecen | Estás en la misma sesión donde corriste hermes claw migrate | Cerrá la sesión y arrancá una nueva con hermes. Las skills importadas aterrizan en ~/.hermes/skills/openclaw-imports/ y se cargan en sesiones nuevas. Si querés verlas ya, corré /skills. |
Si tu caso es más raro (instalación en contenedor, Nix, Docker, perfil multi-agent), la guía oficial de migración tiene secciones de edge cases que exceden este recorrido.
¿Tenés un setup puntual (multi-agent, custom providers, varios canales) y querés validar el plan antes de ejecutar la migración? Hay un CTA al final con una llamada gratis de 30 minutos.
Preguntas frecuentes
¿Pierdo memoria y skills al migrar a Hermes?
No. `hermes claw migrate` importa `MEMORY.md`, `USER.md`, los archivos diarios de `workspace/memory/`, las skills de `workspace/skills/`, `~/.openclaw/skills/`, `~/.agents/skills/` y `workspace/.agents/skills/`, y los unifica con dedupe por delimitador `§`. Las skills importadas aterrizan en `~/.hermes/skills/openclaw-imports/`.
¿Qué pasa con mis API keys y los tokens de los canales?
Por default, `hermes claw migrate` **no** importa secretos. Si querés que también migre, agregá `--migrate-secrets`. Ahí copia los API keys de los providers desde `openclaw.json`, `~/.openclaw/.env`, el sub-objeto `env` y `auth-profiles.json`, sólo para el allowlist de Hermes (`OPENROUTER_API_KEY`, `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `DEEPSEEK_API_KEY`, `GEMINI_API_KEY`, `ZAI_API_KEY`, `MINIMAX_API_KEY`, `ELEVENLABS_API_KEY`, `TELEGRAM_BOT_TOKEN`, `VOICE_TOOLS_OPENAI_KEY`).
¿Migra WhatsApp automáticamente?
No. WhatsApp usa QR pairing (Baileys), no token. La migración lleva el `allowFrom` como `WHATSAPP_ALLOWED_USERS`, pero la sesión queda invalidada. Después de migrar corré `hermes whatsapp` para re-emparejar el dispositivo.
¿Qué hace `--preset full` y qué no?
`full` importa todo lo compatible de un golpe y `user-data` excluye infra (sandbox, exec, terminal). **Ningún preset importa secretos solo**: siempre necesitás agregar `--migrate-secrets` explícito para llevar las API keys y los tokens.
¿Cómo manejo un SecretRef que no se puede resolver?
La migración sabe leer tres formatos (string plano, template `${VAR}` y SecretRef con `source: env`). Para `source: env` busca en `~/.openclaw/.env` y en el sub-objeto `env` de la config. Si tu token usa `source: file` o `source: exec`, la migración lo avisa y lo deja sin resolver: agregalo a mano con `hermes config set` después.
¿Se pisa algo si ya tengo configuración en Hermes?
No por default. Ante conflictos, la migración se niega a aplicar y te muestra el plan completo. Para forzar el overwrite agregá `--overwrite`. Para skills específicamente usá `--skill-conflict skip`, `overwrite` o `rename` (este último crea una copia con el sufijo `<skill>-imported`, p. ej. `mi-skill` → `mi-skill-imported`).
¿Cuándo es seguro correr `hermes claw cleanup`?
Sólo después de validar `hermes doctor`, `hermes status` y de re-emparejar WhatsApp. `cleanup` renombra los directorios de OpenClaw a `.pre-migration/` para evitar confusión de state entre los dos agentes. El preview es `hermes claw cleanup --dry-run`.