#!/bin/bash # Restore Claude Code configuration from backup # Usage: restore.sh [backup-file] set -euo pipefail CLAUDE_DIR="${HOME}/.claude" BACKUP_DIR="${CLAUDE_DIR}/backups" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' echo "📦 Claude Code Configuration Restore" echo "" # Get backup file BACKUP_FILE="${1:-}" if [[ -z "${BACKUP_FILE}" ]]; then # List available backups echo "Available backups:" echo "" if ls -1t "${BACKUP_DIR}"/*.tar.gz 2>/dev/null | head -10; then echo "" echo "Usage: $0 " echo "Example: $0 ${BACKUP_DIR}/claude-config-20260101_120000.tar.gz" else echo " No backups found in ${BACKUP_DIR}" fi exit 1 fi # Verify backup exists if [[ ! -f "${BACKUP_FILE}" ]]; then echo -e "${RED}Error: Backup file not found: ${BACKUP_FILE}${NC}" exit 1 fi # Confirm restore echo -e "${YELLOW}Warning: This will overwrite existing configuration!${NC}" echo "" echo "Backup: ${BACKUP_FILE}" echo "Target: ${CLAUDE_DIR}" echo "" read -p "Continue? [y/N] " -n 1 -r echo "" if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "Cancelled." exit 0 fi # Create temporary directory TEMP_DIR=$(mktemp -d) echo "" echo "Extracting backup..." tar -xzf "${BACKUP_FILE}" -C "${TEMP_DIR}" # Find the extracted directory EXTRACTED_DIR=$(find "${TEMP_DIR}" -maxdepth 1 -type d -name "claude-config-*" | head -1) if [[ -z "${EXTRACTED_DIR}" ]]; then echo -e "${RED}Error: Invalid backup format${NC}" rm -rf "${TEMP_DIR}" exit 1 fi # Items to restore RESTORE_ITEMS=( "CLAUDE.md" "README.md" "settings.json" ".gitignore" ".claude-plugin" "agents" "commands" "hooks" "skills" "workflows" "state" "automation" ) echo "" echo "Restoring files..." for item in "${RESTORE_ITEMS[@]}"; do if [[ -e "${EXTRACTED_DIR}/${item}" ]]; then # Backup existing before overwrite if [[ -e "${CLAUDE_DIR}/${item}" ]]; then rm -rf "${CLAUDE_DIR}/${item}" fi cp -r "${EXTRACTED_DIR}/${item}" "${CLAUDE_DIR}/" echo -e " ${GREEN}✓${NC} ${item}" fi done # Cleanup rm -rf "${TEMP_DIR}" echo "" echo -e "${GREEN}✓${NC} Restore complete!" echo "" echo "Note: You may need to restart Claude Code for changes to take effect." echo "" # Run validation if [[ -x "${CLAUDE_DIR}/automation/validate-setup.sh" ]]; then echo "Running validation..." echo "" "${CLAUDE_DIR}/automation/validate-setup.sh" || true fi