# Nushell Plugin Distribution Installer Workflow

Complete workflow for creating and distributing Nushell plugins with manifest-based installation.

## Overview

The distribution installer system has three main components:

1. **Manifest Generator** - Scans plugins and creates a manifest
2. **Manifest File** - JSON file listing all available plugins
3. **Distribution Installer** - Lets users choose which plugins to install/register

## Workflow

### Step 1: Create Distribution Manifest

When you're packaging the distribution:

```bash
# Scan plugin directory and create manifest
./scripts/create_distribution_manifest.nu /path/to/plugins --output DISTRIBUTION_MANIFEST.json
```

**Output:** `DISTRIBUTION_MANIFEST.json` containing:
- All available plugins
- Plugin descriptions
- Plugin paths
- File sizes
- Metadata (version, creation date)

**Example manifest structure:**
```json
{
  "version": "1.0.0",
  "created": "2025-10-22T10:52:08Z",
  "source_directory": "/path/to/plugins",
  "total_plugins": 13,
  "plugins": [
    {
      "name": "nu_plugin_auth",
      "purpose": "Authentication (JWT, MFA)",
      "path": "/path/to/plugins/nu_plugin_auth",
      "size_bytes": 11846592
    },
    ... more plugins
  ]
}
```

### Step 2: Package Distribution

Include in your distribution:
```
distribution/
├── bin/
│   ├── nu_plugin_auth
│   ├── nu_plugin_kms
│   ├── ...
├── install_from_manifest.nu    (or ./install.nu - symlink)
└── DISTRIBUTION_MANIFEST.json   (manifest file)
```

### Step 3: User Installation

End users run the installer:

```bash
# List available plugins
./install_from_manifest.nu --list

# Install essential preset
./install_from_manifest.nu --preset essential

# Install all plugins
./install_from_manifest.nu --all

# Install specific plugins
./install_from_manifest.nu --select auth kms orchestrator

# Dry-run (preview)
./install_from_manifest.nu --preset development --check
```

## Manifest Generator

**Script:** `./scripts/create_distribution_manifest.nu`

### Usage

```bash
# Scan current directory
./scripts/create_distribution_manifest.nu

# Scan specific directory
./scripts/create_distribution_manifest.nu /path/to/plugins

# Custom output file
./scripts/create_distribution_manifest.nu /path/to/plugins --output my_manifest.json
```

### What It Does

1. Scans for plugin binaries (files matching `nu_plugin_*`)
2. Extracts plugin information (name, purpose, path, size)
3. Creates JSON manifest file
4. Ready to be included in distribution

## Distribution Installer

**Script:** `./install_from_manifest.nu`

### Usage Options

```bash
# Interactive menu
./install_from_manifest.nu

# List available plugins
./install_from_manifest.nu --list

# Use preset
./install_from_manifest.nu --preset essential   # 5 core plugins
./install_from_manifest.nu --preset development # 8 plugins
./install_from_manifest.nu --preset full        # All plugins

# Select specific plugins
./install_from_manifest.nu --select auth kms orchestrator

# Install all
./install_from_manifest.nu --all

# Dry-run (preview)
./install_from_manifest.nu --check

# Install only (skip registration)
./install_from_manifest.nu --all --install-only

# Register only (skip install)
./install_from_manifest.nu --all --register-only
```

### What It Does

1. **Loads manifest** - Reads DISTRIBUTION_MANIFEST.json
2. **Displays options** - Shows available plugins or presets
3. **User selects** - Interactive menu or command-line options
4. **Installs** - Copies selected plugins to ~/.local/bin/
5. **Registers** - Updates Nushell config (~/.config/nushell/env.nu)
6. **Confirms** - Asks user before making changes

## Available Presets

### Essential (5 plugins)
```
• nu_plugin_auth         - Authentication
• nu_plugin_kms          - Encryption
• nu_plugin_orchestrator - Orchestration
• nu_plugin_kcl          - KCL config
• nu_plugin_tera         - Templates
```

### Development (8 plugins)
```
All essential +
• nu_plugin_highlight    - Syntax highlighting
• nu_plugin_image        - Image processing
• nu_plugin_clipboard    - Clipboard
```

### Full (All custom plugins)
```
All 13 custom plugins included in distribution
```

## Example Distribution Package

```
nushell-plugins-3.5.0-darwin-arm64/
├── README.md
├── LICENSE
├── bin/
│   ├── nu_plugin_auth
│   ├── nu_plugin_clipboard
│   ├── nu_plugin_desktop_notifications
│   ├── nu_plugin_fluent
│   ├── nu_plugin_hashes
│   ├── nu_plugin_highlight
│   ├── nu_plugin_image
│   ├── nu_plugin_kcl
│   ├── nu_plugin_kms
│   ├── nu_plugin_orchestrator
│   ├── nu_plugin_port_extension
│   ├── nu_plugin_qr_maker
│   └── nu_plugin_tera
├── DISTRIBUTION_MANIFEST.json
├── install_from_manifest.nu
└── install.nu -> install_from_manifest.nu (symlink for convenience)
```

## User Quick Start

```bash
# Extract distribution
tar -xzf nushell-plugins-3.5.0-darwin-arm64.tar.gz
cd nushell-plugins-3.5.0-darwin-arm64

# See what's available
./install.nu --list

# Install essential plugins
./install.nu --preset essential

# Restart Nushell
exit && nu

# Verify
nu -c "plugin list"
```

## Build & Package Workflow

### For Distribution Maintainers

```bash
# 1. Build all plugins (custom & core)
cd nushell && cargo build --release --workspace && cd ..
cargo build --release (for each custom plugin)

# 2. Create distribution directory
mkdir -p dist/bin
cp ~/.local/bin/nu_plugin_* dist/bin/
cp nushell/target/release/nu_plugin_* dist/bin/ 2>/dev/null

# 3. Generate manifest
./scripts/create_distribution_manifest.nu dist/bin --output dist/DISTRIBUTION_MANIFEST.json

# 4. Copy installer script
cp scripts/install_from_manifest.nu dist/install_from_manifest.nu
ln -s install_from_manifest.nu dist/install.nu

# 5. Add documentation
cp README.md dist/
cp LICENSE dist/

# 6. Package for distribution
tar -czf nushell-plugins-3.5.0-darwin-arm64.tar.gz dist/
```

## File Reference

| File | Purpose |
|------|---------|
| `scripts/create_distribution_manifest.nu` | Generate manifest from plugins |
| `scripts/install_from_manifest.nu` | Install & register from manifest |
| `DISTRIBUTION_MANIFEST.json` | JSON list of available plugins |
| `~/.local/bin/nu_plugin_*` | Installed plugin binaries |
| `~/.config/nushell/env.nu` | Nushell config (plugin registrations added) |

## Features

✅ **Automatic Detection** - Scans for all available plugins
✅ **Flexible Selection** - Presets or individual plugin selection
✅ **User Choice** - No forced installations
✅ **Dry-Run** - Preview before installing
✅ **Install & Register** - Handles both steps
✅ **Clean Separation** - Install-only and register-only modes
✅ **Safe** - Confirms before making changes
✅ **Easy Distribution** - Single JSON manifest file

## FAQ

**Q: How do I update the manifest after adding new plugins?**
A: Run `create_distribution_manifest.nu` again to regenerate the manifest.

**Q: Can users install plugins after distribution is created?**
A: Only if the plugins are included in the distribution. Core Nushell plugins require a rebuild.

**Q: What if manifest is missing?**
A: Installer will fail with clear error message. User needs to generate manifest first.

**Q: Can I customize plugin purposes/descriptions?**
A: Edit the manifest JSON file manually or modify `get_plugin_purpose()` function before generating.

**Q: Do plugins need to be pre-built?**
A: Yes, distribution contains only binaries. No build tools needed by end users.

---

**Version:** 3.5.0
**Manifest Version:** 1.0.0
**Created:** 2025-10-22
**Nushell:** 0.108.0+
