diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 3d716e8ef..71f35c195 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -9860,19 +9860,20 @@ def cmd_profile(args): try: clone_from = getattr(args, "clone_from", None) + clone_config = clone or clone_from is not None profile_dir = create_profile( name=name, clone_from=clone_from, clone_all=clone_all, - clone_config=clone, + clone_config=clone_config, no_alias=no_alias, no_skills=no_skills, description=getattr(args, "description", None), ) print(f"\nProfile '{name}' created at {profile_dir}") - if clone or clone_all: + if clone_config or clone_all: source_label = ( getattr(args, "clone_from", None) or get_active_profile_name() ) @@ -9886,8 +9887,8 @@ def cmd_profile(args): f"Cloned config, .env, SOUL.md, and skills from {source_label}." ) - # Auto-clone Honcho config for the new profile (only with --clone/--clone-all) - if clone or clone_all: + # Auto-clone Honcho config for the new profile (only with clone operations) + if clone_config or clone_all: try: from plugins.memory.honcho.cli import clone_honcho_for_profile @@ -9896,10 +9897,10 @@ def cmd_profile(args): except Exception: pass # Honcho plugin not installed or not configured - # Seed bundled skills (skip if --clone-all already copied them, or - # if --no-skills was passed — in which case seed_profile_skills() - # honors the marker file and returns skipped_opt_out=True). - if not clone_all: + # Seed bundled skills for fresh profiles only. Clone operations + # already copied the source profile's skills, including any + # user-installed or intentionally removed skills. + if not (clone_config or clone_all): result = seed_profile_skills(profile_dir) if result and result.get("skipped_opt_out"): print( diff --git a/hermes_cli/profiles.py b/hermes_cli/profiles.py index b1bec337e..7617089c0 100644 --- a/hermes_cli/profiles.py +++ b/hermes_cli/profiles.py @@ -784,9 +784,9 @@ def create_profile( Path The newly created profile directory. """ - if no_skills and (clone_config or clone_all): + if no_skills and (clone_from is not None or clone_config or clone_all): raise ValueError( - "--no-skills is mutually exclusive with --clone / --clone-all " + "--no-skills is mutually exclusive with --clone / --clone-from / --clone-all " "(cloning explicitly copies skills from the source profile)." ) canon = normalize_profile_name(name) diff --git a/hermes_cli/subcommands/profile.py b/hermes_cli/subcommands/profile.py index 5c6f98a03..d812fadf9 100644 --- a/hermes_cli/subcommands/profile.py +++ b/hermes_cli/subcommands/profile.py @@ -35,17 +35,17 @@ def build_profile_parser(subparsers, *, cmd_profile: Callable) -> None: profile_create.add_argument( "--clone", action="store_true", - help="Copy config.yaml, .env, SOUL.md from active profile", + help="Copy config.yaml, .env, SOUL.md, and skills from active profile", ) profile_create.add_argument( "--clone-all", action="store_true", - help="Full copy of active profile (all state)", + help="Full copy of active profile (all state, excluding per-profile history)", ) profile_create.add_argument( "--clone-from", metavar="SOURCE", - help="Source profile to clone from (default: active)", + help="Source profile to clone from; implies --clone unless --clone-all is set", ) profile_create.add_argument( "--no-alias", action="store_true", help="Skip wrapper script creation" diff --git a/website/docs/reference/cli-commands.md b/website/docs/reference/cli-commands.md index 9cd9be744..3071ac0e5 100644 --- a/website/docs/reference/cli-commands.md +++ b/website/docs/reference/cli-commands.md @@ -1396,7 +1396,7 @@ Manage profiles — multiple isolated Hermes instances, each with its own config |------------|-------------| | `list` | List all profiles. | | `use ` | Set a sticky default profile. | -| `create [--clone] [--clone-all] [--clone-from ] [--no-alias]` | Create a new profile. `--clone` copies config, `.env`, and `SOUL.md` from the active profile. `--clone-all` copies all state. `--clone-from` specifies a source profile. | +| `create [--clone] [--clone-all] [--clone-from ] [--no-alias]` | Create a new profile. `--clone` copies config, `.env`, `SOUL.md`, and skills from the active profile. `--clone-all` copies all state. `--clone-from` specifies a source profile and implies config clone unless paired with `--clone-all`. | | `delete [-y]` | Delete a profile. | | `show ` | Show profile details (home directory, config, etc.). | | `alias [--remove] [--name NAME]` | Manage wrapper scripts for quick profile access. | diff --git a/website/docs/reference/faq.md b/website/docs/reference/faq.md index 36665410a..75e49b2a2 100644 --- a/website/docs/reference/faq.md +++ b/website/docs/reference/faq.md @@ -634,7 +634,7 @@ No. Each messaging platform (Telegram, Discord, etc.) requires exclusive access ### Do profiles share memory or sessions? -No. Each profile has its own memory store, session database, and skills directory. They are completely isolated. If you want to start a new profile with existing memories and sessions, use `hermes profile create newname --clone-all` to copy everything from the current profile. +No. Each profile has its own memory store, session database, and skills directory. They are completely isolated. If you want to start a new profile with existing memories and sessions, use `hermes profile create newname --clone-all` to copy everything from the current profile, or add `--clone-from ` to copy from a specific source profile. ### What happens when I run `hermes update`? diff --git a/website/docs/reference/profile-commands.md b/website/docs/reference/profile-commands.md index a1b09ed9a..678e51806 100644 --- a/website/docs/reference/profile-commands.md +++ b/website/docs/reference/profile-commands.md @@ -80,12 +80,12 @@ 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`, and `SOUL.md` from the current profile. | +| `--clone` | Copy `config.yaml`, `.env`, `SOUL.md`, and skills from the current profile. | | `--clone-all` | Copy everything (config, memories, skills, cron, plugins) from the current profile. Excludes per-profile history: sessions, `state.db`, backups, state-snapshots, checkpoints. | -| `--clone-from ` | Clone from a specific profile instead of the current one. Used with `--clone` or `--clone-all`. | +| `--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-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`. | +| `--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`. @@ -102,7 +102,10 @@ hermes profile create work --clone hermes profile create backup --clone-all # Clone config from a specific profile -hermes profile create work2 --clone --clone-from work +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` diff --git a/website/docs/user-guide/profiles.md b/website/docs/user-guide/profiles.md index 6e583db2b..f2cfeac54 100644 --- a/website/docs/user-guide/profiles.md +++ b/website/docs/user-guide/profiles.md @@ -50,7 +50,7 @@ You can also set or auto-generate the description later with `hermes profile des hermes profile create work --clone ``` -Copies your current profile's `config.yaml`, `.env`, and `SOUL.md` into the new profile. Same API keys and model, but fresh sessions and memory. Edit `~/.hermes/profiles/work/.env` for different API keys, or `~/.hermes/profiles/work/SOUL.md` for a different personality. +Copies your current profile's `config.yaml`, `.env`, `SOUL.md`, and skills into the new profile. Same API keys, model, and capabilities, but fresh sessions and memory. Edit `~/.hermes/profiles/work/.env` for different API keys, or `~/.hermes/profiles/work/SOUL.md` for a different personality. ### Clone everything (`--clone-all`) @@ -63,11 +63,17 @@ Copies **everything** — config, API keys, personality, all memories, skills, c ### Clone from a specific profile ```bash -hermes profile create work --clone --clone-from coder +hermes profile create work --clone-from coder +``` + +`--clone-from ` selects the source profile directly and implies a config/skills/SOUL clone. Combine it with `--clone-all` when you want a full copy of that source profile: + +```bash +hermes profile create work-backup --clone-from coder --clone-all ``` :::tip Honcho memory + profiles -When Honcho is enabled, `--clone` automatically creates a dedicated AI peer for the new profile while sharing the same user workspace. Each profile builds its own observations and identity. See [Honcho -- Multi-agent / Profiles](./features/memory-providers.md#honcho) for details. +When Honcho is enabled, clone operations automatically create a dedicated AI peer for the new profile while sharing the same user workspace. Each profile builds its own observations and identity. See [Honcho -- Multi-agent / Profiles](./features/memory-providers.md#honcho) for details. ::: ## Using profiles