# WSL (Windows Subsystem for Linux) Sync Guide

Complete guide for syncing Claude Code agents and skills using WSL on Windows.

---

## 🎯 Why WSL is Better Than Native Windows

- ✅ **Same commands as Linux** - No path conversions or PowerShell/Batch differences
- ✅ **Native curl/git** - Skillshare installs with one command
- ✅ **Better performance** - Git operations are faster
- ✅ **Consistent with server** - Same environment as server-ai
- ✅ **Easy shell scripts** - Bash scripts work as-is

---

## 📋 Prerequisites

### Install WSL (If Not Already Installed)

```powershell
# In PowerShell as Administrator
wsl --install

# Or install specific distro
wsl --install -d Ubuntu-22.04

# Reboot Windows
```

### Verify WSL Installation

```bash
# Check WSL version (should be WSL 2)
wsl --version

# Enter WSL
wsl

# Check distro
cat /etc/os-release
```

---

## 🔀 Two Setup Strategies

### Strategy 1: Shared (Recommended)
**WSL and Windows Claude Code share the same skills/agents**

**Use when:**
- You use Claude Code in both WSL and Windows
- Want consistency across both environments
- Don't want duplicate files

### Strategy 2: Separate
**WSL has independent skills/agents, syncs separately**

**Use when:**
- Only use Claude Code in WSL *or* Windows, not both
- Need different skills for different environments
- Want complete isolation

---

## 🔗 Strategy 1: Shared Setup (WSL + Windows)

### Step 1: Install in Windows First

Follow the Windows guide to set up agents/skills in Windows:
- Agents: `C:\Users\YourName\.claude\agents`
- Skills: `C:\Users\YourName\.config\skillshare\skills`

### Step 2: Create Symlinks in WSL

```bash
# In WSL - Replace YourName with your Windows username

# Create .claude directory if it doesn't exist
mkdir -p ~/.claude

# Symlink agents (WSL points to Windows)
ln -s /mnt/c/Users/YourName/.claude/agents ~/.claude/agents

# Symlink skills target (for Claude Code in WSL)
ln -s /mnt/c/Users/YourName/.claude/skills ~/.claude/skills

# Symlink Skillshare source directory
mkdir -p ~/.config
ln -s /mnt/c/Users/YourName/.config/skillshare ~/.config/skillshare
```

### Step 3: Verify Symlinks

```bash
# Check symlinks
ls -la ~/.claude/
ls -la ~/.config/

# Should show:
# agents -> /mnt/c/Users/YourName/.claude/agents
# skills -> /mnt/c/Users/YourName/.claude/skills
# skillshare -> /mnt/c/Users/YourName/.config/skillshare
```

### Step 4: Install Skillshare in WSL (Optional)

```bash
# If you want to run skillshare commands from WSL
curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/install.sh | sh

# Test
skillshare status
```

### Step 5: Daily Sync (From WSL)

```bash
# Pull agents (from WSL)
cd ~/.claude/agents  # Actually points to Windows directory
git pull origin main

# Pull skills (from WSL)
skillshare pull --remote  # Updates Windows skillshare directory
```

**How it works:**
- Both WSL and Windows Claude Code read from same directories
- Changes in WSL appear instantly in Windows (and vice versa)
- Git sync updates both environments automatically

---

## 🔧 Strategy 2: Separate Setup (WSL Only)

### Step 1: Install Git in WSL

```bash
# Update packages
sudo apt update

# Install git
sudo apt install git -y

# Configure git
git config --global user.name "admin"
git config --global user.email "admin@server-ai.local"
git config --global init.defaultBranch main
```

### Step 2: Clone Agents

```bash
# Clone agents to WSL
git clone https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-agents.git ~/.claude/agents

# Verify
ls ~/.claude/agents/
```

### Step 3: Install Skillshare

```bash
# Install Skillshare
curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/install.sh | sh

# Verify
skillshare version
```

### Step 4: Setup Skills

```bash
# Initialize Skillshare
skillshare init --no-copy --all-targets --git

# Add remote
cd ~/.config/skillshare/skills
git remote add origin https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-skills.git

# Pull skills
skillshare pull --remote

# Verify
skillshare status
```

### Step 5: Daily Sync

```bash
# Same as Linux commands - pull agents
cd ~/.claude/agents && git pull

# Pull skills
skillshare pull --remote
```

---

## 🗂️ Understanding WSL Paths

### Accessing Windows from WSL

```bash
# Windows C: drive
/mnt/c/

# Windows user directory
/mnt/c/Users/YourName/

# Windows Claude directory
/mnt/c/Users/YourName/.claude/

# Windows Documents
/mnt/c/Users/YourName/Documents/
```

### Accessing WSL from Windows

```
# In Windows Explorer, type:
\\wsl$\Ubuntu\home\yourname\.claude\

# Or in PowerShell
cd \\wsl$\Ubuntu\home\yourname\.claude\
```

### Path Translations

| Windows | WSL |
|---------|-----|
| `C:\Users\YourName\` | `/mnt/c/Users/YourName/` |
| `%USERPROFILE%\.claude` | `/mnt/c/Users/YourName/.claude` |
| `D:\Projects\` | `/mnt/d/Projects/` |

---

## 🚀 Quick Setup Commands

### Shared Setup (Fastest)

```bash
# Run in WSL after Windows setup is complete
mkdir -p ~/.claude ~/.config
ln -s /mnt/c/Users/$(cmd.exe /c "echo %USERNAME%" | tr -d '\r')/.claude/agents ~/.claude/agents
ln -s /mnt/c/Users/$(cmd.exe /c "echo %USERNAME%" | tr -d '\r')/.claude/skills ~/.claude/skills
ln -s /mnt/c/Users/$(cmd.exe /c "echo %USERNAME%" | tr -d '\r')/.config/skillshare ~/.config/skillshare
```

### Separate Setup (Full Linux)

```bash
# Run in WSL
curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/install.sh | sh
git clone https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-agents.git ~/.claude/agents
skillshare init --no-copy --all-targets --git
cd ~/.config/skillshare/skills
git remote add origin https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/admin/claude-skills.git
skillshare pull --remote
```

---

## 📝 WSL Shell Aliases

Add to `~/.bashrc` in WSL:

```bash
# Sync shortcuts
alias sync-agents='cd ~/.claude/agents && git pull origin main'
alias sync-skills='skillshare pull --remote'
alias sync-all='sync-agents && sync-skills'

# Push shortcuts
alias push-agents='cd ~/.claude/agents && git add . && git commit -m "Update from WSL" && git push'
alias push-skills='skillshare sync && skillshare push -m "Update from WSL"'

# Status shortcuts
alias agent-status='cd ~/.claude/agents && git status'
alias skill-status='skillshare status'

# Reload bashrc
source ~/.bashrc
```

Usage:
```bash
sync-all        # Pull both agents and skills
push-agents     # Push agent changes
skill-status    # Check skillshare status
```

---

## 🔄 Daily Workflow (WSL)

### Morning Sync

```bash
# Open WSL terminal
wsl

# Pull latest from all machines
sync-all  # Or manually:
cd ~/.claude/agents && git pull
skillshare pull --remote
```

### Working

```bash
# Create new agent
nano ~/.claude/agents/my-new-agent.md

# Create new skill
skillshare new my-helper
nano ~/.config/skillshare/skills/my-helper/SKILL.md
```

### Evening Push

```bash
# Push agents
cd ~/.claude/agents
git add .
git commit -m "Add my-new-agent"
git push origin main

# Push skills
skillshare sync
skillshare push -m "Add my-helper skill"
```

---

## 🛠️ WSL-Specific Tips

### 1. Performance

WSL 2 is fast, but accessing Windows files (`/mnt/c/`) is slower than native WSL files (`~/`).

**If using shared setup:**
- Acceptable for git pull/push
- Skillshare sync might be slightly slower

**If performance is critical:**
- Use separate setup (pure WSL paths)

### 2. Line Endings

Git in WSL handles line endings correctly by default:

```bash
# Verify (should be false or input)
git config --global core.autocrlf

# Set if needed
git config --global core.autocrlf input
```

### 3. File Permissions

Windows files accessed from WSL may have unusual permissions:

```bash
# If you see weird permissions like 777
# Add to ~/.bashrc or /etc/wsl.conf
echo "[automount]
options = metadata,umask=22,fmask=11" | sudo tee -a /etc/wsl.conf

# Restart WSL
wsl --shutdown
wsl
```

### 4. VS Code Integration

VS Code works great with WSL:

```bash
# In WSL, open VS Code
code ~/.claude/agents/
code ~/.config/skillshare/skills/

# VS Code will connect to WSL automatically
```

---

## 🐛 Troubleshooting WSL

### Symlink Not Working

```bash
# Check if symlink exists
ls -la ~/.claude/agents

# Remove broken symlink
rm ~/.claude/agents

# Recreate
ln -s /mnt/c/Users/YourName/.claude/agents ~/.claude/agents
```

### Permission Denied

```bash
# Check Windows directory permissions
ls -la /mnt/c/Users/YourName/.claude/

# If owned by root, fix permissions
sudo chown -R $(whoami):$(whoami) ~/.claude/
```

### Git Not Found in WSL

```bash
# Install git
sudo apt update
sudo apt install git -y
```

### Skillshare Not Found

```bash
# Check installation
which skillshare

# If not found, reinstall
curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/install.sh | sh

# Add to PATH if needed
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

### WSL Can't Access Windows Files

```bash
# Check if Windows drives are mounted
ls /mnt/c/

# If not mounted, check WSL config
cat /etc/wsl.conf

# Should have:
# [automount]
# enabled = true
```

---

## 🎯 Recommended Setup by Use Case

### Case 1: Claude Code in Both WSL and Windows
**Use: Shared Setup**
- Symlink WSL to Windows directories
- One set of skills/agents
- Sync from either environment

### Case 2: Claude Code Only in WSL
**Use: Separate Setup**
- Native WSL paths (~/.claude/)
- Better performance
- Pure Linux experience

### Case 3: Claude Code Only in Windows
**Use: Windows Native Setup**
- Don't need WSL for Claude Code
- But can use WSL for git commands (faster)
- Symlink Windows to WSL if desired

### Case 4: Development in WSL, Claude Code in Windows
**Use: Shared Setup**
- Code in WSL, run Claude in Windows
- Both access same skills/agents
- Best of both worlds

---

## 📊 Performance Comparison

| Operation | Native Windows | WSL (Shared) | WSL (Separate) |
|-----------|---------------|--------------|----------------|
| Git clone | Medium | Medium | Fast |
| Git pull | Medium | Medium | Fast |
| Skillshare sync | Medium | Slow | Fast |
| File access | Fast | Slow | Fast |
| Overall | Medium | Medium | **Fastest** |

**Recommendation**: If performance matters, use separate WSL setup.

---

## 🔐 Credentials in WSL

### Option 1: Store in Git URL (Already Configured)

```bash
# Already set in remote URL
https://admin:MyN3wP%40ssword%21@gitea.pressmess.duckdns.org/...
```

### Option 2: Git Credential Helper

```bash
# Install credential helper
git config --global credential.helper store

# First pull/push will prompt for password
# Then stored in ~/.git-credentials
```

### Option 3: SSH Keys

```bash
# Generate SSH key in WSL
ssh-keygen -t ed25519 -C "admin@wsl"

# Copy public key
cat ~/.ssh/id_ed25519.pub

# Add to Gitea (Settings → SSH Keys)

# Update remotes
cd ~/.claude/agents
git remote set-url origin git@gitea.pressmess.duckdns.org:admin/claude-agents.git
```

---

## 📚 Resources

- **WSL Install**: https://learn.microsoft.com/en-us/windows/wsl/install
- **WSL Best Practices**: https://learn.microsoft.com/en-us/windows/wsl/setup/environment
- **VS Code + WSL**: https://code.visualstudio.com/docs/remote/wsl

---

## ✅ Quick Checklist

### Shared Setup:
- [ ] Install WSL
- [ ] Set up agents/skills in Windows
- [ ] Create symlinks from WSL to Windows
- [ ] Test: `ls ~/.claude/agents`
- [ ] Optional: Install Skillshare in WSL

### Separate Setup:
- [ ] Install WSL
- [ ] Install git in WSL
- [ ] Clone agents repo
- [ ] Install Skillshare
- [ ] Initialize Skillshare with remote
- [ ] Test sync

---

**Last Updated**: 2026-01-29
**Version**: 1.0
**WSL Version**: WSL 2
**Tested With**: Ubuntu 22.04, Ubuntu 24.04
