Files
hermes-agent/hermes_cli/subcommands/backup.py
kshitijk4poor 5d579c5144 refactor(tools): pass the Unicode edit plan explicitly; tighten JSON constant scan
Behaviour-neutral review cleanups for the stack:

- fuzzy_match: _preserve_unicode_in_replacement now requires the plan
  (it is always precomputed by the caller), so the unused old_string param
  and the plan-less fallback go away. _apply_replacements takes the
  precomputed unicode_plan instead of a preserve_unicode flag, keeping the
  strategy decision in fuzzy_find_and_replace where it is made.
- file_operations: _json_nonstandard_constant skips the full json.loads
  when the text cannot contain NaN/Infinity (every JSON write pays this
  scan), strips the BOM via the shared _strip_bom helper, and catches only
  the errors json.loads can raise on str input instead of a blanket
  Exception.
- backup: the --keep validator comment now states why it exists (a
  negative keep slices away the newest archives).
2026-10-02 01:15:39 +05:30

36 lines
1.6 KiB
Python

"""``hermes backup`` subcommand parser."""
from __future__ import annotations
from argparse import ArgumentTypeError
from typing import Callable
def _non_negative_keep(value: str) -> int:
# A negative keep would slice away the NEWEST archives instead of the oldest.
if not value.isdecimal():
raise ArgumentTypeError("must be a non-negative integer (0 keeps everything)")
return int(value)
def build_backup_parser(subparsers, *, cmd_backup: Callable) -> None:
"""Attach the ``backup`` subcommand to ``subparsers``."""
backup_parser = subparsers.add_parser(
"backup", help="Back up Hermes home directory to a zip file",
description="Create a zip archive of your entire Hermes configuration, "
"skills, sessions, and data (excludes the hermes-agent codebase). "
"Use --quick for a fast snapshot of just critical state files.")
backup_parser.add_argument(
"-o",
"--output", help="Output path for the zip file (default: ~/hermes-backup-<timestamp>.zip)")
backup_parser.add_argument(
"-q", "--quick", action="store_true",
help="Quick snapshot: only critical state files (config, state.db, .env, auth, cron)")
backup_parser.add_argument(
"-l", "--label", help="Label for the snapshot (only used with --quick)")
backup_parser.add_argument(
"-k", "--keep", type=_non_negative_keep, default=3, metavar="N",
help="After a full backup, delete older hermes-backup-*.zip files in the output "
"directory beyond the newest N (default 3; 0 keeps everything)")
backup_parser.set_defaults(func=cmd_backup)