Skip to content

feat: add 'hermes claw migrate' command + migration docs#1059

Merged
teknium1 merged 1 commit into
mainfrom
hermes/hermes-e31afb4d
Mar 12, 2026
Merged

feat: add 'hermes claw migrate' command + migration docs#1059
teknium1 merged 1 commit into
mainfrom
hermes/hermes-e31afb4d

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

Adds a proper CLI command for OpenClaw migration and comprehensive documentation, building on PR #981 which integrated migration into the setup wizard.

Changes

New: hermes claw migrate command

  • hermes_cli/claw.py — full CLI migration handler with formatted output
  • Supports: --dry-run, --preset {user-data,full}, --overwrite, --source PATH, --skill-conflict {skip,overwrite,rename}, --workspace-target PATH, --yes
  • Uses same display functions as setup wizard for visual consistency
  • Graceful error handling for missing directories, missing scripts, migration failures

Fix: Python 3.11+ @dataclass bug in dynamic module loading

  • The migration script uses @dataclass, which requires sys.modules registration for dynamically loaded modules in Python 3.11+
  • Fixed in both setup.py (PR feat: offer OpenClaw migration during first-time setup wizard #981's code) and new claw.py
  • Without this fix, running hermes setup with ~/.openclaw present would crash with: AttributeError: 'NoneType' object has no attribute '__dict__'

Documentation

  • README.md — added hermes claw migrate to Getting Started, new "Migrating from OpenClaw" section
  • docs/migration/openclaw.md — full migration guide covering all three migration methods, options table, what gets imported, conflict handling, troubleshooting
  • SKILL.md — added CLI Command section at top of openclaw-migration skill

Tests

  • 16 new tests in tests/hermes_cli/test_claw.py covering script discovery, command routing, dry-run, execute, cancellation, error handling, report formatting
  • All 231 hermes_cli tests pass, all 3177 tests in the full suite pass (4 pre-existing failures unrelated to this PR)

Test Plan

python -m pytest tests/hermes_cli/test_claw.py -n0 -v      # 16 new tests
python -m pytest tests/hermes_cli/ -n0 -q                    # 231 passed
python -m hermes_cli.main claw -h                            # Help output
python -m hermes_cli.main claw migrate --help                # Migrate help
python -m hermes_cli.main claw migrate --dry-run             # Dry run (no .openclaw)
python -m hermes_cli.main claw migrate --dry-run --source /path/to/.openclaw  # With source

- Add hermes_cli/claw.py with full CLI migration handler:
  - hermes claw migrate (interactive migration with confirmation)
  - --dry-run, --preset, --overwrite, --skill-conflict flags
  - --source for custom OpenClaw path
  - --yes to skip confirmation
  - Clean formatted output matching setup wizard style

- Fix Python 3.11+ @DataClass compatibility bug in dynamic module loading:
  - Register module in sys.modules before exec_module()
  - Fixes both setup.py (PR #981) and new claw.py

- Add 16 tests in tests/hermes_cli/test_claw.py covering:
  - Script discovery (project root, installed, missing)
  - Command routing
  - Dry-run, execute, cancellation, error handling
  - Preset/secrets behavior, report formatting

- Documentation updates:
  - README.md: Add 'hermes claw migrate' to Getting Started, new Migration section
  - docs/migration/openclaw.md: Full migration guide with all options
  - SKILL.md: Add CLI Command section at top of openclaw-migration skill
@teknium1 teknium1 merged commit 42cf66a into main Mar 12, 2026
1 check passed
teknium1 pushed a commit that referenced this pull request Apr 22, 2026
…imeout

Upgrades agent-browser from 0.13.0 to 0.26.0, picking up 13 releases of
daemon reliability fixes:

- Daemon hang on Linux from waitpid(-1) race in SIGCHLD handler (#1098)
- Chrome killed after ~10s idle due to PR_SET_PDEATHSIG thread tracking (#1157)
- Orphaned Chrome processes via process-group kill on shutdown (#1137)
- Stale daemon after upgrade via .version sidecar and auto-restart (#1134)
- Idle timeout not firing (sleep future recreated each loop) (#1110)
- Navigation hanging on lifecycle events that never fire (#1059, #1092)
- CDP attach hang on Chrome 144+ (#1133)
- Windows daemon TCP bind with Hyper-V port conflicts (#1041)
- Shadow DOM traversal in accessibility tree snapshots
- doctor command for user self-diagnosis

Also wires AGENT_BROWSER_IDLE_TIMEOUT_MS into the browser subprocess
environment so the daemon self-terminates after our configured inactivity
timeout (default 300s). This is the daemon-side counterpart to the
Python-side inactivity reaper — the daemon kills itself and its Chrome
children when no commands arrive, preventing orphan accumulation even
when the Python process dies without running atexit handlers.

Addresses #7343 (daemon socket hangs, shadow DOM) and #13793 (orphan
accumulation from force-killed sessions).
angelburgosrosado pushed a commit to angelburgosrosado/hermes-agent that referenced this pull request Apr 27, 2026
…h#1059)

feat: add 'hermes claw migrate' command + migration docs
ulasbilgen pushed a commit to ulasbilgen/hermes-adhd-agent that referenced this pull request May 1, 2026
…imeout

Upgrades agent-browser from 0.13.0 to 0.26.0, picking up 13 releases of
daemon reliability fixes:

- Daemon hang on Linux from waitpid(-1) race in SIGCHLD handler (NousResearch#1098)
- Chrome killed after ~10s idle due to PR_SET_PDEATHSIG thread tracking (NousResearch#1157)
- Orphaned Chrome processes via process-group kill on shutdown (NousResearch#1137)
- Stale daemon after upgrade via .version sidecar and auto-restart (NousResearch#1134)
- Idle timeout not firing (sleep future recreated each loop) (NousResearch#1110)
- Navigation hanging on lifecycle events that never fire (NousResearch#1059, NousResearch#1092)
- CDP attach hang on Chrome 144+ (NousResearch#1133)
- Windows daemon TCP bind with Hyper-V port conflicts (NousResearch#1041)
- Shadow DOM traversal in accessibility tree snapshots
- doctor command for user self-diagnosis

Also wires AGENT_BROWSER_IDLE_TIMEOUT_MS into the browser subprocess
environment so the daemon self-terminates after our configured inactivity
timeout (default 300s). This is the daemon-side counterpart to the
Python-side inactivity reaper — the daemon kills itself and its Chrome
children when no commands arrive, preventing orphan accumulation even
when the Python process dies without running atexit handlers.

Addresses NousResearch#7343 (daemon socket hangs, shadow DOM) and NousResearch#13793 (orphan
accumulation from force-killed sessions).
aj-nt pushed a commit to aj-nt/hermes-agent that referenced this pull request May 1, 2026
…imeout

Upgrades agent-browser from 0.13.0 to 0.26.0, picking up 13 releases of
daemon reliability fixes:

- Daemon hang on Linux from waitpid(-1) race in SIGCHLD handler (NousResearch#1098)
- Chrome killed after ~10s idle due to PR_SET_PDEATHSIG thread tracking (NousResearch#1157)
- Orphaned Chrome processes via process-group kill on shutdown (NousResearch#1137)
- Stale daemon after upgrade via .version sidecar and auto-restart (NousResearch#1134)
- Idle timeout not firing (sleep future recreated each loop) (NousResearch#1110)
- Navigation hanging on lifecycle events that never fire (NousResearch#1059, NousResearch#1092)
- CDP attach hang on Chrome 144+ (NousResearch#1133)
- Windows daemon TCP bind with Hyper-V port conflicts (NousResearch#1041)
- Shadow DOM traversal in accessibility tree snapshots
- doctor command for user self-diagnosis

Also wires AGENT_BROWSER_IDLE_TIMEOUT_MS into the browser subprocess
environment so the daemon self-terminates after our configured inactivity
timeout (default 300s). This is the daemon-side counterpart to the
Python-side inactivity reaper — the daemon kills itself and its Chrome
children when no commands arrive, preventing orphan accumulation even
when the Python process dies without running atexit handlers.

Addresses NousResearch#7343 (daemon socket hangs, shadow DOM) and NousResearch#13793 (orphan
accumulation from force-killed sessions).
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
…h#1059)

feat: add 'hermes claw migrate' command + migration docs
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
…imeout

Upgrades agent-browser from 0.13.0 to 0.26.0, picking up 13 releases of
daemon reliability fixes:

- Daemon hang on Linux from waitpid(-1) race in SIGCHLD handler (NousResearch#1098)
- Chrome killed after ~10s idle due to PR_SET_PDEATHSIG thread tracking (NousResearch#1157)
- Orphaned Chrome processes via process-group kill on shutdown (NousResearch#1137)
- Stale daemon after upgrade via .version sidecar and auto-restart (NousResearch#1134)
- Idle timeout not firing (sleep future recreated each loop) (NousResearch#1110)
- Navigation hanging on lifecycle events that never fire (NousResearch#1059, NousResearch#1092)
- CDP attach hang on Chrome 144+ (NousResearch#1133)
- Windows daemon TCP bind with Hyper-V port conflicts (NousResearch#1041)
- Shadow DOM traversal in accessibility tree snapshots
- doctor command for user self-diagnosis

Also wires AGENT_BROWSER_IDLE_TIMEOUT_MS into the browser subprocess
environment so the daemon self-terminates after our configured inactivity
timeout (default 300s). This is the daemon-side counterpart to the
Python-side inactivity reaper — the daemon kills itself and its Chrome
children when no commands arrive, preventing orphan accumulation even
when the Python process dies without running atexit handlers.

Addresses NousResearch#7343 (daemon socket hangs, shadow DOM) and NousResearch#13793 (orphan
accumulation from force-killed sessions).
olympus-terminal pushed a commit to olympus-terminal/hermes-agent that referenced this pull request May 16, 2026
…h#1059)

feat: add 'hermes claw migrate' command + migration docs
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
…imeout

Upgrades agent-browser from 0.13.0 to 0.26.0, picking up 13 releases of
daemon reliability fixes:

- Daemon hang on Linux from waitpid(-1) race in SIGCHLD handler (NousResearch#1098)
- Chrome killed after ~10s idle due to PR_SET_PDEATHSIG thread tracking (NousResearch#1157)
- Orphaned Chrome processes via process-group kill on shutdown (NousResearch#1137)
- Stale daemon after upgrade via .version sidecar and auto-restart (NousResearch#1134)
- Idle timeout not firing (sleep future recreated each loop) (NousResearch#1110)
- Navigation hanging on lifecycle events that never fire (NousResearch#1059, NousResearch#1092)
- CDP attach hang on Chrome 144+ (NousResearch#1133)
- Windows daemon TCP bind with Hyper-V port conflicts (NousResearch#1041)
- Shadow DOM traversal in accessibility tree snapshots
- doctor command for user self-diagnosis

Also wires AGENT_BROWSER_IDLE_TIMEOUT_MS into the browser subprocess
environment so the daemon self-terminates after our configured inactivity
timeout (default 300s). This is the daemon-side counterpart to the
Python-side inactivity reaper — the daemon kills itself and its Chrome
children when no commands arrive, preventing orphan accumulation even
when the Python process dies without running atexit handlers.

Addresses NousResearch#7343 (daemon socket hangs, shadow DOM) and NousResearch#13793 (orphan
accumulation from force-killed sessions).
Egavasyug pushed a commit to Egavasyug/hermes-agent that referenced this pull request Jun 10, 2026
…h#1059)

feat: add 'hermes claw migrate' command + migration docs
Egavasyug pushed a commit to Egavasyug/hermes-agent that referenced this pull request Jun 10, 2026
…imeout

Upgrades agent-browser from 0.13.0 to 0.26.0, picking up 13 releases of
daemon reliability fixes:

- Daemon hang on Linux from waitpid(-1) race in SIGCHLD handler (NousResearch#1098)
- Chrome killed after ~10s idle due to PR_SET_PDEATHSIG thread tracking (NousResearch#1157)
- Orphaned Chrome processes via process-group kill on shutdown (NousResearch#1137)
- Stale daemon after upgrade via .version sidecar and auto-restart (NousResearch#1134)
- Idle timeout not firing (sleep future recreated each loop) (NousResearch#1110)
- Navigation hanging on lifecycle events that never fire (NousResearch#1059, NousResearch#1092)
- CDP attach hang on Chrome 144+ (NousResearch#1133)
- Windows daemon TCP bind with Hyper-V port conflicts (NousResearch#1041)
- Shadow DOM traversal in accessibility tree snapshots
- doctor command for user self-diagnosis

Also wires AGENT_BROWSER_IDLE_TIMEOUT_MS into the browser subprocess
environment so the daemon self-terminates after our configured inactivity
timeout (default 300s). This is the daemon-side counterpart to the
Python-side inactivity reaper — the daemon kills itself and its Chrome
children when no commands arrive, preventing orphan accumulation even
when the Python process dies without running atexit handlers.

Addresses NousResearch#7343 (daemon socket hangs, shadow DOM) and NousResearch#13793 (orphan
accumulation from force-killed sessions).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant