--- sidebar_position: 7 --- # Profile Commands Reference This page covers all commands related to [Hermes profiles](../user-guide/profiles.md). For general CLI commands, see [CLI Commands Reference](./cli-commands.md). ## `hermes profile` ```bash hermes profile ``` Top-level command for managing profiles. Running `hermes profile` without a subcommand shows help. | Subcommand | Description | |------------|-------------| | `list` | List all profiles. | | `use` | Set the active (default) profile. | | `create` | Create a new profile. | | `describe` | Read or set a profile's description (used by the kanban orchestrator for routing). | | `delete` | Delete a profile. | | `show` | Show details about a profile. | | `alias` | Regenerate the shell alias for a profile. | | `rename` | Rename a profile. | | `export` | Export a profile to a tar.gz archive. | | `import` | Import a profile from a tar.gz archive. | | `install` | Install a profile distribution from a git URL or local directory. See [Profile Distributions](../user-guide/profile-distributions.md). | | `update` | Re-pull a distribution-managed profile and re-apply its bundle. | | `info` | Show distribution metadata for a profile (origin URL, commit, last update). | ## `hermes profile list` ```bash hermes profile list ``` Lists all profiles. The currently active profile is marked with `*`. **Example:** ```bash $ hermes profile list default * work dev personal ``` No options. ## `hermes profile use` ```bash hermes profile use ``` Sets `` as the active profile. All subsequent `hermes` commands (without `-p`) will use this profile. | Argument | Description | |----------|-------------| | `` | Profile name to activate. Use `default` to return to the base profile. | **Example:** ```bash hermes profile use work hermes profile use default ``` ## `hermes profile create` ```bash hermes profile create [options] ``` Creates a new profile. | Argument / Option | Description | |-------------------|-------------| | `` | Name for the new profile. Must be a valid directory name (alphanumeric, hyphens, underscores). | | `--clone` | Copy `config.yaml`, `.env`, `SOUL.md`, skills, the curated `memories/MEMORY.md` / `memories/USER.md`, and the active `memory.provider`'s own config (`/` or `.json`, e.g. `hindsight/config.json`) from the current profile. Sessions, `state.db` and cron jobs are not copied. | | `--clone-all` | Copy everything (config, memories, skills, plugins) from the current profile. Excludes per-profile history: sessions, `state.db`, backups, state-snapshots, checkpoints — and cron jobs, which stay bound to the source profile (a clone that inherited them would fire every job twice). When the source is the default profile, the machine-scoped local-model trees (`models/`, `runtimes/`, `node/`) are also skipped — the same trees `hermes backup` excludes. | | `--clone-from ` | Clone config/skills/SOUL from a specific profile instead of the current one. Implies `--clone` unless paired with `--clone-all`. | | `--no-alias` | Skip wrapper script creation. | | `--description ""` | One- or two-sentence description of what this profile is good at. Used by the kanban orchestrator to route tasks based on role instead of profile name alone. Skip and add later via `hermes profile describe`. Persisted in `/profile.yaml`. | | `--no-skills` | Create an **empty** profile with zero bundled skills enabled. Writes a `.no-bundled-skills` marker into the profile so future `hermes update` runs won't re-seed the bundled set, and refuses to combine with `--clone`, `--clone-from`, or `--clone-all` (which would copy skills in anyway). Useful for narrow orchestrator profiles or sandbox profiles that should not inherit the full skill catalog. To toggle this on an already-created profile (including the default `~/.hermes`), use `hermes skills opt-out` / `hermes skills opt-in`. | Creating a profile does **not** make that profile directory the default project/workspace directory for terminal commands. If you want a profile to start in a specific project, set `terminal.cwd` in that profile's `config.yaml`. **Examples:** ```bash # Blank profile — needs full setup hermes profile create mybot # Clone config only from current profile hermes profile create work --clone # Clone everything from current profile hermes profile create backup --clone-all # Clone config from a specific profile hermes profile create work2 --clone-from work # Clone everything from a specific profile hermes profile create work2-backup --clone-from work --clone-all ``` ## `hermes profile describe` ```bash hermes profile describe [] [options] ``` Read or set a profile's description. The description is consumed by the kanban orchestrator to route tasks based on what each profile is good at, rather than guessing from the profile name alone. Persisted in `/profile.yaml` so it survives reboots and is shared with the gateway. With no flags, prints the current description (or `(no description set for '')` if empty). | Argument / Option | Description | |-------------------|-------------| | `` | Profile to describe. Required unless `--all --auto` is used. | | `--text ""` | Set the description to this exact text (user-authored). Overwrites any existing description. | | `--auto` | Auto-generate a 1-2 sentence description via the auxiliary LLM, based on the profile's installed skills, configured model, and name. Configure the model under `auxiliary.profile_describer` in `config.yaml`. Auto-generated descriptions are marked `description_auto: true` so the dashboard can flag them for review. | | `--overwrite` | With `--auto`, replace user-authored descriptions too (default: skip profiles whose description was set explicitly). | | `--all` | With `--auto`, sweep every profile missing a description. | **Examples:** ```bash # Read the current description hermes profile describe researcher # Set it explicitly hermes profile describe researcher --text "Reads source code and writes findings." # Let the LLM generate one hermes profile describe researcher --auto # Fill in descriptions for every profile that doesn't have one hermes profile describe --all --auto ``` ## `hermes profile delete` ```bash hermes profile delete [options] ``` Deletes a profile and removes its shell alias. | Argument / Option | Description | |-------------------|-------------| | `` | Profile to delete. | | `--yes`, `-y` | Skip confirmation prompt. | **Example:** ```bash hermes profile delete mybot hermes profile delete mybot --yes ``` :::warning This permanently deletes the profile's entire directory including all config, memories, sessions, and skills. The `default` profile (`~/.hermes`) cannot be deleted — use `hermes uninstall` to remove everything. ::: ## `hermes profile show` ```bash hermes profile show ``` Displays details about a profile including its home directory, configured model, gateway status, skills count, and configuration file status. The skills count here (and in `hermes profile list`) is counted on the spot. The Desktop and dashboard profile lists are polled every few seconds, so they show the last known count instead and refresh it in the background — a freshly started backend may briefly show `0` skills for a profile until the first background count lands, and a skill you just installed appears in those lists within about a minute. This shows the profile's Hermes home directory, not the terminal working directory. Terminal commands start from `terminal.cwd` (or the launch directory on the local backend when `cwd: "."`). | Argument | Description | |----------|-------------| | `` | Profile to inspect. | **Example:** ```bash $ hermes profile show work Profile: work Path: ~/.hermes/profiles/work Model: anthropic/claude-sonnet-4 (anthropic) Gateway: stopped Skills: 12 .env: exists SOUL.md: exists Alias: ~/.local/bin/work ``` ## `hermes profile alias` ```bash hermes profile alias [options] ``` Regenerates the shell alias script at `~/.local/bin/`. Useful if the alias was accidentally deleted or if you need to update it after moving your Hermes installation. | Argument / Option | Description | |-------------------|-------------| | `` | Profile to create/update the alias for. | | `--remove` | Remove the wrapper script instead of creating it. | | `--name ` | Custom alias name (default: profile name). | **Example:** ```bash hermes profile alias work # Creates/updates ~/.local/bin/work hermes profile alias work --name mywork # Creates ~/.local/bin/mywork hermes profile alias work --remove # Removes the wrapper script ``` ## `hermes profile rename` ```bash hermes profile rename ``` Renames a profile. Updates the directory and shell alias. A gateway service installed under the old name (`hermes -p gateway install`) is removed, whether or not the gateway is running, because it would start the old name at the next login; reinstall it with `hermes -p gateway install`. Inside the Docker image the s6 gateway slot moves to the new name. | Argument | Description | |----------|-------------| | `` | Current profile name. | | `` | New profile name. | **Example:** ```bash hermes profile rename mybot assistant # ~/.hermes/profiles/mybot → ~/.hermes/profiles/assistant # ~/.local/bin/mybot → ~/.local/bin/assistant ``` The rename also migrates the profile's persisted session/routing identity — session keys (`agent::*`), `sessions.profile_name`, heartbeats, and routing/delivery rows — to the new name. A live multiplexed gateway owns that migration (it holds the routing index in memory), so when it is running the CLI delegates to it. Checkpoint (`/rollback`) history of workspaces that live inside the profile directory is rekeyed to their new path as well, so it stays reachable after the rename; `hermes profile migrate-identity` retries that step too if it was reported as failed. ## `hermes profile migrate-identity` ```bash hermes profile migrate-identity ``` Retries the identity migration of a rename that already completed. Run it if `hermes profile rename` warned that the live gateway could not migrate session identity: restart the gateway (it reloads the routing index from the database, so the migration lands), or stop it — with no gateway holding the store the command performs the durable rewrite itself. The migration is driven by the rows that still name ``, so `profiles/` does not have to exist; only `` is checked. Idempotent — re-running a completed migration succeeds with nothing left to rekey. Exits non-zero when a live gateway refuses the migration, when a database rejects the rewrite (a routing collision, a lock, or one of the two databases failing while the other succeeds), naming the database and error. **Example:** ```bash hermes profile rename mybot assistant # ⚠ Profile was renamed, but the live gateway could not migrate session identity (…). # Restart the gateway, then run: # hermes profile migrate-identity mybot assistant hermes profile migrate-identity mybot assistant # ✓ Session/routing identity migrated: mybot → assistant ``` ## `hermes profile purge-identity` ```bash hermes profile purge-identity ``` Retries the identity purge of a delete that already completed. Run it if `hermes profile delete` reported that its session/routing identity settlement is still pending: restart the gateway (it reloads the routing index from the database, so the purge lands), or stop it — with no gateway holding the store the command performs the durable delete itself. The purge keys off `` alone, so the profile directory does not have to exist — but a profile that is live again under that name is refused: identity is settled by name, so purging it would take the new profile's routing with it. Routing keys (`agent::*`), heartbeat rows and the profile's Telegram topic bindings/mode rows are deleted; `delivery_obligations` rows are marked `abandoned` rather than dropped, so pending delivery state is not lost silently. Session rows are not deleted by the purge itself — it settles identity, not history; whether a conversation record outlives a delete is decided by `hermes profile delete`, which removes the profile's own `profiles//`, its `state.db` included. Idempotent — re-running a completed purge succeeds with nothing left to purge. Exits non-zero when the name is a live profile again, when a live gateway refuses the purge, or when a database rejects the delete (a lock, or a partial failure). **Example:** ```bash hermes profile delete mybot # ⚠ Profile was deleted, but the live gateway could not purge its session identity (…). # Restart the gateway, then run: # hermes profile purge-identity mybot hermes profile purge-identity mybot # ✓ Session/routing identity purged: mybot ``` ## `hermes profile export` ```bash hermes profile export [options] ``` Exports a profile as a compressed tar.gz archive — a portable snapshot you can back up, move to another machine, or hand to someone else. `auth.json`, `.env` and the other credential stores are always excluded; see [what an export file contains](../user-guide/profile-distributions.md#what-an-export-file-contains). Also available in chat as [`/export`](./slash-commands.md), and in the desktop app via **⌘K → Export profile…** or a profile square's right-click menu. A desktop export additionally stages `desktop.json` (skin, light/dark mode, custom themes, rail color, window layout) into the archive. | Argument / Option | Description | |-------------------|-------------| | `` | Profile to export. | | `-o`, `--output ` | Output file path (default: `.tar.gz`). | **Example:** ```bash hermes profile export work # Creates work.tar.gz in the current directory hermes profile export work -o ./work-2026-03-29.tar.gz ``` See [Export and import a profile file](../user-guide/profile-distributions.md#export-and-import-a-profile-file) for exactly what lands in the archive and what to check before sending one to someone else. ## `hermes profile import` ```bash hermes profile import [options] ``` Imports a profile from a tar.gz archive, as a new profile. Refuses to overwrite an existing profile, and cannot import as `default` (the built-in root profile) — pass `--name` in either case. A shell wrapper is created when the name doesn't collide with an existing command. Also available in chat as [`/import`](./slash-commands.md), and in the desktop app via **⌘K → Import profile…** or the import button beside the profile rail's **+**. A desktop import also applies any bundled `desktop.json` overlay (theme, layout) and switches you into the new profile. | Argument / Option | Description | |-------------------|-------------| | `` | Path to the tar.gz archive to import. | | `--name ` | Name for the imported profile (default: inferred from archive). | **Example:** ```bash hermes profile import ./work-2026-03-29.tar.gz # Infers profile name from the archive hermes profile import ./work-2026-03-29.tar.gz --name work-restored ``` ## Distribution commands :::tip **New to distributions?** Start with the [Profile Distributions user guide](../user-guide/profile-distributions.md) — it covers the why, when, and how with full examples. The sections below are a dry CLI reference for when you know what you want. ::: Distributions turn a profile into a shareable, versioned artifact published as a **git repository**. A recipient installs the distribution with a single command and can update it in place later without touching their local memories, sessions, or credentials. `auth.json` and `.env` are never part of a distribution — they stay on the installing user's machine. The recipient's user data (memories, sessions, auth, their own edits to `.env`) is always preserved across the initial install and subsequent updates. :::info Two ways to share a profile, and they complement each other. `hermes profile export` / `import` (also `/export` and `/import` in chat) produce a **single file** — no repo, no manifest, and a desktop export carries your theme and layout too. Distribution (`install` / `update` / `info`) publishes a profile as a **git repo** so recipients can pull versioned updates later. Backup and restore is the export file's other job. See [Two ways to share a profile](../user-guide/profile-distributions.md#two-ways-to-share-a-profile). ::: ### `hermes profile install` ```bash hermes profile install [--name ] [--alias] [--force] [--yes] ``` Installs a profile distribution from a git URL or a local directory. | Option | Description | |--------|-------------| | `` | Git URL (`github.com/user/repo`, `https://...`, `git@...`, `ssh://`, `git://`) or a local directory containing `distribution.yaml` at its root. | | `--name NAME` | Override the profile name from the manifest. | | `--alias` | Also create a shell wrapper (e.g. `telemetry` → `hermes -p telemetry`). | | `--force` | Overwrite an existing profile of the same name. User data is still preserved. | | `-y`, `--yes` | Skip the manifest-preview confirmation prompt. | The installer shows the manifest, lists required env vars, and warns about cron jobs before asking for confirmation. Required env vars go into a `.env.EXAMPLE` file you copy to `.env` and fill in. **Examples:** ```bash # Install from a GitHub repo (shorthand) hermes profile install github.com/kyle/telemetry-distribution --alias # Install from a full HTTPS git URL hermes profile install https://github.com/kyle/telemetry-distribution.git # Install from SSH hermes profile install git@github.com:kyle/telemetry-distribution.git # Install from a local directory during development hermes profile install ./telemetry/ ``` ### `hermes profile update` ```bash hermes profile update [--force-config] [--yes] ``` Re-clones the distribution from its recorded source and applies updates. Distribution-owned files (SOUL.md, mcp.json) are overwritten and the skills and cron jobs the distribution ships are replaced; skills or cron jobs you added under `skills/` or `cron/` yourself stay in place. User data (memories, sessions, auth, .env) is never touched. A symlinked `skills/`, `cron/` or skill category directory is refused before anything is written — replace the link with a real directory and re-run. `config.yaml` is preserved by default to keep your local overrides. Pass `--force-config` to reset it to the distribution's shipped config. ### `hermes profile info` ```bash hermes profile info ``` Prints the profile's distribution manifest — name, version, required Hermes version, author, env var requirements, the source URL/path, and the `Installed:` timestamp recorded when the distribution was last `install`-ed or `update`-d. Useful for checking what a shared profile needs before installing it, and for spotting "this profile was installed 6 months ago and hasn't been updated." `hermes profile list` also shows the distribution name and version in a `Distribution` column, and `hermes profile show ` / `delete ` surface the source URL so you can tell at a glance which profiles came from a git repo vs. were created locally. ### Private distributions A private git repository works as a distribution source with no extra configuration — the install shells out to your normal `git` binary, so whatever authentication your shell is already set up for (SSH key, `git credential` helper, GitHub CLI's stored HTTPS credentials) applies transparently. ```bash # Uses your SSH key, the same as any other `git clone` hermes profile install git@github.com:your-org/internal-assistant.git # Uses your git credential helper hermes profile install https://github.com/your-org/internal-assistant.git ``` If a clone prompts for credentials interactively in your terminal during install, that prompt flows through. Set up your auth the way you'd normally use `git clone` against the same repo first, then install. ### Distribution manifest (`distribution.yaml`) Every distribution has a `distribution.yaml` at the root of its repository: ```yaml name: telemetry version: 0.1.0 description: "Compliance monitoring harness" hermes_requires: ">=0.12.0" author: "Your Name" license: "MIT" env_requires: - name: OPENAI_API_KEY description: "OpenAI API key" required: true - name: GRAPHITI_MCP_URL description: "Memory graph URL" required: false default: "http://127.0.0.1:8000/sse" distribution_owned: # optional; defaults to SOUL.md, config.yaml, # mcp.json, skills/, cron/, distribution.yaml - SOUL.md - skills/compliance/ - cron/ ``` `hermes_requires` supports `>=`, `<=`, `==`, `!=`, `>`, `<`, or a bare version (treated as `>=`). Install fails with a clear error if the current Hermes version doesn't satisfy the spec. `distribution_owned` is optional. If set, only those paths are updated; anything else in the profile stays user-owned. A directory of skills, such as `skills/` or a category like `skills/research/`, is merged per skill: the skills the distribution ships are replaced, and skills you added there stay. A skill the author later drops from the distribution is left in place on update, as with top-level `skills/`. If omitted, the defaults above apply. ### Publishing a distribution Authoring a distribution is just a git push: 1. In your profile directory, create `distribution.yaml` with at least `name` and `version`. 2. Initialize a git repo (or use an existing one) and push to GitHub / GitLab / any host Hermes can clone from. 3. Tell recipients to run `hermes profile install `. Use git tags for versioned releases — recipients who clone `HEAD` get your latest state, and you can always bump `version:` in the manifest. ## `hermes -p` / `hermes --profile` ```bash hermes -p [options] hermes --profile [options] ``` Global flag to run any Hermes command under a specific profile without changing the sticky default. This overrides the active profile for the duration of the command. | Option | Description | |--------|-------------| | `-p `, `--profile ` | Profile to use for this command. | **Examples:** ```bash hermes -p work chat -q "Check the server status" hermes --profile dev gateway start hermes -p personal skills list hermes -p work config edit ``` ## `hermes completion` ```bash hermes completion ``` Generates shell completion scripts. Includes completions for profile names and profile subcommands. | Argument | Description | |----------|-------------| | `` | Shell to generate completions for: `bash`, `zsh`, or `fish`. | **Examples:** ```bash # Install completions hermes completion bash >> ~/.bashrc hermes completion zsh >> ~/.zshrc hermes completion fish > ~/.config/fish/completions/hermes.fish # Reload shell source ~/.bashrc ``` After installation, tab completion works for: - `hermes profile ` — subcommands (list, use, create, etc.) - `hermes profile use ` — profile names - `hermes -p ` — profile names ## See also - [Profiles User Guide](../user-guide/profiles.md) - [CLI Commands Reference](./cli-commands.md) - [FAQ — Profiles section](./faq.md#profiles)