import type { Command } from "commander"; import { backupVerifyCommand } from "../../commands/backup-verify.js"; import { backupCreateCommand } from "../../commands/backup.js"; import { defaultRuntime } from "../../runtime.js"; import { formatDocsLink } from "../../terminal/links.js"; import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { formatHelpExamples } from "../help-format.js"; export function registerBackupCommand(program: Command) { const backup = program .command("backup") .description("Create and verify local backup archives for OpenSkyNet state") .addHelpText( "after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/backup", "docs.openclaw.ai/cli/backup")}\n`, ); backup .command("create") .description("Write a backup archive for config, credentials, sessions, and workspaces") .option("--output ", "Archive path or destination directory") .option("--json", "Output JSON", false) .option("--dry-run", "Print the backup plan without writing the archive", false) .option("--verify", "Verify the archive after writing it", false) .option("--only-config", "Back up only the active JSON config file", false) .option("--no-include-workspace", "Exclude workspace directories from the backup") .addHelpText( "after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([ ["openclaw backup create", "Create a timestamped backup in the current directory."], [ "openclaw backup create --output ~/Backups", "Write the archive into an existing backup directory.", ], [ "openclaw backup create --dry-run --json", "Preview the archive plan without writing any files.", ], [ "openclaw backup create --verify", "Create the archive and immediately validate its manifest and payload layout.", ], [ "openclaw backup create --no-include-workspace", "Back up state/config without agent workspace files.", ], ["openclaw backup create --only-config", "Back up only the active JSON config file."], ])}`, ) .action(async (opts) => { await runCommandWithRuntime(defaultRuntime, async () => { await backupCreateCommand(defaultRuntime, { output: opts.output as string | undefined, json: Boolean(opts.json), dryRun: Boolean(opts.dryRun), verify: Boolean(opts.verify), onlyConfig: Boolean(opts.onlyConfig), includeWorkspace: opts.includeWorkspace as boolean, }); }); }); backup .command("verify ") .description("Validate a backup archive and its embedded manifest") .option("--json", "Output JSON", false) .addHelpText( "after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([ [ "openclaw backup verify ./2026-03-09T00-00-00.000Z-openclaw-backup.tar.gz", "Check that the archive structure and manifest are intact.", ], [ "openclaw backup verify ~/Backups/latest.tar.gz --json", "Emit machine-readable verification output.", ], ])}`, ) .action(async (archive, opts) => { await runCommandWithRuntime(defaultRuntime, async () => { await backupVerifyCommand(defaultRuntime, { archive: archive as string, json: Boolean(opts.json), }); }); }); }