File size: 3,634 Bytes
fc93158 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | 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 <path>", "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 <archive>")
.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),
});
});
});
}
|