All plugins

Official

agent-importers

`hermes import-agent`: import an OpenClaw (~/.openclaw, or legacy ~/.clawdbot / ~/.moltbot), Claude Code (~/.claude), Codex CLI (~/.codex), Cursor (~/.cursor), Grok Bot (a self-export the Bot writes from a prompt the importer prints) or OpenBot desktop (its openbot.db) setup into Hermes in one command; always previews first and asks before applying. Claude Code / Codex / Cursor: instructions, Cursor rules and memories become memory entries, Bash permission rules become command allow/deny lists, MCP servers land in config.yaml, skills are copied, and `--sync` re-imports sources that changed. OpenClaw (core's former `hermes claw migrate`; the plugin keeps that spelling, `hermes claw cleanup` and the openclaw-migration skill): persona, memories, skills, model and messaging settings, MCP servers and agent behaviour. Formerly built into Hermes core; `hermes setup` offers to install it when it finds one of these agents, and profiles with a registered sync source are migrated automatically. Disclosure — no Python dependencies, no network calls and no model calls. Claude Code / Codex / Cursor: reads those agents' local config trees (never their credential files; secret-looking MCP env vars and headers are stripped and listed) and writes only into the active profile (memories/MEMORY.md with a backup, config.yaml, skills/ and import-sync.json). OpenClaw: reads the OpenClaw dir (openclaw.json, its .env, workspace files such as SOUL.md / MEMORY.md / USER.md, skills); API keys and bot tokens come over only with --migrate-secrets (allowlisted names, shown in the preview). It writes into the active profile (config.yaml, .env, SOUL.md, memories/, skills/openclaw-imports/, a migration/openclaw/<time>/ report with item backups, and a backups/pre-migration-*.zip restore point), plus a workspace dir only when --workspace-target names one. It runs local pgrep / systemctl / tasklist checks to warn when OpenClaw or a Hermes gateway is still running, and `hermes claw cleanup` renames the OpenClaw dir to *.pre-migration after a confirmation. Grok Bot / OpenBot: instructions become SOUL.md, memories and user facts become memory entries, skills land in skills/<source>-imports/, scheduled routines become paused cron jobs (--activate-routines to start them) and event routines a notes file; credential-looking export keys refuse the file, and secret MCP env vars and headers are stripped and listed. OpenBot's database is opened read-only (or read from a scratch copy that is deleted after the read).

NousResearch592Toolsv1.2.1Updated 2 days ago

About

`hermes import-agent`: import an OpenClaw (~/.openclaw, or legacy ~/.clawdbot / ~/.moltbot), Claude Code (~/.claude), Codex CLI (~/.codex), Cursor (~/.cursor), Grok Bot (a self-export the Bot writes from a prompt the importer prints) or OpenBot desktop (its openbot.db) setup into Hermes in one command; always previews first and asks before applying. Claude Code / Codex / Cursor: instructions, Cursor rules and memories become memory entries, Bash permission rules become command allow/deny lists, MCP servers land in config.yaml, skills are copied, and `--sync` re-imports sources that changed. OpenClaw (core's former `hermes claw migrate`; the plugin keeps that spelling, `hermes claw cleanup` and the openclaw-migration skill): persona, memories, skills, model and messaging settings, MCP servers and agent behaviour. Formerly built into Hermes core; `hermes setup` offers to install it when it finds one of these agents, and profiles with a registered sync source are migrated automatically. Disclosure — no Python dependencies, no network calls and no model calls. Claude Code / Codex / Cursor: reads those agents' local config trees (never their credential files; secret-looking MCP env vars and headers are stripped and listed) and writes only into the active profile (memories/MEMORY.md with a backup, config.yaml, skills/ and import-sync.json). OpenClaw: reads the OpenClaw dir (openclaw.json, its .env, workspace files such as SOUL.md / MEMORY.md / USER.md, skills); API keys and bot tokens come over only with --migrate-secrets (allowlisted names, shown in the preview). It writes into the active profile (config.yaml, .env, SOUL.md, memories/, skills/openclaw-imports/, a migration/openclaw/<time>/ report with item backups, and a backups/pre-migration-*.zip restore point), plus a workspace dir only when --workspace-target names one. It runs local pgrep / systemctl / tasklist checks to warn when OpenClaw or a Hermes gateway is still running, and `hermes claw cleanup` renames the OpenClaw dir to *.pre-migration after a confirmation. Grok Bot / OpenBot: instructions become SOUL.md, memories and user facts become memory entries, skills land in skills/<source>-imports/, scheduled routines become paused cron jobs (--activate-routines to start them) and event routines a notes file; credential-looking export keys refuse the file, and secret MCP env vars and headers are stripped and listed. OpenBot's database is opened read-only (or read from a scratch copy that is deleted after the read).

Agent Importers for Hermes Agent

Part of the Hermes Official Plugins, Nous Research's official plugins for Hermes Agent. Formerly built into Hermes Agent core (hermes_cli/agent_import.py, and for OpenClaw hermes_cli/claw.py with the openclaw-migration optional skill).

hermes import-agent brings an existing OpenClaw (~/.openclaw), Claude Code (~/.claude), OpenAI Codex CLI (~/.codex), Cursor (~/.cursor), Grok Bot or OpenBot setup into Hermes with one command. Every run shows a per-item preview first and --dry-run never touches disk. API keys and credentials are never imported, with one opt-in exception: OpenClaw's allowlisted secrets when you pass --migrate-secrets.

| Agent | Command | Default source |
|---|---|---|
| OpenClaw (also legacy Clawdbot / Moltbot) | hermes import-agent openclaw (old spelling: hermes claw migrate) | ~/.openclaw, ~/.clawdbot, ~/.moltbot |
| Claude Code | hermes import-agent claude-code | ~/.claude |
| Codex CLI | hermes import-agent codex | ~/.codex |
| Cursor | hermes import-agent cursor | ~/.cursor |
| Grok Bot | hermes import-agent grok-bot | an export the Bot writes (~/Downloads/grok-bot-export*.json) |
| OpenBot (nightly-labs/openbot desktop app) | hermes import-agent openbot | its data folder: ~/Library/Application Support/OpenBot, ~/.config/OpenBot or %APPDATA%\OpenBot |

Install

hermes plugins install agent-importers
# or straight from this repo:
hermes plugins install NousResearch/hermes-official-plugins#agent-importers

Upgrading from a Hermes version that had import-agent built in: the command, its flags and your
sync manifest (import-sync.json in the profile) are unchanged. Profiles that registered a sync
source get the plugin automatically on update; everyone else sees the install line when they run
hermes import-agent.

Usage

hermes import-agent                    # auto-detect ~/.openclaw, ~/.claude, ~/.codex or ~/.cursor
hermes import-agent openclaw           # import from ~/.openclaw (see "OpenClaw" below)
hermes import-agent claude-code        # import from ~/.claude
hermes import-agent codex              # import from ~/.codex
hermes import-agent cursor             # import from ~/.cursor
hermes import-agent claude-code --dry-run          # preview only
hermes import-agent codex --source /path/to/.codex # custom location
hermes import-agent claude-code --overwrite --yes  # replace conflicts, skip prompts
hermes import-agent --sync             # re-import every registered source that changed
hermes import-agent --sync --dry-run   # preview what a sync would do

It imports into the active profile (hermes -p <name> import-agent ... for another one).

OpenClaw

hermes import-agent openclaw is the former hermes claw migrate, with the same flags and defaults. hermes claw migrate ... keeps working and runs the same code.

hermes import-agent openclaw                       # preview, confirm, back up, migrate
hermes import-agent openclaw --dry-run             # preview only
hermes import-agent openclaw --preset user-data    # user data and compatible config only
hermes import-agent openclaw --preset full --migrate-secrets --yes   # include allowlisted secrets
hermes claw cleanup --dry-run                      # what cleanup would archive
hermes claw cleanup                                # rename ~/.openclaw to ~/.openclaw.pre-migration

| Flag | Meaning |
|---|---|
| --source <path> | OpenClaw directory (default: the first of ~/.openclaw, ~/.clawdbot, ~/.moltbot that exists) |
| --dry-run | Preview only |
| --preset {user-data,full} | full (default) is user-data plus the secret categories (bot tokens, provider API keys), which still import only with --migrate-secrets; user-data leaves them out entirely |
| --overwrite | Replace existing Hermes targets; without it a plan with conflicts is refused before anything is written |
| --migrate-secrets | Import allowlisted secrets (TELEGRAM_BOT_TOKEN, provider API keys, ...). Required even under --preset full |
| --no-backup | Skip the pre-migration snapshot |
| --workspace-target <path> | Absolute path to copy OpenClaw's AGENTS.md workspace instructions into |
| --skill-conflict {skip,overwrite,rename} | Imported skill name clashes: keep the existing one (default), replace it, or import as <name>-imported |
| -y, --yes | Skip the confirmation prompt |

These flags only apply to OpenClaw; passing them with another agent prints an error and imports nothing. OpenClaw is not part of --sync.

Secrets. Secrets migration is a separate, explicit step: a run without --migrate-secrets reports detected API keys and bot tokens as skipped and tells you how to add them. Even with it, only secrets with a clean Hermes destination are imported; other auth blobs are reported as skipped.

Before it writes. It warns when OpenClaw is still running, or when this profile's Hermes gateway is connected to messaging platforms (Telegram, Discord and Slack allow one session per bot token). Non-interactive runs stop after the preview unless you pass --yes. Before applying, it writes one restore-point zip of the Hermes home to its backups/ directory (pre-migration-<timestamp>.zip, the last 5 kept); restore it with hermes import <archive>. The OpenClaw directory itself is never modified.

Cleanup. hermes claw cleanup (alias clean; --source, --dry-run, -y) lists each OpenClaw directory's workspaces and state files and renames the directory to <name>.pre-migration (date-stamped if that exists). Nothing is deleted; rename it back to undo. While OpenClaw is still running it asks before archiving (a non-interactive session without --yes aborts), since the running service would recreate an empty directory.

What maps where, in short: SOUL.md → the profile's SOUL.md; MEMORY.md, USER.md and daily memory files → memory entries; command approvals → command_allowlist; skills from the workspace, ~/.openclaw/skills, ~/.agents/skills → skills/openclaw-imports/; default model, custom providers, agent behaviour, MCP servers, TTS and messaging settings → config.yaml / .env (OpenClaw's workspace folder becomes terminal.cwd, unless it is inside the OpenClaw directory); docs with no Hermes equivalent are archived in the migration report directory. The full mapping is in the Migrate from OpenClaw guide.

The skill. The plugin ships the openclaw-migration skill (agent-importers:openclaw-migration): ask Hermes to migrate from OpenClaw and it runs a guided dry run, asks about conflicts, workspace instructions and secrets, then executes the same migration script (skills/openclaw-migration/scripts/openclaw_to_hermes.py).

Grok Bot

Grok Bot keeps your Bots, routines and skills in its cloud account and has no export button, so each
Bot exports itself:

  1. Run hermes import-agent grok-bot. With no export yet, it prints a message (also saved as
    grok-bot-import/export-prompt.txt in your Hermes home).
  2. Paste that message into a Bot's chat. The Bot writes grok-bot-export.json and attaches it, or
    replies with one JSON code block. Nothing in Grok Bot changes. Repeat for each Bot.
  3. Download the file (or paste the Bot's whole reply into a text file) and run
    hermes import-agent grok-bot --source <file>. Files saved as ~/Downloads/grok-bot-export*
    are found without --source; --source also takes a folder of exports, and --source - reads a
    pasted reply from stdin (pbpaste | hermes import-agent grok-bot --source - -y).

A long export may come in several parts (code blocks or files): they are merged per Bot, and a part
sent twice adds nothing. When the Grok Bot desktop app is installed on the same computer, the importer
reads its local cache (Bot names, and routine names from recent chats; never its login files) to list
the Bots to export and to flag a routine a Bot created but left out of its export. The app keeps no
routine schedules, skills or memory locally, which is why the Bot still exports itself.

| Grok Bot | Hermes |
|---|---|
| Routine on a schedule | Cron job <Bot>: <routine> with the same cron expression, time zone and skills, created paused |
| Routine on an event (Slack, GitHub, Linear, Sentry, PagerDuty, email, webhook) | Not scheduled: its full instruction and trigger go to grok-bot-import/<bot>-event-routines.md to rebuild |
| Skills | skills/grok-bot-imports/<name>/SKILL.md |
| What the Bot remembers | Memory entries in memories/MEMORY.md |
| Facts about you | memories/USER.md |
| The Bot's role and lasting rules | SOUL.md when it still holds Hermes' default, else memory entries |
| Apps with a remote MCP URL | mcp_servers in config.yaml (sign in again in Hermes) |
| Other connected apps | Listed in the report; their logins stay in Grok Bot |

Routines arrive paused because the Grok copy keeps running until you turn it off; two live copies
would do the work twice. Turn the routine off in Grok Bot, then hermes cron resume <id> (the import
prints each id). --activate-routines creates them running instead. Cron output stays in Hermes
until you pick a destination: hermes cron edit <id> --deliver telegram (or discord, slack, ...).

| Flag | Meaning |
|---|---|
| --source <path> | An export file, a pasted reply, a folder of them, or - for stdin |
| --bot <name> | Only this Bot from an export holding several (repeatable) |
| --activate-routines | Create the cron jobs running instead of paused |

Run it once per Bot into the profile that should own that Bot's work: hermes -p <profile> import-agent grok-bot --source <file>. An export carrying credential-looking keys is refused whole, and
token-shaped strings inside text are replaced with [redacted]. Re-running skips routines whose cron
job already exists. Grok exports are one-off files, so they are not part of --sync.

OpenBot

hermes import-agent openbot reads the OpenBot desktop app's database (openbot.db in its data
folder, opened read-only, so OpenBot can stay running) and each agent's workspace under
~/OpenBot/Agents. Every agent imports into the active profile; --bot <name> picks agents, and
hermes -p <profile> import-agent openbot --bot <name> gives one agent its own profile.

| OpenBot | Hermes |
|---|---|
| Routine (hourly, daily, weekdays, weekly, monthly, interval, advanced, custom cron, one-time) | Cron job <agent>: <routine> with the same schedule and time zone, created paused (--activate-routines to create running) |
| Routine with no schedule (run by hand, a script or a webhook) | Listed in openbot-import/<agent>-event-routines.md |
| Agent description (its role) | SOUL.md when it still holds Hermes' default and one agent is imported, else memory entries |
| Agent memories | Memory entries in memories/MEMORY.md |
| Workspace skills (.agents/skills, .claude/skills, .opencode, .gemini, .cursor, .cline, .clinerules) | skills/openbot-imports/<name>/ (OpenBot's bundled skills stay behind) |
| MCP servers | mcp_servers in config.yaml, secret-looking env vars and headers stripped and listed |

Chats, provider accounts, channels and the browser profile are not imported. OpenBot keeps running
its routines until you turn them off, so turn each off there, then hermes cron resume <id>.

What maps where (Claude Code, Codex CLI, Cursor)

Claude Code (~/.claude)

| Claude Code | Hermes |
|---|---|
| CLAUDE.md | Memory entries in memories/MEMORY.md |
| settings.json permissions.allow (Bash(...) rules) | command_allowlist in config.yaml |
| settings.json permissions.deny (Bash(...) rules) | approvals.deny in config.yaml |
| ~/.claude.json / settings.json mcpServers | mcp_servers in config.yaml |
| skills/<name>/ (dirs with SKILL.md) | skills/claude-code-imports/<name>/ |
| commands/*.md | Reported as skipped (no direct equivalent) |

Claude's Bash(npm run test:*) prefix rules become npm run test* globs. Non-Bash rules and bare Bash are reported as not mapped.

Codex CLI (~/.codex)

| Codex | Hermes |
|---|---|
| AGENTS.md | Memory entries in memories/MEMORY.md |
| config.toml [mcp_servers.*] | mcp_servers in config.yaml |
| memories/*.md | Memory entries in memories/MEMORY.md |
| skills/<name>/ (dirs with SKILL.md) | skills/codex-imports/<name>/ |

Cursor (~/.cursor)

| Cursor | Hermes |
|---|---|
| AGENTS.md | Memory entries in memories/MEMORY.md |
| rules/**/*.md, rules/**/*.mdc (User Rules) | Memory entries in memories/MEMORY.md |
| mcp.json mcpServers | mcp_servers in config.yaml |
| skills/**/<name>/ (dirs with SKILL.md, category folders allowed) | skills/cursor-imports/<name>/ |

.mdc frontmatter (description, globs, alwaysApply) is Cursor routing metadata and is stripped; only the rule body is imported. A skill is the folder holding SKILL.md, so skills/shipping/land-it/ imports as cursor-imports/land-it/; two skills with the same name in different folders are reported as a conflict.

What is never imported

Credential files (~/.claude/.credentials.json, ~/.codex/auth.json, ~/.cursor/cli-config.json) are never read, and MCP server environment variables or headers with secret-looking names (*_TOKEN, *_API_KEY, Authorization, ...) are stripped and listed in the report so you can re-add them deliberately. Run hermes setup for providers, or put secrets in the profile's .env.

Behaviour

  • Existing MCP servers and skills with the same name are conflicts and skipped unless --overwrite.
  • Memory entries are merged and deduplicated into the existing store; the previous MEMORY.md is backed up as MEMORY.md.bak.<timestamp> first.
  • A config.yaml that cannot be read or parsed is never rewritten: the import records an error and leaves the file byte-identical. Writes keep your comments.
  • Non-interactive runs (no TTY) stop after the preview unless you pass --yes.

Sync

Every successful import registers its source in the profile's import-sync.json. hermes import-agent --sync re-imports any registered source whose files changed, without prompts, so it fits a cron job:

  • The change check is a digest over exactly the files the importer reads; credential files never trigger a sync.
  • Skills previously imported are refreshed in place when the source copy changes, unless you edited the imported copy (then it is a conflict and left alone).
  • A run with errors keeps the old digest, so the next sync retries.

hermes profile create <name> --clone --sync-imports carries the manifest into a new profile, so hermes -p <name> import-agent --sync keeps pulling from the same trees.

Compatibility

On a Hermes version that still has import-agent built in, this plugin's import-agent stays inert and the built-in command runs. Likewise, on a version that still has hermes claw built in, the plugin registers neither claw nor its copy of the openclaw-migration skill; the built-in ones run.

License

MIT

README from the reviewed commit 471acd3; it updates when the author re-pins.

More by NousResearch

26 plugins by NousResearch in the catalog.

NousResearchaccent-pickerOKLCH accent colour picker for the Hermes Desktop status bar: drag it and the whole theme retints live, with palette commands to reset to the theme default or copy the current colour. A theme-authoring tool; the colour is scratch state and is never persisted. Desktop-only (desktop/plugin.js inside the plugin SDK surface); no agent tools, hooks, middleware or env vars.OfficialDesktop app592NousResearchadvanced-delegationTwo extra delegation modes for `delegate_task`, next to the built-in default. Model routes (`delegation.backend: model_map`): the agent picks a named model route per subagent from a list you define (e.g. fast, deep, local). Profile routes (`delegation.backend: profile_routes`): the agent runs a subagent as one of your Hermes profiles, with that profile's own model, credentials, skills and SOUL.md. Only route names and their one-line descriptions reach the model. Adds `hermes delegation config` (pick the mode and edit its routes; `--show` prints the setup) and the `/delegation` slash command (save a mode for the next session, or `--now` to apply it to the current chat). Needs Hermes 0.22.5 or newer, the first release with pluggable delegation providers; Hermes 0.22.0 to 0.22.4 refuses to install it, and on a core older than 0.22.0 it installs, logs one warning and does nothing. Disclosure — no Python dependencies and no network or model calls of its own; subagents run through core's `delegate_task` on the routes you configured. Writes only `delegation.backend` and `delegation.backends.*` (model_map / profile_routes) in the active profile's config.yaml, through core's config writer. A model route's optional `api_key` is stored in config.yaml in plain text (`provider:` keeps keys in .env / auth.json). Listing a profile under profile routes lets this profile's subagents use that profile's credentials, SOUL.md and terminal policy.Officialtools592NousResearchblenderOfficial Blender Lab MCP server over stdio, pinned to upstream v1.0.3, with a Blender workflow skill. Needs Git and uv; Blender 5.1+ is not needed at install. The skill opens Blender itself when a task needs it and, after you agree, installs Blender and Blender Lab's MCP add-on. First startup downloads Python dependencies; prepare the uv environment before connecting. Disclosure — tools execute arbitrary Python in Blender with your privileges; the skill starts Blender with online access for that session only (your saved preference is unchanged), and the add-on's local server on port 9876 has no password, so any program on this computer can use it while Blender is open; only after you agree does the skill download Blender from download.blender.org (about 400 MB, about 1.5 GB unpacked), check it against blender.org's sha256 list and install it in your own folder without administrator rights (Linux ~/.local/opt, macOS ~/Applications, Windows %LOCALAPPDATA%\Programs\Blender Foundation; never over an existing Blender), and download the v1.0.3 add-on, check its hash and install or enable it; first start downloads the pinned Blender Lab MCP server and its Python dependencies with uv. Server discovery does not prove scene readiness.Officialtools592NousResearchbubblewrapBubblewrap terminal backend for Linux: every terminal and execute_code command runs in its own bwrap sandbox on this machine at the host's own paths, with a read-only root, a writable working directory (per profile: restricted, workspace or network), the dot entries of the home directory (credential stores always) and the Hermes home hidden, private temp and process directories, agent and docker sockets masked, and per-command memory, CPU and process limits (`hermes config set terminal.backend bubblewrap`). Disclosure — no Python dependencies and no network calls of its own: it runs your commands through the `bwrap` and `prlimit` binaries you install (bubblewrap, util-linux), and under the default `network` profile those commands share the host network. It reads no credentials. File tools (read_file, write_file, patch, search_files) run inside the sandbox too, and because the working directory is a real host directory Hermes keeps its dangerous-command prompts, as for the local backend.Officialtools592