# Nushell Plugin Upstream Tracking System

This system provides automated tracking and management of upstream changes for nushell plugins while preserving your local nu_* dependency modifications.

## 🚀 Quick Start

```bash
# Check status of all plugins
./sh/plugin_status.sh

# Check upstream changes for all plugins
./sh/check_upstream.sh

# Check specific plugin only
./sh/check_upstream.sh --plugin nu_plugin_highlight

# Merge all pending plugins
./sh/safe_merge_upstream.sh --all
```

## 📋 Supported Operations

### ✅ **For ALL Plugins**
```bash
# Check upstream changes for ALL plugins
./sh/check_upstream.sh
nu nu/check_upstream_changes.nu

# Show status of ALL plugins
./sh/plugin_status.sh
nu nu/plugin_status.nu

# Merge ALL pending plugins
./sh/safe_merge_upstream.sh --all
nu nu/safe_merge_upstream.nu --all
```

### ✅ **For ONE Specific Plugin**
```bash
# Check upstream for ONE plugin
./sh/check_upstream.sh --plugin nu_plugin_highlight
nu nu/check_upstream_changes.nu --plugin nu_plugin_highlight

# Preview merge for ONE plugin
./sh/safe_merge_upstream.sh --preview nu_plugin_highlight
nu nu/safe_merge_upstream.nu --preview nu_plugin_highlight

# Merge ONE plugin
./sh/safe_merge_upstream.sh nu_plugin_highlight
nu nu/safe_merge_upstream.nu nu_plugin_highlight
```

### ✅ **For SEVERAL Plugins** (multiple ways)

#### Method 1: Run multiple commands
```bash
# Check several plugins individually
./sh/check_upstream.sh --plugin nu_plugin_highlight
./sh/check_upstream.sh --plugin nu_plugin_clipboard
./sh/check_upstream.sh --plugin nu_plugin_tera

# Merge several plugins individually
./sh/safe_merge_upstream.sh nu_plugin_highlight
./sh/safe_merge_upstream.sh nu_plugin_clipboard
./sh/safe_merge_upstream.sh nu_plugin_tera
```

#### Method 2: Use shell scripting
```bash
# Check multiple plugins in a loop
for plugin in nu_plugin_highlight nu_plugin_clipboard nu_plugin_tera; do
    ./sh/check_upstream.sh --plugin $plugin
done

# Merge multiple specific plugins
for plugin in nu_plugin_highlight nu_plugin_clipboard; do
    ./sh/safe_merge_upstream.sh $plugin
done
```

#### Method 3: Use the "pending" status to target several
```bash
# First, check all to mark them as pending
./sh/check_upstream.sh

# Then merge all pending ones (effectively several plugins)
./sh/safe_merge_upstream.sh --all
```

## 🔧 System Components

### Core Files
- `plugin_registry.toml` - Central configuration and status tracking
- `nu/lib/cargo_toml_diff.nu` - Cargo.toml analysis library
- `nu/check_upstream_changes.nu` - Main upstream checker with auto-OK logic
- `nu/plugin_status.nu` - Status dashboard and management
- `nu/safe_merge_upstream.nu` - Safe merge with rollback capability

### Shell Wrappers (for compatibility)
- `sh/check_upstream.sh` - Shell wrapper for upstream checking
- `sh/plugin_status.sh` - Shell wrapper for status dashboard
- `sh/safe_merge_upstream.sh` - Shell wrapper for safe merging

## 🎯 Auto-OK Logic

The system automatically marks plugins as "OK" when:
- ✅ Only nu_* dependencies changed (nu-plugin, nu-protocol, etc.)
- ✅ No source code changes (.rs files)
- ✅ No other dependency changes
- ✅ Plugin has `auto_ok_on_nu_deps_only = true` in registry

## 📊 Plugin Status Types

| Status | Emoji | Description |
|--------|-------|-------------|
| `ok` | ✅ | Synchronized with upstream |
| `pending` | ⚠️ | Changes detected, needs review |
| `error` | ❌ | Error during checking/merging |
| `conflict` | 🔥 | Merge conflicts detected |
| `unknown` | ❓ | Not yet checked |
| `local_only` | 🏠 | No upstream repository |

## 💡 Usage Examples

### Daily Workflow
```bash
# 1. Check all plugins for updates
./sh/check_upstream.sh

# 2. See what needs attention
./sh/plugin_status.sh attention

# 3. Merge safe updates automatically
./sh/safe_merge_upstream.sh --all

# 4. Review any remaining pending plugins manually
./sh/plugin_status.sh
```

### Specific Plugin Workflow
```bash
# 1. Check one plugin
./sh/check_upstream.sh --plugin nu_plugin_highlight

# 2. Preview what would change
./sh/safe_merge_upstream.sh --preview nu_plugin_highlight

# 3. Merge if acceptable
./sh/safe_merge_upstream.sh nu_plugin_highlight
```

### Batch Processing Several Plugins
```bash
# Define plugins to process
PLUGINS="nu_plugin_highlight nu_plugin_clipboard nu_plugin_tera"

# Check them all
for plugin in $PLUGINS; do
    echo "Checking $plugin..."
    ./sh/check_upstream.sh --plugin $plugin
done

# Show status
./sh/plugin_status.sh

# Merge pending ones
./sh/safe_merge_upstream.sh --all
```

## 🛡️ Safety Features

- **Automatic backups** before any merge
- **Temporary branch testing** before applying changes
- **Rollback capability** if compilation fails
- **Preserves local nu_* versions** during merge
- **Never auto-merges** - only auto-marks as OK
- **Test compilation and tests** after merge

## 🔄 Integration with Existing Scripts

The system integrates with your existing `update_nu_versions.sh`:

```bash
# 1. Check upstream first
./sh/check_upstream.sh

# 2. Update local nu versions
./sh/update_nu_versions.sh

# 3. Check status after update
./sh/plugin_status.sh
```

## 📁 File Structure

```
scripts/
├── plugin_registry.toml           # Central registry
├── nu/                           # Nushell scripts
│   ├── lib/
│   │   └── cargo_toml_diff.nu    # Analysis library
│   ├── check_upstream_changes.nu  # Main checker
│   ├── plugin_status.nu          # Status dashboard
│   └── safe_merge_upstream.nu    # Safe merger
└── sh/                           # Shell wrappers
    ├── check_upstream.sh         # Check wrapper
    ├── plugin_status.sh          # Status wrapper
    └── safe_merge_upstream.sh    # Merge wrapper
```

## ⚙️ Configuration

Edit `plugin_registry.toml` to:
- Add new plugins
- Configure upstream URLs
- Enable/disable auto-OK behavior
- Manage nu_* dependency list

## 🚨 Troubleshooting

### If nushell is not found:
```bash
# Install nushell first
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install nu
```

### If plugins fail to merge:
```bash
# Check individual plugin status
./sh/plugin_status.sh

# Preview changes first
./sh/safe_merge_upstream.sh --preview PLUGIN_NAME

# Force merge if needed
./sh/safe_merge_upstream.sh --force PLUGIN_NAME
```

### If registry gets corrupted:
```bash
# Backup exists at plugin_registry.toml.backup
mv plugin_registry.toml.backup plugin_registry.toml
```