#!/bin/bash # sync-memory.sh - Sync Claude memory files to dlx-claude repository # # This script copies Claude's in-memory project knowledge to the version-controlled # dlx-claude repository for backup and team sharing. # # Usage: # ./scripts/sync-memory.sh # Interactive sync with git commit # ./scripts/sync-memory.sh --auto # Auto-commit with timestamp # ./scripts/sync-memory.sh --dry-run # Preview changes only set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(dirname "$SCRIPT_DIR")" CLAUDE_HOME="$HOME/.claude" # Color output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Parse arguments DRY_RUN=false AUTO_COMMIT=false for arg in "$@"; do case $arg in --dry-run) DRY_RUN=true shift ;; --auto) AUTO_COMMIT=true shift ;; *) echo "Unknown option: $arg" echo "Usage: $0 [--dry-run] [--auto]" exit 1 ;; esac done echo -e "${BLUE}╔════════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Claude Memory Sync to dlx-claude Repository ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════════════╝${NC}" echo # Define sync mappings: source -> destination declare -A SYNC_MAP=( ["$CLAUDE_HOME/projects/-source-dlx-src-dlx-ansible/memory/MEMORY.md"]="$REPO_ROOT/memory/dlx-ansible/MEMORY.md" ["$CLAUDE_HOME/projects/-source-hiveops-src-hiveops-mgmt/memory/MEMORY.md"]="$REPO_ROOT/memory/hiveops-mgmt/MEMORY.md" ["$CLAUDE_HOME/projects/-source-hiveops-src-hiveops-incident/memory/MEMORY.md"]="$REPO_ROOT/memory/hiveops-incident/MEMORY.md" ["$CLAUDE_HOME/projects/-source-hiveops-src-hiveops-browser/memory/MEMORY.md"]="$REPO_ROOT/memory/hiveops-browser/MEMORY.md" ) # Check if running in dry-run mode if [ "$DRY_RUN" = true ]; then echo -e "${YELLOW}[DRY RUN MODE]${NC} No files will be modified." echo fi # Sync files SYNCED_COUNT=0 SKIPPED_COUNT=0 CHANGED_FILES=() for source in "${!SYNC_MAP[@]}"; do dest="${SYNC_MAP[$source]}" if [ ! -f "$source" ]; then echo -e "${YELLOW}⊘${NC} Skipped (source not found): $(basename "$source")" SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) continue fi # Create destination directory if needed dest_dir="$(dirname "$dest")" if [ "$DRY_RUN" = false ]; then mkdir -p "$dest_dir" fi # Check if files differ if [ -f "$dest" ] && cmp -s "$source" "$dest"; then echo -e "${GREEN}✓${NC} No changes: $(basename "$source")" else if [ "$DRY_RUN" = false ]; then cp "$source" "$dest" echo -e "${GREEN}✓${NC} Synced: $(basename "$source")" CHANGED_FILES+=("$dest") else echo -e "${BLUE}~${NC} Would sync: $(basename "$source")" fi SYNCED_COUNT=$((SYNCED_COUNT + 1)) fi done echo echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "Files synced: $SYNCED_COUNT" echo -e "Files skipped: $SKIPPED_COUNT" echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo # Exit if dry-run or no changes if [ "$DRY_RUN" = true ]; then echo -e "${YELLOW}Dry run complete. No files were modified.${NC}" exit 0 fi if [ $SYNCED_COUNT -eq 0 ]; then echo -e "${GREEN}All memory files are up to date. Nothing to commit.${NC}" exit 0 fi # Git operations cd "$REPO_ROOT" # Check if we're in a git repository if [ ! -d ".git" ]; then echo -e "${RED}Error: Not a git repository: $REPO_ROOT${NC}" exit 1 fi # Stage changed files echo -e "${BLUE}Staging changed files...${NC}" for file in "${CHANGED_FILES[@]}"; do git add "$file" echo " + $(git diff --cached --stat "$file" | head -1)" done # Show git status echo echo -e "${BLUE}Git status:${NC}" git status --short # Commit changes if [ "$AUTO_COMMIT" = true ]; then # Auto-commit with timestamp TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') git commit -m "Auto-sync Claude memory files - $TIMESTAMP Updated memory files: $(for file in "${CHANGED_FILES[@]}"; do echo " - $(basename "$file")"; done) Co-Authored-By: Claude Sonnet 4.5 " echo echo -e "${GREEN}✓ Changes committed automatically${NC}" echo echo -e "${YELLOW}Push to remote:${NC}" echo " git push origin main" else # Interactive commit echo echo -e "${YELLOW}Ready to commit changes.${NC}" echo read -p "Commit message (or Enter for default): " COMMIT_MSG if [ -z "$COMMIT_MSG" ]; then COMMIT_MSG="Sync Claude memory files Updated memory files: $(for file in "${CHANGED_FILES[@]}"; do echo " - $(basename "$file")"; done)" fi git commit -m "$COMMIT_MSG Co-Authored-By: Claude Sonnet 4.5 " echo echo -e "${GREEN}✓ Changes committed${NC}" echo echo -e "${YELLOW}Push to remote:${NC}" echo " git push origin main" fi echo echo -e "${GREEN}Memory sync complete!${NC}"