[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MT18X0TFM0JBZRY19EDXEX":3,"skill-same:01M6MT18X0TFM0JBZRY19EDXEX":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6MT18X0TFM0JBZRY19EDXEX","backup",null,"Backup and restore openclaw configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.","Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002FGit和GitHub\u002Fbackup\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"version","tar","with","rsync","control","commands","across","configuration","restore","openclaw","settings","automate","migrate","devices","git","sync","2026-11-10 10:12:30",false,"---\nname: backup\ndescription: Backup and restore openclaw configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.\nmetadata: {\"openclaw\":{\"emoji\":\"?\",\"requires\":{\"bins\":[\"git\",\"tar\",\"rsync\"],\"env\":[]}}}\n---\n\n# OpenClaw Backup Skill\n\nBackup, restore, and sync your OpenClaw configuration across devices directly from openclaw.\n\n## Overview\n\nThis skill helps you:\n- Backup all openclaw data and settings\n- Restore from backups\n- Sync between multiple machines\n- Version control your configuration\n- Automate backup routines\n- Migrate to new devices\n\n## openclaw Directory Structure\n\n### Key Locations\n\n```\n~\u002F.claude\u002F                    # Main openclaw directory\n├── settings.json             # Global settings\n├── settings.local.json       # Local overrides (machine-specific)\n├── projects.json             # Project configurations\n├── skills\u002F                   # Your custom skills\n│   ├── skill-name\u002F\n│   │   ├── SKILL.md\n│   │   └── supporting-files\u002F\n│   └── another-skill\u002F\n├── commands\u002F                 # Custom slash commands (legacy)\n│   └── command-name.md\n├── contexts\u002F                 # Saved contexts\n├── templates\u002F                # Response templates\n└── mcp\u002F                      # MCP server configurations\n    └── servers.json\n\n~\u002Fprojects\u002F                   # Your projects (optional backup)\n├── project-1\u002F\n│   └── .claude\u002F              # Project-specific config\n│       ├── settings.json\n│       └── skills\u002F\n└── project-2\u002F\n```\n\n### What to Backup\n\n```\nESSENTIAL (Always backup):\n✓ ~\u002F.claude\u002Fskills\u002F           # Custom skills\n✓ ~\u002F.claude\u002Fcommands\u002F         # Custom commands\n✓ ~\u002F.claude\u002Fsettings.json     # Global settings\n✓ ~\u002F.claude\u002Fmcp\u002F              # MCP configurations\n\nRECOMMENDED (Usually backup):\n✓ ~\u002F.claude\u002Fcontexts\u002F         # Saved contexts\n✓ ~\u002F.claude\u002Ftemplates\u002F        # Templates\n✓ Project .claude\u002F folders    # Project configs\n\nOPTIONAL (Case by case):\n○ ~\u002F.claude\u002Fsettings.local.json  # Machine-specific\n○ Cache directories              # Can be rebuilt\n○ Log files                      # Usually not needed\n```\n\n## Quick Backup Commands\n\n### Full Backup\n\n```bash\n# Create timestamped backup\nBACKUP_DIR=\"$HOME\u002Fopenclaw-backups\"\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nBACKUP_NAME=\"openclaw_backup_$TIMESTAMP\"\n\nmkdir -p \"$BACKUP_DIR\"\n\ntar -czvf \"$BACKUP_DIR\u002F$BACKUP_NAME.tar.gz\" \\\n  -C \"$HOME\" \\\n  .claude\u002Fskills \\\n  .claude\u002Fcommands \\\n  .claude\u002Fsettings.json \\\n  .claude\u002Fmcp \\\n  .claude\u002Fcontexts \\\n  .claude\u002Ftemplates \\\n  2>\u002Fdev\u002Fnull\n\necho \"Backup created: $BACKUP_DIR\u002F$BACKUP_NAME.tar.gz\"\n```\n\n### Quick Skills-Only Backup\n\n```bash\n# Backup just skills\ntar -czvf ~\u002Fopenclaw_skills_$(date +%Y%m%d).tar.gz \\\n  -C \"$HOME\" .claude\u002Fskills .claude\u002Fcommands\n```\n\n### Restore from Backup\n\n```bash\n# Restore full backup\nBACKUP_FILE=\"$HOME\u002Fopenclaw-backups\u002Fopenclaw_backup_20260129.tar.gz\"\n\n# Preview contents first\ntar -tzvf \"$BACKUP_FILE\"\n\n# Restore (will overwrite existing)\ntar -xzvf \"$BACKUP_FILE\" -C \"$HOME\"\n\necho \"Restore complete!\"\n```\n\n## Backup Script\n\n### Full-Featured Backup Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# openclaw-backup.sh - Comprehensive openclaw backup tool\n\nset -e\n\n# Configuration\nBACKUP_ROOT=\"${openclaw_BACKUP_DIR:-$HOME\u002Fopenclaw-backups}\"\nCLAUDE_DIR=\"$HOME\u002F.claude\"\nMAX_BACKUPS=10  # Keep last N backups\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\n\n# Colors\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nNC='\\033[0m'\n\nlog_info() { echo -e \"${GREEN}[INFO]${NC} $1\"; }\nlog_warn() { echo -e \"${YELLOW}[WARN]${NC} $1\"; }\nlog_error() { echo -e \"${RED}[ERROR]${NC} $1\"; }\n\n# Check if openclaw directory exists\ncheck_claude_dir() {\n    if [ ! -d \"$CLAUDE_DIR\" ]; then\n        log_error \"openclaw directory not found: $CLAUDE_DIR\"\n        exit 1\n    fi\n}\n\n# Create backup\ncreate_backup() {\n    local backup_type=\"${1:-full}\"\n    local backup_name=\"openclaw_${backup_type}_${TIMESTAMP}\"\n    local backup_path=\"$BACKUP_ROOT\u002F$backup_name.tar.gz\"\n    \n    mkdir -p \"$BACKUP_ROOT\"\n    \n    log_info \"Creating $backup_type backup...\"\n    \n    case $backup_type in\n        full)\n            tar -czvf \"$backup_path\" \\\n                -C \"$HOME\" \\\n                .claude\u002Fskills \\\n                .claude\u002Fcommands \\\n                .claude\u002Fsettings.json \\\n                .claude\u002Fsettings.local.json \\\n                .claude\u002Fprojects.json \\\n                .claude\u002Fmcp \\\n                .claude\u002Fcontexts \\\n                .claude\u002Ftemplates \\\n                2>\u002Fdev\u002Fnull || true\n            ;;\n        skills)\n            tar -czvf \"$backup_path\" \\\n                -C \"$HOME\" \\\n                .claude\u002Fskills \\\n                .claude\u002Fcommands \\\n                2>\u002Fdev\u002Fnull || true\n            ;;\n        settings)\n            tar -czvf \"$backup_path\" \\\n                -C \"$HOME\" \\\n                .claude\u002Fsettings.json \\\n                .claude\u002Fsettings.local.json \\\n                .claude\u002Fmcp \\\n                2>\u002Fdev\u002Fnull || true\n            ;;\n        *)\n            log_error \"Unknown backup type: $backup_type\"\n            exit 1\n            ;;\n    esac\n    \n    if [ -f \"$backup_path\" ]; then\n        local size=$(du -h \"$backup_path\" | cut -f1)\n        log_info \"Backup created: $backup_path ($size)\"\n    else\n        log_error \"Backup failed!\"\n        exit 1\n    fi\n}\n\n# List backups\nlist_backups() {\n    log_info \"Available backups in $BACKUP_ROOT:\"\n    echo \"\"\n    \n    if [ -d \"$BACKUP_ROOT\" ]; then\n        ls -lh \"$BACKUP_ROOT\"\u002F*.tar.gz 2>\u002Fdev\u002Fnull | \\\n            awk '{print $9, $5, $6, $7, $8}' || \\\n            echo \"No backups found.\"\n    else\n        echo \"Backup directory doesn't exist.\"\n    fi\n}\n\n# Restore backup\nrestore_backup() {\n    local backup_file=\"$1\"\n    \n    if [ -z \"$backup_file\" ]; then\n        log_error \"Please specify backup file\"\n        list_backups\n        exit 1\n    fi\n    \n    if [ ! -f \"$backup_file\" ]; then\n        # Try relative path in backup dir\n        backup_file=\"$BACKUP_ROOT\u002F$backup_file\"\n    fi\n    \n    if [ ! -f \"$backup_file\" ]; then\n        log_error \"Backup file not found: $backup_file\"\n        exit 1\n    fi\n    \n    log_warn \"This will overwrite existing configuration!\"\n    read -p \"Continue? (y\u002FN) \" confirm\n    \n    if [ \"$confirm\" != \"y\" ] && [ \"$confirm\" != \"Y\" ]; then\n        log_info \"Restore cancelled.\"\n        exit 0\n    fi\n    \n    log_info \"Restoring from: $backup_file\"\n    tar -xzvf \"$backup_file\" -C \"$HOME\"\n    log_info \"Restore complete!\"\n}\n\n# Clean old backups\ncleanup_backups() {\n    log_info \"Cleaning old backups (keeping last $MAX_BACKUPS)...\"\n    \n    cd \"$BACKUP_ROOT\" 2>\u002Fdev\u002Fnull || return\n    \n    local count=$(ls -1 *.tar.gz 2>\u002Fdev\u002Fnull | wc -l)\n    \n    if [ \"$count\" -gt \"$MAX_BACKUPS\" ]; then\n        local to_delete=$((count - MAX_BACKUPS))\n        ls -1t *.tar.gz | tail -n \"$to_delete\" | xargs rm -v\n        log_info \"Removed $to_delete old backup(s)\"\n    else\n        log_info \"No cleanup needed ($count backups)\"\n    fi\n}\n\n# Show backup stats\nshow_stats() {\n    log_info \"openclaw Backup Statistics\"\n    echo \"\"\n    \n    echo \"=== Directory Sizes ===\"\n    du -sh \"$CLAUDE_DIR\"\u002Fskills 2>\u002Fdev\u002Fnull || echo \"Skills: N\u002FA\"\n    du -sh \"$CLAUDE_DIR\"\u002Fcommands 2>\u002Fdev\u002Fnull || echo \"Commands: N\u002FA\"\n    du -sh \"$CLAUDE_DIR\"\u002Fmcp 2>\u002Fdev\u002Fnull || echo \"MCP: N\u002FA\"\n    du -sh \"$CLAUDE_DIR\" 2>\u002Fdev\u002Fnull || echo \"Total: N\u002FA\"\n    \n    echo \"\"\n    echo \"=== Skills Count ===\"\n    find \"$CLAUDE_DIR\u002Fskills\" -name \"SKILL.md\" 2>\u002Fdev\u002Fnull | wc -l | xargs echo \"Skills:\"\n    find \"$CLAUDE_DIR\u002Fcommands\" -name \"*.md\" 2>\u002Fdev\u002Fnull | wc -l | xargs echo \"Commands:\"\n    \n    echo \"\"\n    echo \"=== Backup Directory ===\"\n    if [ -d \"$BACKUP_ROOT\" ]; then\n        du -sh \"$BACKUP_ROOT\"\n        ls -1 \"$BACKUP_ROOT\"\u002F*.tar.gz 2>\u002Fdev\u002Fnull | wc -l | xargs echo \"Backup files:\"\n    else\n        echo \"No backups yet\"\n    fi\n}\n\n# Usage\nusage() {\n    cat \u003C\u003C EOF\nopenclaw Backup Tool\n\nUsage: $(basename $0) \u003Ccommand> [options]\n\nCommands:\n    backup [type]   Create backup (types: full, skills, settings)\n    restore \u003Cfile>  Restore from backup file\n    list            List available backups\n    cleanup         Remove old backups (keep last $MAX_BACKUPS)\n    stats           Show backup statistics\n    help            Show this help\n\nExamples:\n    $(basename $0) backup              # Full backup\n    $(basename $0) backup skills       # Skills only\n    $(basename $0) restore latest.tar.gz\n    $(basename $0) list\n    $(basename $0) cleanup\n\nEnvironment:\n    openclaw_BACKUP_DIR    Backup directory (default: ~\u002Fopenclaw-backups)\n\nEOF\n}\n\n# Main\nmain() {\n    check_claude_dir\n    \n    case \"${1:-help}\" in\n        backup)\n            create_backup \"${2:-full}\"\n            ;;\n        restore)\n            restore_backup \"$2\"\n            ;;\n        list)\n            list_backups\n            ;;\n        cleanup)\n            cleanup_backups\n            ;;\n        stats)\n            show_stats\n            ;;\n        help|--help|-h)\n            usage\n            ;;\n        *)\n            log_error \"Unknown command: $1\"\n            usage\n            exit 1\n            ;;\n    esac\n}\n\nmain \"$@\"\n```\n\n### Save and Use\n\n```bash\n# Save script\ncat > ~\u002F.local\u002Fbin\u002Fopenclaw-backup \u003C\u003C 'SCRIPT'\n# Paste script content here\nSCRIPT\n\nchmod +x ~\u002F.local\u002Fbin\u002Fopenclaw-backup\n\n# Usage\nopenclaw-backup backup          # Full backup\nopenclaw-backup backup skills   # Skills only\nopenclaw-backup list            # List backups\nopenclaw-backup restore \u003Cfile>  # Restore\n```\n\n## Git Version Control\n\n### Initialize Git Repo\n\n```bash\ncd ~\u002F.claude\n\n# Initialize git\ngit init\n\n# Create .gitignore\ncat > .gitignore \u003C\u003C 'EOF'\n# Machine-specific settings\nsettings.local.json\n\n# Cache and temp files\ncache\u002F\n*.tmp\n*.log\n\n# Large files\n*.tar.gz\n*.zip\n\n# Sensitive data (if any)\n*.pem\n*.key\ncredentials\u002F\nEOF\n\n# Initial commit\ngit add .\ngit commit -m \"Initial openclaw configuration backup\"\n```\n\n### Push to Remote\n\n```bash\n# Add remote (GitHub, GitLab, etc)\ngit remote add origin git@github.com:username\u002Fopenclaw-config.git\n\n# Push\ngit push -u origin main\n```\n\n### Daily Workflow\n\n```bash\n# After making changes to skills\u002Fsettings\ncd ~\u002F.claude\ngit add .\ngit commit -m \"Updated skill: trading-bot\"\ngit push\n```\n\n### Auto-Commit Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# auto-commit-claude.sh - Auto commit changes\n\ncd ~\u002F.claude || exit 1\n\n# Check for changes\nif git diff --quiet && git diff --staged --quiet; then\n    echo \"No changes to commit\"\n    exit 0\nfi\n\n# Get changed files for commit message\nCHANGED=$(git status --short | head -5 | awk '{print $2}' | tr '\\n' ', ')\n\ngit add .\ngit commit -m \"Auto-backup: $CHANGED ($(date +%Y-%m-%d))\"\ngit push 2>\u002Fdev\u002Fnull || echo \"Push failed (offline?)\"\n```\n\n## Sync Between Devices\n\n### Method 1: Git Sync\n\n```bash\n# On new device\ngit clone git@github.com:username\u002Fopenclaw-config.git ~\u002F.claude\n\n# Pull latest changes\ncd ~\u002F.claude && git pull\n\n# Push local changes\ncd ~\u002F.claude && git add . && git commit -m \"Update\" && git push\n```\n\n### Method 2: Rsync\n\n```bash\n# Sync to remote server\nrsync -avz --delete \\\n    ~\u002F.claude\u002F \\\n    user@server:~\u002Fopenclaw-backup\u002F\n\n# Sync from remote server\nrsync -avz --delete \\\n    user@server:~\u002Fopenclaw-backup\u002F \\\n    ~\u002F.claude\u002F\n```\n\n### Method 3: Cloud Storage\n\n```bash\n# Backup to cloud folder (Dropbox, Google Drive, etc)\nCLOUD_DIR=\"$HOME\u002FDropbox\u002Fopenclaw\"\n\n# Sync skills\nrsync -avz ~\u002F.claude\u002Fskills\u002F \"$CLOUD_DIR\u002Fskills\u002F\"\nrsync -avz ~\u002F.claude\u002Fcommands\u002F \"$CLOUD_DIR\u002Fcommands\u002F\"\n\n# Copy settings\ncp ~\u002F.claude\u002Fsettings.json \"$CLOUD_DIR\u002F\"\n```\n\n### Sync Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# sync-openclaw.sh - Sync openclaw config between devices\n\nSYNC_DIR=\"${openclaw_SYNC_DIR:-$HOME\u002FDropbox\u002Fopenclaw}\"\nCLAUDE_DIR=\"$HOME\u002F.claude\"\n\nsync_to_cloud() {\n    echo \"Syncing to cloud...\"\n    mkdir -p \"$SYNC_DIR\"\n    \n    rsync -avz --delete \"$CLAUDE_DIR\u002Fskills\u002F\" \"$SYNC_DIR\u002Fskills\u002F\"\n    rsync -avz --delete \"$CLAUDE_DIR\u002Fcommands\u002F\" \"$SYNC_DIR\u002Fcommands\u002F\"\n    rsync -avz \"$CLAUDE_DIR\u002Fmcp\u002F\" \"$SYNC_DIR\u002Fmcp\u002F\" 2>\u002Fdev\u002Fnull\n    cp \"$CLAUDE_DIR\u002Fsettings.json\" \"$SYNC_DIR\u002F\" 2>\u002Fdev\u002Fnull\n    \n    echo \"Sync complete!\"\n}\n\nsync_from_cloud() {\n    echo \"Syncing from cloud...\"\n    \n    rsync -avz \"$SYNC_DIR\u002Fskills\u002F\" \"$CLAUDE_DIR\u002Fskills\u002F\"\n    rsync -avz \"$SYNC_DIR\u002Fcommands\u002F\" \"$CLAUDE_DIR\u002Fcommands\u002F\"\n    rsync -avz \"$SYNC_DIR\u002Fmcp\u002F\" \"$CLAUDE_DIR\u002Fmcp\u002F\" 2>\u002Fdev\u002Fnull\n    \n    # Don't overwrite local settings by default\n    if [ ! -f \"$CLAUDE_DIR\u002Fsettings.json\" ]; then\n        cp \"$SYNC_DIR\u002Fsettings.json\" \"$CLAUDE_DIR\u002F\" 2>\u002Fdev\u002Fnull\n    fi\n    \n    echo \"Sync complete!\"\n}\n\ncase \"$1\" in\n    push) sync_to_cloud ;;\n    pull) sync_from_cloud ;;\n    *)\n        echo \"Usage: $0 {push|pull}\"\n        echo \"  push - Upload local config to cloud\"\n        echo \"  pull - Download cloud config to local\"\n        ;;\nesac\n```\n\n## Automated Backups\n\n### Cron Job (Linux\u002FMac)\n\n```bash\n# Edit crontab\ncrontab -e\n\n# Add daily backup at 2 AM\n0 2 * * * \u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fopenclaw-backup backup full\n\n# Add weekly cleanup on Sundays\n0 3 * * 0 \u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fopenclaw-backup cleanup\n\n# Add git auto-commit every 6 hours\n0 *\u002F6 * * * cd ~\u002F.claude && git add . && git commit -m \"Auto-backup $(date +\\%Y-\\%m-\\%d)\" && git push 2>\u002Fdev\u002Fnull\n```\n\n### Systemd Timer (Linux)\n\n```bash\n# Create service: ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.service\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.service \u003C\u003C 'EOF'\n[Unit]\nDescription=openclaw Backup\n\n[Service]\nType=oneshot\nExecStart=\u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fopenclaw-backup backup full\nEOF\n\n# Create timer: ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.timer\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.timer \u003C\u003C 'EOF'\n[Unit]\nDescription=Daily openclaw Backup\n\n[Timer]\nOnCalendar=daily\nPersistent=true\n\n[Install]\nWantedBy=timers.target\nEOF\n\n# Enable\nsystemctl --user enable openclaw-backup.timer\nsystemctl --user start openclaw-backup.timer\n```\n\n### Launchd (macOS)\n\n```bash\n# Create plist: ~\u002FLibrary\u002FLaunchAgents\u002Fcom.openclaw.backup.plist\ncat > ~\u002FLibrary\u002FLaunchAgents\u002Fcom.openclaw.backup.plist \u003C\u003C 'EOF'\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n    \u003Ckey>Label\u003C\u002Fkey>\n    \u003Cstring>com.openclaw.backup\u003C\u002Fstring>\n    \u003Ckey>ProgramArguments\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cstring>\u002FUsers\u002Fusername\u002F.local\u002Fbin\u002Fopenclaw-backup\u003C\u002Fstring>\n        \u003Cstring>backup\u003C\u002Fstring>\n        \u003Cstring>full\u003C\u002Fstring>\n    \u003C\u002Farray>\n    \u003Ckey>StartCalendarInterval\u003C\u002Fkey>\n    \u003Cdict>\n        \u003Ckey>Hour\u003C\u002Fkey>\n        \u003Cinteger>2\u003C\u002Finteger>\n        \u003Ckey>Minute\u003C\u002Fkey>\n        \u003Cinteger>0\u003C\u002Finteger>\n    \u003C\u002Fdict>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\nEOF\n\n# Load\nlaunchctl load ~\u002FLibrary\u002FLaunchAgents\u002Fcom.openclaw.backup.plist\n```\n\n## Migration Guide\n\n### Migrate to New Machine\n\n```bash\n# === On OLD machine ===\n\n# 1. Create full backup\nopenclaw-backup backup full\n\n# 2. Copy backup file to new machine\nscp ~\u002Fopenclaw-backups\u002Fopenclaw_full_*.tar.gz newmachine:~\u002F\n\n# Or use git\ncd ~\u002F.claude\ngit add . && git commit -m \"Pre-migration backup\"\ngit push\n\n\n# === On NEW machine ===\n\n# Method A: From backup file\ntar -xzvf ~\u002Fopenclaw_full_*.tar.gz -C ~\n\n# Method B: From git\ngit clone git@github.com:username\u002Fopenclaw-config.git ~\u002F.claude\n\n# 3. Verify\nls -la ~\u002F.claude\u002Fskills\u002F\n```\n\n### Export Single Skill\n\n```bash\n# Export one skill for sharing\nSKILL_NAME=\"my-awesome-skill\"\ntar -czvf \"${SKILL_NAME}.tar.gz\" -C ~\u002F.claude\u002Fskills \"$SKILL_NAME\"\n\n# Import skill\ntar -xzvf \"${SKILL_NAME}.tar.gz\" -C ~\u002F.claude\u002Fskills\u002F\n```\n\n### Export All Skills for Sharing\n\n```bash\n# Create shareable skills bundle (no personal settings)\ntar -czvf openclaw-skills-share.tar.gz \\\n    -C ~\u002F.claude \\\n    skills \\\n    --exclude='*.local*' \\\n    --exclude='*personal*'\n```\n\n## Backup Verification\n\n### Verify Backup Integrity\n\n```bash\n# Test backup without extracting\ntar -tzvf backup.tar.gz > \u002Fdev\u002Fnull && echo \"Backup OK\" || echo \"Backup CORRUPT\"\n\n# List contents\ntar -tzvf backup.tar.gz\n\n# Verify specific file exists\ntar -tzvf backup.tar.gz | grep \"skills\u002Fmy-skill\u002FSKILL.md\"\n```\n\n### Compare Backup to Current\n\n```bash\n# Extract to temp dir\nTEMP_DIR=$(mktemp -d)\ntar -xzf backup.tar.gz -C \"$TEMP_DIR\"\n\n# Compare\ndiff -rq ~\u002F.claude\u002Fskills \"$TEMP_DIR\u002F.claude\u002Fskills\"\n\n# Cleanup\nrm -rf \"$TEMP_DIR\"\n```\n\n## Troubleshooting\n\n### Common Issues\n\n```bash\n# Issue: Permission denied\nchmod -R u+rw ~\u002F.claude\n\n# Issue: Backup too large\n# Exclude cache and logs\ntar --exclude='cache' --exclude='*.log' -czvf backup.tar.gz ~\u002F.claude\n\n# Issue: Restore overwrote settings\n# Keep settings.local.json for machine-specific config\n# It won't be overwritten if using proper backup\n\n# Issue: Git conflicts after sync\ncd ~\u002F.claude\ngit stash\ngit pull\ngit stash pop\n# Resolve conflicts manually if needed\n```\n\n### Recovery from Corruption\n\n```bash\n# If ~\u002F.claude is corrupted\n\n# 1. Move corrupted dir\nmv ~\u002F.claude ~\u002F.claude.corrupted\n\n# 2. Restore from backup\nopenclaw-backup restore latest.tar.gz\n\n# 3. Or restore from git\ngit clone git@github.com:username\u002Fopenclaw-config.git ~\u002F.claude\n\n# 4. Compare and recover anything missing\ndiff -rq ~\u002F.claude ~\u002F.claude.corrupted\u002F\n```\n\n## Quick Reference\n\n### Essential Commands\n\n```bash\n# Backup\ntar -czvf ~\u002Fopenclaw-backup.tar.gz -C ~ .claude\u002Fskills .claude\u002Fcommands .claude\u002Fsettings.json\n\n# Restore\ntar -xzvf ~\u002Fopenclaw-backup.tar.gz -C ~\n\n# List backup contents\ntar -tzvf ~\u002Fopenclaw-backup.tar.gz\n\n# Git backup\ncd ~\u002F.claude && git add . && git commit -m \"Backup\" && git push\n\n# Git restore\ncd ~\u002F.claude && git pull\n```\n\n### Backup Checklist\n\n```\nBefore major changes:\n□ Create backup\n□ Verify backup integrity\n□ Note what you're changing\n\nRegular maintenance:\n□ Weekly full backup\n□ Daily git commits (if using)\n□ Monthly cleanup of old backups\n□ Test restore procedure quarterly\n```\n\n## Resources\n\n### Related Skills\n```\n- skill-creator - Create new skills\n- mcp-builder - Configure MCP servers\n- dotfiles - General dotfile management\n```\n\n### Documentation\n```\n- openclaw Docs: docs.openclaw.com\n- Skills Guide: docs.openclaw.com\u002Fskills\n- MCP Setup: docs.openclaw.com\u002Fmcp\n```\n\n---\n\n**Tip:** Always test your backup restoration process before you actually need it. A backup you can't restore is worthless!\n","# OpenClaw Backup Skill\n\nBackup, restore, and sync your OpenClaw configuration across devices directly from openclaw.\n\n## Overview\n\nThis skill helps you:\n- Backup all openclaw data and settings\n- Restore from backups\n- Sync between multiple machines\n- Version control your configuration\n- Automate backup routines\n- Migrate to new devices\n\n## openclaw Directory Structure\n\n### Key Locations\n\n```\n~\u002F.claude\u002F                    # Main openclaw directory\n├── settings.json             # Global settings\n├── settings.local.json       # Local overrides (machine-specific)\n├── projects.json             # Project configurations\n├── skills\u002F                   # Your custom skills\n│   ├── skill-name\u002F\n│   │   ├── SKILL.md\n│   │   └── supporting-files\u002F\n│   └── another-skill\u002F\n├── commands\u002F                 # Custom slash commands (legacy)\n│   └── command-name.md\n├── contexts\u002F                 # Saved contexts\n├── templates\u002F                # Response templates\n└── mcp\u002F                      # MCP server configurations\n    └── servers.json\n\n~\u002Fprojects\u002F                   # Your projects (optional backup)\n├── project-1\u002F\n│   └── .claude\u002F              # Project-specific config\n│       ├── settings.json\n│       └── skills\u002F\n└── project-2\u002F\n```\n\n### What to Backup\n\n```\nESSENTIAL (Always backup):\n✓ ~\u002F.claude\u002Fskills\u002F           # Custom skills\n✓ ~\u002F.claude\u002Fcommands\u002F         # Custom commands\n✓ ~\u002F.claude\u002Fsettings.json     # Global settings\n✓ ~\u002F.claude\u002Fmcp\u002F              # MCP configurations\n\nRECOMMENDED (Usually backup):\n✓ ~\u002F.claude\u002Fcontexts\u002F         # Saved contexts\n✓ ~\u002F.claude\u002Ftemplates\u002F        # Templates\n✓ Project .claude\u002F folders    # Project configs\n\nOPTIONAL (Case by case):\n○ ~\u002F.claude\u002Fsettings.local.json  # Machine-specific\n○ Cache directories              # Can be rebuilt\n○ Log files                      # Usually not needed\n```\n\n## Quick Backup Commands\n\n### Full Backup\n\n```bash\n# Create timestamped backup\nBACKUP_DIR=\"$HOME\u002Fopenclaw-backups\"\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nBACKUP_NAME=\"openclaw_backup_$TIMESTAMP\"\n\nmkdir -p \"$BACKUP_DIR\"\n\ntar -czvf \"$BACKUP_DIR\u002F$BACKUP_NAME.tar.gz\" \\\n  -C \"$HOME\" \\\n  .claude\u002Fskills \\\n  .claude\u002Fcommands \\\n  .claude\u002Fsettings.json \\\n  .claude\u002Fmcp \\\n  .claude\u002Fcontexts \\\n  .claude\u002Ftemplates \\\n  2>\u002Fdev\u002Fnull\n\necho \"Backup created: $BACKUP_DIR\u002F$BACKUP_NAME.tar.gz\"\n```\n\n### Quick Skills-Only Backup\n\n```bash\n# Backup just skills\ntar -czvf ~\u002Fopenclaw_skills_$(date +%Y%m%d).tar.gz \\\n  -C \"$HOME\" .claude\u002Fskills .claude\u002Fcommands\n```\n\n### Restore from Backup\n\n```bash\n# Restore full backup\nBACKUP_FILE=\"$HOME\u002Fopenclaw-backups\u002Fopenclaw_backup_20260129.tar.gz\"\n\n# Preview contents first\ntar -tzvf \"$BACKUP_FILE\"\n\n# Restore (will overwrite existing)\ntar -xzvf \"$BACKUP_FILE\" -C \"$HOME\"\n\necho \"Restore complete!\"\n```\n\n## Backup Script\n\n### Full-Featured Backup Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# openclaw-backup.sh - Comprehensive openclaw backup tool\n\nset -e\n\n# Configuration\nBACKUP_ROOT=\"${openclaw_BACKUP_DIR:-$HOME\u002Fopenclaw-backups}\"\nCLAUDE_DIR=\"$HOME\u002F.claude\"\nMAX_BACKUPS=10  # Keep last N backups\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\n\n# Colors\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nNC='\\033[0m'\n\nlog_info() { echo -e \"${GREEN}[INFO]${NC} $1\"; }\nlog_warn() { echo -e \"${YELLOW}[WARN]${NC} $1\"; }\nlog_error() { echo -e \"${RED}[ERROR]${NC} $1\"; }\n\n# Check if openclaw directory exists\ncheck_claude_dir() {\n    if [ ! -d \"$CLAUDE_DIR\" ]; then\n        log_error \"openclaw directory not found: $CLAUDE_DIR\"\n        exit 1\n    fi\n}\n\n# Create backup\ncreate_backup() {\n    local backup_type=\"${1:-full}\"\n    local backup_name=\"openclaw_${backup_type}_${TIMESTAMP}\"\n    local backup_path=\"$BACKUP_ROOT\u002F$backup_name.tar.gz\"\n    \n    mkdir -p \"$BACKUP_ROOT\"\n    \n    log_info \"Creating $backup_type backup...\"\n    \n    case $backup_type in\n        full)\n            tar -czvf \"$backup_path\" \\\n                -C \"$HOME\" \\\n                .claude\u002Fskills \\\n                .claude\u002Fcommands \\\n                .claude\u002Fsettings.json \\\n                .claude\u002Fsettings.local.json \\\n                .claude\u002Fprojects.json \\\n                .claude\u002Fmcp \\\n                .claude\u002Fcontexts \\\n                .claude\u002Ftemplates \\\n                2>\u002Fdev\u002Fnull || true\n            ;;\n        skills)\n            tar -czvf \"$backup_path\" \\\n                -C \"$HOME\" \\\n                .claude\u002Fskills \\\n                .claude\u002Fcommands \\\n                2>\u002Fdev\u002Fnull || true\n            ;;\n        settings)\n            tar -czvf \"$backup_path\" \\\n                -C \"$HOME\" \\\n                .claude\u002Fsettings.json \\\n                .claude\u002Fsettings.local.json \\\n                .claude\u002Fmcp \\\n                2>\u002Fdev\u002Fnull || true\n            ;;\n        *)\n            log_error \"Unknown backup type: $backup_type\"\n            exit 1\n            ;;\n    esac\n    \n    if [ -f \"$backup_path\" ]; then\n        local size=$(du -h \"$backup_path\" | cut -f1)\n        log_info \"Backup created: $backup_path ($size)\"\n    else\n        log_error \"Backup failed!\"\n        exit 1\n    fi\n}\n\n# List backups\nlist_backups() {\n    log_info \"Available backups in $BACKUP_ROOT:\"\n    echo \"\"\n    \n    if [ -d \"$BACKUP_ROOT\" ]; then\n        ls -lh \"$BACKUP_ROOT\"\u002F*.tar.gz 2>\u002Fdev\u002Fnull | \\\n            awk '{print $9, $5, $6, $7, $8}' || \\\n            echo \"No backups found.\"\n    else\n        echo \"Backup directory doesn't exist.\"\n    fi\n}\n\n# Restore backup\nrestore_backup() {\n    local backup_file=\"$1\"\n    \n    if [ -z \"$backup_file\" ]; then\n        log_error \"Please specify backup file\"\n        list_backups\n        exit 1\n    fi\n    \n    if [ ! -f \"$backup_file\" ]; then\n        # Try relative path in backup dir\n        backup_file=\"$BACKUP_ROOT\u002F$backup_file\"\n    fi\n    \n    if [ ! -f \"$backup_file\" ]; then\n        log_error \"Backup file not found: $backup_file\"\n        exit 1\n    fi\n    \n    log_warn \"This will overwrite existing configuration!\"\n    read -p \"Continue? (y\u002FN) \" confirm\n    \n    if [ \"$confirm\" != \"y\" ] && [ \"$confirm\" != \"Y\" ]; then\n        log_info \"Restore cancelled.\"\n        exit 0\n    fi\n    \n    log_info \"Restoring from: $backup_file\"\n    tar -xzvf \"$backup_file\" -C \"$HOME\"\n    log_info \"Restore complete!\"\n}\n\n# Clean old backups\ncleanup_backups() {\n    log_info \"Cleaning old backups (keeping last $MAX_BACKUPS)...\"\n    \n    cd \"$BACKUP_ROOT\" 2>\u002Fdev\u002Fnull || return\n    \n    local count=$(ls -1 *.tar.gz 2>\u002Fdev\u002Fnull | wc -l)\n    \n    if [ \"$count\" -gt \"$MAX_BACKUPS\" ]; then\n        local to_delete=$((count - MAX_BACKUPS))\n        ls -1t *.tar.gz | tail -n \"$to_delete\" | xargs rm -v\n        log_info \"Removed $to_delete old backup(s)\"\n    else\n        log_info \"No cleanup needed ($count backups)\"\n    fi\n}\n\n# Show backup stats\nshow_stats() {\n    log_info \"openclaw Backup Statistics\"\n    echo \"\"\n    \n    echo \"=== Directory Sizes ===\"\n    du -sh \"$CLAUDE_DIR\"\u002Fskills 2>\u002Fdev\u002Fnull || echo \"Skills: N\u002FA\"\n    du -sh \"$CLAUDE_DIR\"\u002Fcommands 2>\u002Fdev\u002Fnull || echo \"Commands: N\u002FA\"\n    du -sh \"$CLAUDE_DIR\"\u002Fmcp 2>\u002Fdev\u002Fnull || echo \"MCP: N\u002FA\"\n    du -sh \"$CLAUDE_DIR\" 2>\u002Fdev\u002Fnull || echo \"Total: N\u002FA\"\n    \n    echo \"\"\n    echo \"=== Skills Count ===\"\n    find \"$CLAUDE_DIR\u002Fskills\" -name \"SKILL.md\" 2>\u002Fdev\u002Fnull | wc -l | xargs echo \"Skills:\"\n    find \"$CLAUDE_DIR\u002Fcommands\" -name \"*.md\" 2>\u002Fdev\u002Fnull | wc -l | xargs echo \"Commands:\"\n    \n    echo \"\"\n    echo \"=== Backup Directory ===\"\n    if [ -d \"$BACKUP_ROOT\" ]; then\n        du -sh \"$BACKUP_ROOT\"\n        ls -1 \"$BACKUP_ROOT\"\u002F*.tar.gz 2>\u002Fdev\u002Fnull | wc -l | xargs echo \"Backup files:\"\n    else\n        echo \"No backups yet\"\n    fi\n}\n\n# Usage\nusage() {\n    cat \u003C\u003C EOF\nopenclaw Backup Tool\n\nUsage: $(basename $0) \u003Ccommand> [options]\n\nCommands:\n    backup [type]   Create backup (types: full, skills, settings)\n    restore \u003Cfile>  Restore from backup file\n    list            List available backups\n    cleanup         Remove old backups (keep last $MAX_BACKUPS)\n    stats           Show backup statistics\n    help            Show this help\n\nExamples:\n    $(basename $0) backup              # Full backup\n    $(basename $0) backup skills       # Skills only\n    $(basename $0) restore latest.tar.gz\n    $(basename $0) list\n    $(basename $0) cleanup\n\nEnvironment:\n    openclaw_BACKUP_DIR    Backup directory (default: ~\u002Fopenclaw-backups)\n\nEOF\n}\n\n# Main\nmain() {\n    check_claude_dir\n    \n    case \"${1:-help}\" in\n        backup)\n            create_backup \"${2:-full}\"\n            ;;\n        restore)\n            restore_backup \"$2\"\n            ;;\n        list)\n            list_backups\n            ;;\n        cleanup)\n            cleanup_backups\n            ;;\n        stats)\n            show_stats\n            ;;\n        help|--help|-h)\n            usage\n            ;;\n        *)\n            log_error \"Unknown command: $1\"\n            usage\n            exit 1\n            ;;\n    esac\n}\n\nmain \"$@\"\n```\n\n### Save and Use\n\n```bash\n# Save script\ncat > ~\u002F.local\u002Fbin\u002Fopenclaw-backup \u003C\u003C 'SCRIPT'\n# Paste script content here\nSCRIPT\n\nchmod +x ~\u002F.local\u002Fbin\u002Fopenclaw-backup\n\n# Usage\nopenclaw-backup backup          # Full backup\nopenclaw-backup backup skills   # Skills only\nopenclaw-backup list            # List backups\nopenclaw-backup restore \u003Cfile>  # Restore\n```\n\n## Git Version Control\n\n### Initialize Git Repo\n\n```bash\ncd ~\u002F.claude\n\n# Initialize git\ngit init\n\n# Create .gitignore\ncat > .gitignore \u003C\u003C 'EOF'\n# Machine-specific settings\nsettings.local.json\n\n# Cache and temp files\ncache\u002F\n*.tmp\n*.log\n\n# Large files\n*.tar.gz\n*.zip\n\n# Sensitive data (if any)\n*.pem\n*.key\ncredentials\u002F\nEOF\n\n# Initial commit\ngit add .\ngit commit -m \"Initial openclaw configuration backup\"\n```\n\n### Push to Remote\n\n```bash\n# Add remote (GitHub, GitLab, etc)\ngit remote add origin git@github.com:username\u002Fopenclaw-config.git\n\n# Push\ngit push -u origin main\n```\n\n### Daily Workflow\n\n```bash\n# After making changes to skills\u002Fsettings\ncd ~\u002F.claude\ngit add .\ngit commit -m \"Updated skill: trading-bot\"\ngit push\n```\n\n### Auto-Commit Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# auto-commit-claude.sh - Auto commit changes\n\ncd ~\u002F.claude || exit 1\n\n# Check for changes\nif git diff --quiet && git diff --staged --quiet; then\n    echo \"No changes to commit\"\n    exit 0\nfi\n\n# Get changed files for commit message\nCHANGED=$(git status --short | head -5 | awk '{print $2}' | tr '\\n' ', ')\n\ngit add .\ngit commit -m \"Auto-backup: $CHANGED ($(date +%Y-%m-%d))\"\ngit push 2>\u002Fdev\u002Fnull || echo \"Push failed (offline?)\"\n```\n\n## Sync Between Devices\n\n### Method 1: Git Sync\n\n```bash\n# On new device\ngit clone git@github.com:username\u002Fopenclaw-config.git ~\u002F.claude\n\n# Pull latest changes\ncd ~\u002F.claude && git pull\n\n# Push local changes\ncd ~\u002F.claude && git add . && git commit -m \"Update\" && git push\n```\n\n### Method 2: Rsync\n\n```bash\n# Sync to remote server\nrsync -avz --delete \\\n    ~\u002F.claude\u002F \\\n    user@server:~\u002Fopenclaw-backup\u002F\n\n# Sync from remote server\nrsync -avz --delete \\\n    user@server:~\u002Fopenclaw-backup\u002F \\\n    ~\u002F.claude\u002F\n```\n\n### Method 3: Cloud Storage\n\n```bash\n# Backup to cloud folder (Dropbox, Google Drive, etc)\nCLOUD_DIR=\"$HOME\u002FDropbox\u002Fopenclaw\"\n\n# Sync skills\nrsync -avz ~\u002F.claude\u002Fskills\u002F \"$CLOUD_DIR\u002Fskills\u002F\"\nrsync -avz ~\u002F.claude\u002Fcommands\u002F \"$CLOUD_DIR\u002Fcommands\u002F\"\n\n# Copy settings\ncp ~\u002F.claude\u002Fsettings.json \"$CLOUD_DIR\u002F\"\n```\n\n### Sync Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# sync-openclaw.sh - Sync openclaw config between devices\n\nSYNC_DIR=\"${openclaw_SYNC_DIR:-$HOME\u002FDropbox\u002Fopenclaw}\"\nCLAUDE_DIR=\"$HOME\u002F.claude\"\n\nsync_to_cloud() {\n    echo \"Syncing to cloud...\"\n    mkdir -p \"$SYNC_DIR\"\n    \n    rsync -avz --delete \"$CLAUDE_DIR\u002Fskills\u002F\" \"$SYNC_DIR\u002Fskills\u002F\"\n    rsync -avz --delete \"$CLAUDE_DIR\u002Fcommands\u002F\" \"$SYNC_DIR\u002Fcommands\u002F\"\n    rsync -avz \"$CLAUDE_DIR\u002Fmcp\u002F\" \"$SYNC_DIR\u002Fmcp\u002F\" 2>\u002Fdev\u002Fnull\n    cp \"$CLAUDE_DIR\u002Fsettings.json\" \"$SYNC_DIR\u002F\" 2>\u002Fdev\u002Fnull\n    \n    echo \"Sync complete!\"\n}\n\nsync_from_cloud() {\n    echo \"Syncing from cloud...\"\n    \n    rsync -avz \"$SYNC_DIR\u002Fskills\u002F\" \"$CLAUDE_DIR\u002Fskills\u002F\"\n    rsync -avz \"$SYNC_DIR\u002Fcommands\u002F\" \"$CLAUDE_DIR\u002Fcommands\u002F\"\n    rsync -avz \"$SYNC_DIR\u002Fmcp\u002F\" \"$CLAUDE_DIR\u002Fmcp\u002F\" 2>\u002Fdev\u002Fnull\n    \n    # Don't overwrite local settings by default\n    if [ ! -f \"$CLAUDE_DIR\u002Fsettings.json\" ]; then\n        cp \"$SYNC_DIR\u002Fsettings.json\" \"$CLAUDE_DIR\u002F\" 2>\u002Fdev\u002Fnull\n    fi\n    \n    echo \"Sync complete!\"\n}\n\ncase \"$1\" in\n    push) sync_to_cloud ;;\n    pull) sync_from_cloud ;;\n    *)\n        echo \"Usage: $0 {push|pull}\"\n        echo \"  push - Upload local config to cloud\"\n        echo \"  pull - Download cloud config to local\"\n        ;;\nesac\n```\n\n## Automated Backups\n\n### Cron Job (Linux\u002FMac)\n\n```bash\n# Edit crontab\ncrontab -e\n\n# Add daily backup at 2 AM\n0 2 * * * \u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fopenclaw-backup backup full\n\n# Add weekly cleanup on Sundays\n0 3 * * 0 \u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fopenclaw-backup cleanup\n\n# Add git auto-commit every 6 hours\n0 *\u002F6 * * * cd ~\u002F.claude && git add . && git commit -m \"Auto-backup $(date +\\%Y-\\%m-\\%d)\" && git push 2>\u002Fdev\u002Fnull\n```\n\n### Systemd Timer (Linux)\n\n```bash\n# Create service: ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.service\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.service \u003C\u003C 'EOF'\n[Unit]\nDescription=openclaw Backup\n\n[Service]\nType=oneshot\nExecStart=\u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fopenclaw-backup backup full\nEOF\n\n# Create timer: ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.timer\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fopenclaw-backup.timer \u003C\u003C 'EOF'\n[Unit]\nDescription=Daily openclaw Backup\n\n[Timer]\nOnCalendar=daily\nPersistent=true\n\n[Install]\nWantedBy=timers.target\nEOF\n\n# Enable\nsystemctl --user enable openclaw-backup.timer\nsystemctl --user start openclaw-backup.timer\n```\n\n### Launchd (macOS)\n\n```bash\n# Create plist: ~\u002FLibrary\u002FLaunchAgents\u002Fcom.openclaw.backup.plist\ncat > ~\u002FLibrary\u002FLaunchAgents\u002Fcom.openclaw.backup.plist \u003C\u003C 'EOF'\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n    \u003Ckey>Label\u003C\u002Fkey>\n    \u003Cstring>com.openclaw.backup\u003C\u002Fstring>\n    \u003Ckey>ProgramArguments\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cstring>\u002FUsers\u002Fusername\u002F.local\u002Fbin\u002Fopenclaw-backup\u003C\u002Fstring>\n        \u003Cstring>backup\u003C\u002Fstring>\n        \u003Cstring>full\u003C\u002Fstring>\n    \u003C\u002Farray>\n    \u003Ckey>StartCalendarInterval\u003C\u002Fkey>\n    \u003Cdict>\n        \u003Ckey>Hour\u003C\u002Fkey>\n        \u003Cinteger>2\u003C\u002Finteger>\n        \u003Ckey>Minute\u003C\u002Fkey>\n        \u003Cinteger>0\u003C\u002Finteger>\n    \u003C\u002Fdict>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\nEOF\n\n# Load\nlaunchctl load ~\u002FLibrary\u002FLaunchAgents\u002Fcom.openclaw.backup.plist\n```\n\n## Migration Guide\n\n### Migrate to New Machine\n\n```bash\n# === On OLD machine ===\n\n# 1. Create full backup\nopenclaw-backup backup full\n\n# 2. Copy backup file to new machine\nscp ~\u002Fopenclaw-backups\u002Fopenclaw_full_*.tar.gz newmachine:~\u002F\n\n# Or use git\ncd ~\u002F.claude\ngit add . && git commit -m \"Pre-migration backup\"\ngit push\n\n\n# === On NEW machine ===\n\n# Method A: From backup file\ntar -xzvf ~\u002Fopenclaw_full_*.tar.gz -C ~\n\n# Method B: From git\ngit clone git@github.com:username\u002Fopenclaw-config.git ~\u002F.claude\n\n# 3. Verify\nls -la ~\u002F.claude\u002Fskills\u002F\n```\n\n### Export Single Skill\n\n```bash\n# Export one skill for sharing\nSKILL_NAME=\"my-awesome-skill\"\ntar -czvf \"${SKILL_NAME}.tar.gz\" -C ~\u002F.claude\u002Fskills \"$SKILL_NAME\"\n\n# Import skill\ntar -xzvf \"${SKILL_NAME}.tar.gz\" -C ~\u002F.claude\u002Fskills\u002F\n```\n\n### Export All Skills for Sharing\n\n```bash\n# Create shareable skills bundle (no personal settings)\ntar -czvf openclaw-skills-share.tar.gz \\\n    -C ~\u002F.claude \\\n    skills \\\n    --exclude='*.local*' \\\n    --exclude='*personal*'\n```\n\n## Backup Verification\n\n### Verify Backup Integrity\n\n```bash\n# Test backup without extracting\ntar -tzvf backup.tar.gz > \u002Fdev\u002Fnull && echo \"Backup OK\" || echo \"Backup CORRUPT\"\n\n# List contents\ntar -tzvf backup.tar.gz\n\n# Verify specific file exists\ntar -tzvf backup.tar.gz | grep \"skills\u002Fmy-skill\u002FSKILL.md\"\n```\n\n### Compare Backup to Current\n\n```bash\n# Extract to temp dir\nTEMP_DIR=$(mktemp -d)\ntar -xzf backup.tar.gz -C \"$TEMP_DIR\"\n\n# Compare\ndiff -rq ~\u002F.claude\u002Fskills \"$TEMP_DIR\u002F.claude\u002Fskills\"\n\n# Cleanup\nrm -rf \"$TEMP_DIR\"\n```\n\n## Troubleshooting\n\n### Common Issues\n\n```bash\n# Issue: Permission denied\nchmod -R u+rw ~\u002F.claude\n\n# Issue: Backup too large\n# Exclude cache and logs\ntar --exclude='cache' --exclude='*.log' -czvf backup.tar.gz ~\u002F.claude\n\n# Issue: Restore overwrote settings\n# Keep settings.local.json for machine-specific config\n# It won't be overwritten if using proper backup\n\n# Issue: Git conflicts after sync\ncd ~\u002F.claude\ngit stash\ngit pull\ngit stash pop\n# Resolve conflicts manually if needed\n```\n\n### Recovery from Corruption\n\n```bash\n# If ~\u002F.claude is corrupted\n\n# 1. Move corrupted dir\nmv ~\u002F.claude ~\u002F.claude.corrupted\n\n# 2. Restore from backup\nopenclaw-backup restore latest.tar.gz\n\n# 3. Or restore from git\ngit clone git@github.com:username\u002Fopenclaw-config.git ~\u002F.claude\n\n# 4. Compare and recover anything missing\ndiff -rq ~\u002F.claude ~\u002F.claude.corrupted\u002F\n```\n\n## Quick Reference\n\n### Essential Commands\n\n```bash\n# Backup\ntar -czvf ~\u002Fopenclaw-backup.tar.gz -C ~ .claude\u002Fskills .claude\u002Fcommands .claude\u002Fsettings.json\n\n# Restore\ntar -xzvf ~\u002Fopenclaw-backup.tar.gz -C ~\n\n# List backup contents\ntar -tzvf ~\u002Fopenclaw-backup.tar.gz\n\n# Git backup\ncd ~\u002F.claude && git add . && git commit -m \"Backup\" && git push\n\n# Git restore\ncd ~\u002F.claude && git pull\n```\n\n### Backup Checklist\n\n```\nBefore major changes:\n□ Create backup\n□ Verify backup integrity\n□ Note what you're changing\n\nRegular maintenance:\n□ Weekly full backup\n□ Daily git commits (if using)\n□ Monthly cleanup of old backups\n□ Test restore procedure quarterly\n```\n\n## Resources\n\n### Related Skills\n```\n- skill-creator - Create new skills\n- mcp-builder - Configure MCP servers\n- dotfiles - General dotfile management\n```\n\n### Documentation\n```\n- openclaw Docs: docs.openclaw.com\n- Skills Guide: docs.openclaw.com\u002Fskills\n- MCP Setup: docs.openclaw.com\u002Fmcp\n```\n\n---\n\n**Tip:** Always test your backup restoration process before you actually need it. A backup you can't restore is worthless!\n",{"name":5,"metadata":39,"description":7},{"openclaw":40},{"emoji":41,"requires":42},"?",{"env":43,"bins":44},[],[32,19,21],"main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","Git和GitHub\u002Fbackup",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill backup",{"tool":59,"command":60},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill backup",{"tool":62,"command":63},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill backup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002FGit和GitHub\u002Fbackup\u002FSKILL.md",true,[67],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"_meta.json","REFERENCE","参考文档",279,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002FGit和GitHub\u002Fbackup\u002F_meta.json",[74,98,133,144,154,184],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":34},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[76,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],"safe","ethereum","defi","Optimization","user","use","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":116,"publishedAt":34},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[103,108,111],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":109,"categoryName":110,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[117,118,119,120,121,122,123,83,124,87,125,126,127,128,129,24,130,131,132],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","positions","token","prices",{"skillNo":134,"name":135,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":141,"publishedAt":34},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[138,139,140],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":109,"categoryName":110,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},[117,142,143,118,119,120,121,122,123,83,124,87,126,127,128,129,24,130,131,132],"api skill","zerion api skill",{"skillNo":145,"name":146,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":152,"publishedAt":34},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[149,150,151],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":109,"categoryName":110,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},[120,117,153,118,119,121,122,83,124,87,125,126,127,128,129,24,130,131,132],"zerion api mcp",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":163,"publishedAt":34},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[160],{"categoryNo":161,"categoryName":162,"taxonomyType":114,"taxonomyTypeDesc":115},"01JBSEEDCAT000000000000040","财务",[164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data","for",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":191,"publishedAt":34},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[190],{"categoryNo":161,"categoryName":162,"taxonomyType":114,"taxonomyTypeDesc":115},[164,165,167,192,193,194,195,196,197,175,198,199,200,201,202,203,204,205,132,182],"cli","homebrew","find","check","brew","up","local","get","stock","link","trending","sf","quotes","ln"]