# Claude Agent Sync Guide Complete guide for syncing Claude Code agents across multiple machines using Gitea. ## 📋 Table of Contents 1. [Overview](#overview) 2. [Initial Setup - Machine WITH Existing Agents](#setup-with-existing-agents) 3. [Initial Setup - Machine WITHOUT Agents](#setup-without-agents) 4. [Daily Sync Workflow](#daily-sync-workflow) 5. [Conflict Resolution](#conflict-resolution) 6. [Troubleshooting](#troubleshooting) 7. [Advanced Operations](#advanced-operations) --- ## Overview **Repository**: https://gitea.pressmess.duckdns.org/admin/claude-agents **What gets synced**: All `.md` files in `~/.claude/agents/` **How it works**: Git-based 2-way sync - all machines push and pull from central Gitea repository **Safety**: Full version history, automatic backups, conflict detection --- ## Setup With Existing Agents Use this if the machine already has agents in `~/.claude/agents/`. ### Step 1: Configure Git (One-Time) ```bash git config --global user.name "admin" git config --global user.email "admin@server-ai.local" git config --global init.defaultBranch main ``` ### Step 2: Backup Existing Agents ```bash # Safety first - create backup cp -r ~/.claude/agents ~/.claude/agents.backup-$(date +%Y%m%d-%H%M%S) # Verify backup ls -la ~/.claude/agents.backup-*/ ``` ### Step 3: Initialize Git and Commit Local Agents ```bash cd ~/.claude/agents # Initialize git git init git checkout -b main # Commit your existing agents git add . git commit -m "Add existing agents from $(hostname) on $(date '+%Y-%m-%d')" ``` ### Step 4: Connect to Gitea and Merge ```bash # Add remote (password is URL-encoded: @ = %40, ! = %21) git remote add origin https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-agents.git # Pull and merge with existing agents git pull origin main --allow-unrelated-histories # If merge succeeds automatically, great! If not, see "Conflict Resolution" section ``` ### Step 5: Push Your Unique Agents ```bash # Push your agents back to the repo git push origin main # Verify sync git status ``` ### Step 6: Verify All Agents Present ```bash # List all agents ls -1 ~/.claude/agents/*.md # Check git log git log --oneline --graph --all ``` **✅ Done!** Your agents are now synced. Proceed to [Daily Sync Workflow](#daily-sync-workflow). --- ## Setup Without Agents Use this if the machine has no agents or you want a fresh start. ### Step 1: Configure Git (One-Time) ```bash git config --global user.name "admin" git config --global user.email "admin@server-ai.local" git config --global init.defaultBranch main ``` ### Step 2: Clone Repository ```bash # Remove directory if it exists (be careful!) # rm -rf ~/.claude/agents # Clone from Gitea (password is URL-encoded) git clone https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-agents.git ~/.claude/agents # Verify cd ~/.claude/agents ls -la git log --oneline ``` **✅ Done!** Proceed to [Daily Sync Workflow](#daily-sync-workflow). --- ## Daily Sync Workflow ### Pull Changes (Get Latest from Other Machines) ```bash cd ~/.claude/agents git pull origin main ``` **When to pull**: - Before starting work - Before creating new agents - At least once per day ### Push Changes (Share Your Updates) ```bash cd ~/.claude/agents # Add any new or modified agents git add . # Commit with descriptive message git commit -m "Add new agent: my-helper-agent" # or git commit -m "Update homelab-optimizer: improve recommendations" # Push to Gitea git push origin main ``` **When to push**: - After creating new agents - After modifying existing agents - Before shutting down the machine ### Quick Sync Script (Recommended) Create `~/sync-agents.sh`: ```bash #!/bin/bash cd ~/.claude/agents echo "📥 Pulling latest agents..." git pull origin main if [[ -n $(git status --porcelain) ]]; then echo "" echo "📝 Local changes detected:" git status --short echo "" read -p "Commit and push changes? (y/N) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then git add . read -p "Commit message: " msg git commit -m "$msg" git push origin main echo "✅ Changes pushed!" fi else echo "✅ Already up to date" fi echo "" echo "📊 Current agents:" ls -1 *.md 2>/dev/null | sed 's/\.md$//' | sed 's/^/ - /' ``` Make it executable: ```bash chmod +x ~/sync-agents.sh ``` Use it: ```bash ~/sync-agents.sh ``` Or add to `.bashrc`: ```bash alias sync-agents='~/sync-agents.sh' ``` --- ## Conflict Resolution ### What is a Conflict? A conflict occurs when: - Same agent file modified on two machines - Both machines push changes - Git can't automatically merge ### Identifying Conflicts After `git pull`, you'll see: ``` Auto-merging homelab-optimizer.md CONFLICT (content): Merge conflict in homelab-optimizer.md Automatic merge failed; fix conflicts and then commit the result. ``` ### Resolving Conflicts #### Method 1: Manual Resolution (Recommended) ```bash # Open the conflicting file nano ~/.claude/agents/homelab-optimizer.md ``` Look for conflict markers: ``` <<<<<<< HEAD Your local version of the agent ======= Remote version from Gitea >>>>>>> origin/main ``` **Choose one**: - Keep local version (delete markers and remote version) - Keep remote version (delete markers and local version) - Combine both (merge manually, delete markers) **Then commit**: ```bash git add homelab-optimizer.md git commit -m "Resolve conflict in homelab-optimizer" git push origin main ``` #### Method 2: Keep Local Version ```bash # Keep your version for specific file git checkout --ours homelab-optimizer.md git add homelab-optimizer.md git commit -m "Keep local version of homelab-optimizer" git push origin main ``` #### Method 3: Keep Remote Version ```bash # Keep remote version for specific file git checkout --theirs homelab-optimizer.md git add homelab-optimizer.md git commit -m "Accept remote version of homelab-optimizer" git push origin main ``` #### Method 4: Abort Merge ```bash # Start over git merge --abort git pull origin main --strategy-option theirs # Always prefer remote ``` ### Preventing Conflicts 1. **Pull before making changes**: `git pull origin main` 2. **Push frequently**: Don't let changes accumulate 3. **Coordinate with team**: Use chat/email when editing same agent 4. **Use branches**: For experimental agents (advanced) --- ## Troubleshooting ### Authentication Failed **Error**: `fatal: Authentication failed` **Solution**: ```bash # Update remote with correct password (URL-encoded) cd ~/.claude/agents git remote set-url origin https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-agents.git ``` ### Diverged Branches **Error**: `Your branch and 'origin/main' have diverged` **Solution**: ```bash # Option 1: Rebase (cleaner history) git pull --rebase origin main # Option 2: Merge (safer) git pull origin main # Then push git push origin main ``` ### Uncommitted Changes Blocking Pull **Error**: `error: Your local changes would be overwritten by merge` **Solution**: ```bash # Option 1: Commit changes first git add . git commit -m "WIP: uncommitted changes" git pull origin main # Option 2: Stash changes temporarily git stash git pull origin main git stash pop ``` ### Accidentally Deleted Agent **Recovery**: ```bash # Find the commit where it existed git log --all --full-history -- deleted-agent.md # Restore from specific commit git checkout -- deleted-agent.md # Or restore from last known good state git checkout HEAD~1 -- deleted-agent.md # Commit restoration git add deleted-agent.md git commit -m "Restore deleted-agent" git push origin main ``` ### Reset to Remote State (Nuclear Option) **Warning**: This discards ALL local changes! ```bash cd ~/.claude/agents # Backup first! cp -r ~/.claude/agents ~/agents-backup-emergency # Hard reset to remote git fetch origin git reset --hard origin/main ``` --- ## Advanced Operations ### View History ```bash # All commits git log # One line per commit git log --oneline # With graph git log --oneline --graph --all # Changes to specific agent git log --follow homelab-optimizer.md # See actual changes git log -p homelab-optimizer.md ``` ### Compare Versions ```bash # See what changed in last commit git show # Compare with remote git diff origin/main # Compare specific file git diff origin/main homelab-optimizer.md # Compare two commits git diff abc123 def456 ``` ### Rollback to Previous Version ```bash # See history git log --oneline # Rollback entire repo to previous commit git reset --hard abc123 git push -f origin main # Force push (use with caution!) # Rollback single file git checkout abc123 -- homelab-optimizer.md git commit -m "Rollback homelab-optimizer to previous version" git push origin main ``` ### Create Branch for Experiments ```bash # Create and switch to new branch git checkout -b experiment/new-agent # Make changes, commit git add new-experimental-agent.md git commit -m "Experiment with new agent" # Push branch to Gitea git push -u origin experiment/new-agent # Switch back to main git checkout main # Merge experiment if successful git merge experiment/new-agent git push origin main # Delete branch git branch -d experiment/new-agent git push origin --delete experiment/new-agent ``` ### Add More Machines Just repeat the setup process on each machine. All machines will sync through Gitea. ### Change Password ```bash # Update remote URL with new password (URL-encoded) cd ~/.claude/agents git remote set-url origin https://admin:NEW_PASSWORD@gitea.pressmess.duckdns.org/admin/claude-agents.git ``` --- ## Quick Reference Card ### Daily Commands | Task | Command | |------|---------| | Get latest | `cd ~/.claude/agents && git pull` | | Push changes | `git add . && git commit -m "msg" && git push` | | Check status | `git status` | | View agents | `ls -1 ~/.claude/agents/*.md` | ### Emergency Commands | Task | Command | |------|---------| | Abort merge | `git merge --abort` | | Discard changes | `git checkout -- filename.md` | | Reset to remote | `git fetch && git reset --hard origin/main` | ### Useful Aliases Add to `~/.bashrc`: ```bash # Quick sync alias sync-agents='cd ~/.claude/agents && git pull && git status' # Quick commit alias commit-agents='cd ~/.claude/agents && git add . && git commit -m' # Push agents alias push-agents='cd ~/.claude/agents && git push' # View agents alias list-agents='ls -1 ~/.claude/agents/*.md | xargs -n1 basename | sed "s/.md$//"' ``` --- ## Support - **Repository**: https://gitea.pressmess.duckdns.org/admin/claude-agents - **Local Docs**: `~/.claude/agents/README.md` - **Server Docs**: `/home/jon/SERVER-DOCUMENTATION.md` - **Changelog**: `/home/jon/CHANGELOG.md` --- **Last Updated**: 2026-01-29 **Version**: 1.0 **Maintained By**: admin