[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G2WF9XM9BBHYFF2VBDS52M":3,"skill-same:01M6G2WF9XM9BBHYFF2VBDS52M":82},{"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":22,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":61,"install":62,"resources":75},"01M6G2WF9XM9BBHYFF2VBDS52M","clawdbot-backup",null,"Backup and restore ClawdBot configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsebastian-buitrag0\u002Fclawdbot-backup\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"backup","clawdbot","clawdbot backup","version","with","rsync","control","commands","across","configuration","restore","github","settings","automate","migrate","devices","https","git","sync","2026-11-10 10:12:30",false,"---\nname: clawdbot-backup\ndescription: Backup and restore ClawdBot configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.\nhomepage: https:\u002F\u002Fgithub.com\u002Fclawdbot\u002Fbackup-skill\nmetadata: {\"clawdbot\":{\"emoji\":\"?\",\"requires\":{\"bins\":[\"git\",\"tar\",\"rsync\"],\"env\":[]}}}\n---\n\n# ClawdBot Backup Skill\n\nBackup, restore, and sync your ClawdBot configuration across devices directly from Clawdbot.\n\n## Overview\n\nThis skill helps you:\n- Backup all ClawdBot 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## ClawdBot Directory Structure\n\n### Key Locations\n\n```\n~\u002F.claude\u002F                    # Main ClawdBot 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\u002Fclawdbot-backups\"\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nBACKUP_NAME=\"clawdbot_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 ~\u002Fclawdbot_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\u002Fclawdbot-backups\u002Fclawdbot_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# clawdbot-backup.sh - Comprehensive ClawdBot backup tool\n\nset -e\n\n# Configuration\nBACKUP_ROOT=\"${CLAWDBOT_BACKUP_DIR:-$HOME\u002Fclawdbot-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 ClawdBot directory exists\ncheck_claude_dir() {\n    if [ ! -d \"$CLAUDE_DIR\" ]; then\n        log_error \"ClawdBot 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=\"clawdbot_${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 \"ClawdBot 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\nClawdBot 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    CLAWDBOT_BACKUP_DIR    Backup directory (default: ~\u002Fclawdbot-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\u002Fclawdbot-backup \u003C\u003C 'SCRIPT'\n# Paste script content here\nSCRIPT\n\nchmod +x ~\u002F.local\u002Fbin\u002Fclawdbot-backup\n\n# Usage\nclawdbot-backup backup          # Full backup\nclawdbot-backup backup skills   # Skills only\nclawdbot-backup list            # List backups\nclawdbot-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 ClawdBot 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\u002Fclawdbot-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\u002Fclawdbot-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:~\u002Fclawdbot-backup\u002F\n\n# Sync from remote server\nrsync -avz --delete \\\n    user@server:~\u002Fclawdbot-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\u002FClawdBot\"\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-clawdbot.sh - Sync ClawdBot config between devices\n\nSYNC_DIR=\"${CLAWDBOT_SYNC_DIR:-$HOME\u002FDropbox\u002FClawdBot}\"\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\u002Fclawdbot-backup backup full\n\n# Add weekly cleanup on Sundays\n0 3 * * 0 \u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fclawdbot-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\u002Fclawdbot-backup.service\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fclawdbot-backup.service \u003C\u003C 'EOF'\n[Unit]\nDescription=ClawdBot Backup\n\n[Service]\nType=oneshot\nExecStart=\u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fclawdbot-backup backup full\nEOF\n\n# Create timer: ~\u002F.config\u002Fsystemd\u002Fuser\u002Fclawdbot-backup.timer\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fclawdbot-backup.timer \u003C\u003C 'EOF'\n[Unit]\nDescription=Daily ClawdBot Backup\n\n[Timer]\nOnCalendar=daily\nPersistent=true\n\n[Install]\nWantedBy=timers.target\nEOF\n\n# Enable\nsystemctl --user enable clawdbot-backup.timer\nsystemctl --user start clawdbot-backup.timer\n```\n\n### Launchd (macOS)\n\n```bash\n# Create plist: ~\u002FLibrary\u002FLaunchAgents\u002Fcom.clawdbot.backup.plist\ncat > ~\u002FLibrary\u002FLaunchAgents\u002Fcom.clawdbot.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.clawdbot.backup\u003C\u002Fstring>\n    \u003Ckey>ProgramArguments\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cstring>\u002FUsers\u002Fusername\u002F.local\u002Fbin\u002Fclawdbot-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.clawdbot.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\nclawdbot-backup backup full\n\n# 2. Copy backup file to new machine\nscp ~\u002Fclawdbot-backups\u002Fclawdbot_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 ~\u002Fclawdbot_full_*.tar.gz -C ~\n\n# Method B: From git\ngit clone git@github.com:username\u002Fclawdbot-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 clawdbot-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\nclawdbot-backup restore latest.tar.gz\n\n# 3. Or restore from git\ngit clone git@github.com:username\u002Fclawdbot-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 ~\u002Fclawdbot-backup.tar.gz -C ~ .claude\u002Fskills .claude\u002Fcommands .claude\u002Fsettings.json\n\n# Restore\ntar -xzvf ~\u002Fclawdbot-backup.tar.gz -C ~\n\n# List backup contents\ntar -tzvf ~\u002Fclawdbot-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- ClawdBot Docs: docs.clawdbot.com\n- Skills Guide: docs.clawdbot.com\u002Fskills\n- MCP Setup: docs.clawdbot.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","# ClawdBot Backup Skill\n\nBackup, restore, and sync your ClawdBot configuration across devices directly from Clawdbot.\n\n## Overview\n\nThis skill helps you:\n- Backup all ClawdBot 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## ClawdBot Directory Structure\n\n### Key Locations\n\n```\n~\u002F.claude\u002F                    # Main ClawdBot 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\u002Fclawdbot-backups\"\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nBACKUP_NAME=\"clawdbot_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 ~\u002Fclawdbot_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\u002Fclawdbot-backups\u002Fclawdbot_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# clawdbot-backup.sh - Comprehensive ClawdBot backup tool\n\nset -e\n\n# Configuration\nBACKUP_ROOT=\"${CLAWDBOT_BACKUP_DIR:-$HOME\u002Fclawdbot-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 ClawdBot directory exists\ncheck_claude_dir() {\n    if [ ! -d \"$CLAUDE_DIR\" ]; then\n        log_error \"ClawdBot 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=\"clawdbot_${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 \"ClawdBot 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\nClawdBot 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    CLAWDBOT_BACKUP_DIR    Backup directory (default: ~\u002Fclawdbot-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\u002Fclawdbot-backup \u003C\u003C 'SCRIPT'\n# Paste script content here\nSCRIPT\n\nchmod +x ~\u002F.local\u002Fbin\u002Fclawdbot-backup\n\n# Usage\nclawdbot-backup backup          # Full backup\nclawdbot-backup backup skills   # Skills only\nclawdbot-backup list            # List backups\nclawdbot-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 ClawdBot 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\u002Fclawdbot-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\u002Fclawdbot-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:~\u002Fclawdbot-backup\u002F\n\n# Sync from remote server\nrsync -avz --delete \\\n    user@server:~\u002Fclawdbot-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\u002FClawdBot\"\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-clawdbot.sh - Sync ClawdBot config between devices\n\nSYNC_DIR=\"${CLAWDBOT_SYNC_DIR:-$HOME\u002FDropbox\u002FClawdBot}\"\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\u002Fclawdbot-backup backup full\n\n# Add weekly cleanup on Sundays\n0 3 * * 0 \u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fclawdbot-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\u002Fclawdbot-backup.service\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fclawdbot-backup.service \u003C\u003C 'EOF'\n[Unit]\nDescription=ClawdBot Backup\n\n[Service]\nType=oneshot\nExecStart=\u002Fhome\u002Fuser\u002F.local\u002Fbin\u002Fclawdbot-backup backup full\nEOF\n\n# Create timer: ~\u002F.config\u002Fsystemd\u002Fuser\u002Fclawdbot-backup.timer\ncat > ~\u002F.config\u002Fsystemd\u002Fuser\u002Fclawdbot-backup.timer \u003C\u003C 'EOF'\n[Unit]\nDescription=Daily ClawdBot Backup\n\n[Timer]\nOnCalendar=daily\nPersistent=true\n\n[Install]\nWantedBy=timers.target\nEOF\n\n# Enable\nsystemctl --user enable clawdbot-backup.timer\nsystemctl --user start clawdbot-backup.timer\n```\n\n### Launchd (macOS)\n\n```bash\n# Create plist: ~\u002FLibrary\u002FLaunchAgents\u002Fcom.clawdbot.backup.plist\ncat > ~\u002FLibrary\u002FLaunchAgents\u002Fcom.clawdbot.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.clawdbot.backup\u003C\u002Fstring>\n    \u003Ckey>ProgramArguments\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cstring>\u002FUsers\u002Fusername\u002F.local\u002Fbin\u002Fclawdbot-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.clawdbot.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\nclawdbot-backup backup full\n\n# 2. Copy backup file to new machine\nscp ~\u002Fclawdbot-backups\u002Fclawdbot_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 ~\u002Fclawdbot_full_*.tar.gz -C ~\n\n# Method B: From git\ngit clone git@github.com:username\u002Fclawdbot-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 clawdbot-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\nclawdbot-backup restore latest.tar.gz\n\n# 3. Or restore from git\ngit clone git@github.com:username\u002Fclawdbot-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 ~\u002Fclawdbot-backup.tar.gz -C ~ .claude\u002Fskills .claude\u002Fcommands .claude\u002Fsettings.json\n\n# Restore\ntar -xzvf ~\u002Fclawdbot-backup.tar.gz -C ~\n\n# List backup contents\ntar -tzvf ~\u002Fclawdbot-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- ClawdBot Docs: docs.clawdbot.com\n- Skills Guide: docs.clawdbot.com\u002Fskills\n- MCP Setup: docs.clawdbot.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,"homepage":47,"metadata":48,"description":7},"https:\u002F\u002Fgithub.com\u002Fclawdbot\u002Fbackup-skill",{"clawdbot":49},{"emoji":50,"requires":51},"?",{"env":52,"bins":53},[],[40,54,28],"tar","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fsebastian-buitrag0\u002Fclawdbot-backup",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add kbarbel640-del\u002Fskills --skill clawdbot-backup",{"tool":68,"command":69},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill clawdbot-backup",{"tool":71,"command":72},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill clawdbot-backup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsebastian-buitrag0\u002Fclawdbot-backup\u002FSKILL.md",true,[76],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"_meta.json","REFERENCE","参考文档",294,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsebastian-buitrag0\u002Fclawdbot-backup\u002F_meta.json",[83,112,137,158,164,183],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":94,"publishedAt":42},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[89],{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[95,96,97,27,98,99,100,101,102,103,104,105,106,107,108,109,39,110,111],"crowd prompting","prompting","api","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","content","ai agents",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":119,"publishedAt":42},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[118],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[120,97,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,101,136],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":146,"publishedAt":42},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[143],{"categoryNo":144,"categoryName":145,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究",[147,148,149,150,151,152,153,27,154,134,136,155,97,156,157],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":159,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":42},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[162],{"categoryNo":144,"categoryName":145,"taxonomyType":20,"taxonomyTypeDesc":21},[150,149,148,147,157,152,153,27,151,134,136,154,155,97,156],{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":42},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[40,171,172,173,174,175,176,177,178,179,180,181,182],"summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":193,"publishedAt":42},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[189,190],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":191,"categoryName":192,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000037","律师与法务",[194,195,196,197,27,198,199,55,200,155,201,202,203,204,205,39,206,207,34],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance"]