mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-09 08:21:50 +00:00
Subcommands whose handler was a closure defined inside main() — memory, acp, tools, insights, skills, pairing, plugins, mcp, claw — have their handler promoted to a top-level function and their parser block extracted into hermes_cli/subcommands/<name>.py (build_<name>_parser, injected handler). These 9 had zero closure-over-main-locals, so promotion is a pure relocation. acp/mcp parser blocks use the shared add_accept_hooks_flag helper. main() 1798 -> 954 LOC (71% below the 3297 Phase-2 starting point); add_parser calls in main.py 89 -> 28. Deferred: sessions, computer-use, secrets handlers reference <name>_parser (for a no-subcommand print_help fallback) — left in place to avoid the _self_parser indirection; minority, low value. Behavior-neutral: all 9 subcommands' --help (incl nested subactions) byte- identical to pre-extraction (diff-verified). tests/hermes_cli/ 6519 passed / 0 failed; new test_subcommands_followup.py covers the 9 builders.
92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
"""``hermes claw`` subcommand parser.
|
|
|
|
Extracted from ``hermes_cli/main.py:main()`` (god-file Phase 2 follow-up).
|
|
Handler injected to avoid importing ``main``.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Callable
|
|
|
|
|
|
def build_claw_parser(subparsers, *, cmd_claw: Callable) -> None:
|
|
"""Attach the ``claw`` subcommand to ``subparsers``."""
|
|
claw_parser = subparsers.add_parser(
|
|
"claw",
|
|
help="OpenClaw migration tools",
|
|
description="Migrate settings, memories, skills, and API keys from OpenClaw to Hermes",
|
|
)
|
|
claw_subparsers = claw_parser.add_subparsers(dest="claw_action")
|
|
|
|
# claw migrate
|
|
claw_migrate = claw_subparsers.add_parser(
|
|
"migrate",
|
|
help="Migrate from OpenClaw to Hermes",
|
|
description="Import settings, memories, skills, and API keys from an OpenClaw installation. "
|
|
"Always shows a preview before making changes.",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--source", help="Path to OpenClaw directory (default: ~/.openclaw)"
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="Preview only — stop after showing what would be migrated",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--preset",
|
|
choices=["user-data", "full"],
|
|
default="full",
|
|
help="Migration preset (default: full). Neither preset imports secrets — "
|
|
"pass --migrate-secrets to include API keys.",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--overwrite",
|
|
action="store_true",
|
|
help="Overwrite existing files (default: refuse to apply when the plan has conflicts)",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--migrate-secrets",
|
|
action="store_true",
|
|
help="Include allowlisted secrets (TELEGRAM_BOT_TOKEN, API keys, etc.). "
|
|
"Required even under --preset full.",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--no-backup",
|
|
action="store_true",
|
|
help="Skip the pre-migration zip snapshot of ~/.hermes/ (by default a "
|
|
"single restore-point archive is written to ~/.hermes/backups/ "
|
|
"before apply; restorable with 'hermes import').",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--workspace-target", help="Absolute path to copy workspace instructions into"
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--skill-conflict",
|
|
choices=["skip", "overwrite", "rename"],
|
|
default="skip",
|
|
help="How to handle skill name conflicts (default: skip)",
|
|
)
|
|
claw_migrate.add_argument(
|
|
"--yes", "-y", action="store_true", help="Skip confirmation prompts"
|
|
)
|
|
|
|
# claw cleanup
|
|
claw_cleanup = claw_subparsers.add_parser(
|
|
"cleanup",
|
|
aliases=["clean"],
|
|
help="Archive leftover OpenClaw directories after migration",
|
|
description="Scan for and archive leftover OpenClaw directories to prevent state fragmentation",
|
|
)
|
|
claw_cleanup.add_argument(
|
|
"--source", help="Path to a specific OpenClaw directory to clean up"
|
|
)
|
|
claw_cleanup.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="Preview what would be archived without making changes",
|
|
)
|
|
claw_cleanup.add_argument(
|
|
"--yes", "-y", action="store_true", help="Skip confirmation prompts"
|
|
)
|
|
claw_parser.set_defaults(func=cmd_claw)
|