# Wrapper Deployment Architecture: Development vs Bundle ## The Real Question You're asking: **"Should bundle installation create the SAME wrapper structure that `scripts/install-syntaxis` creates?"** --- ## Current State Comparison ### Development Installation: `scripts/install-syntaxis` ✅ HAS WRAPPERS ``` User runs: ./scripts/install-syntaxis all Result: ~/.cargo/bin/syntaxis-cli ← Bash wrapper (212 bytes) └─ Calls: ~/.config/syntaxis/scripts/syntaxis-cli.nu └─ Calls: ~/.cargo/bin/syntaxis-cli.real ~/.config/syntaxis/scripts/ ├── syntaxis-lib.nu ← Shared library ├── syntaxis-cli.nu ← NuShell wrapper script ├── syntaxis-cli-lib.nu ← CLI utilities └── ... (same for tui, api) ~/.cargo/bin/ ├── syntaxis-cli.real ← Real binary (7.2 MB) ├── syntaxis-tui.real ← Real binary (3.9 MB) ├── syntaxis-api.real ← Real binary (8.3 MB) ``` **User Experience**: ```bash $ syntaxis-cli status # Wrapper auto-injects --config path # Clean, simple, no typing burden ``` --- ### Bundle Installation: `scripts/provisioning/install.sh` ❌ NO WRAPPERS ``` User runs: bash install.sh Result: ~/.local/bin/syntaxis-cli ← Direct binary (7.2 MB) ~/.local/bin/syntaxis-tui ← Direct binary (3.9 MB) ~/.local/bin/syntaxis-api ← Direct binary (8.3 MB) ~/.config/syntaxis/ ├── syntaxis-cli.toml ├── syntaxis-tui.toml ├── syntaxis-api.toml └── ... (configs only, no wrapper scripts!) ``` **User Experience**: ```bash $ syntaxis-cli --config ~/.config/syntaxis/config.toml status # No wrapper! User must type --config path # Bad UX! Repetitive! ``` --- ## The Problem **Development users** (via `scripts/install-syntaxis`): - Get wrapper structure - Auto-config injection - Type: `syntaxis-cli status` - Good UX ✅ **Bundle users** (via `scripts/provisioning/install.sh`): - Get direct binaries only - No config injection - Type: `syntaxis-cli --config ~/.config/syntaxis/config.toml status` - Bad UX ❌ --- ## Decision Required ### Option A: Bundle Creates Wrappers Too ✅ RECOMMENDED Bundle `install.sh` should: 1. Copy wrapper scripts to `~/.config/syntaxis/scripts/` - `syntaxis-lib.nu` - `syntaxis-cli.nu` - `syntaxis-cli-lib.nu` - etc. 2. Rename binaries to `.real` 3. Create bash wrappers at original locations 4. Result: Users get same structure as dev installation **Benefits**: - ✅ Users have consistent experience (dev = bundle) - ✅ Auto-config injection (users don't type --config) - ✅ Same UX across all installation methods **Complexity**: - Need to include `.nu` scripts in bundle - `install.sh` needs to create wrapper structure - More moving parts --- ### Option B: Keep Bundle Simple (Direct Binaries) ❌ NOT RECOMMENDED Bundle `install.sh` stays as-is: 1. Copy binaries directly to `~/.local/bin/` 2. Copy configs to `~/.config/syntaxis/` 3. Users invoke with explicit `--config` flag **Benefits**: - ✅ Simple implementation - ✅ Minimal dependencies (no NuShell needed) - ✅ Lightweight **Costs**: - ❌ Bundle users have worse UX than dev users - ❌ Users must type `--config path` every time - ❌ Inconsistent experience --- ## Analysis Framework ``` Bundle Installation Quality = (Same UX as dev) × (Auto-config) - (Complexity) Option A: High × Yes - Medium = GOOD Option B: Low × No - Low = BAD ``` --- ## Implementation: How to Add Wrappers to Bundle If we choose **Option A** (RECOMMENDED), here's what's needed: ### 1. Bundle Contents (Updated) **Currently, bundle has**: ``` bin/ ├── syntaxis-cli ← Direct binary ├── syntaxis-tui ← Direct binary ├── syntaxis-api ← Direct binary configs/ ├── database-default.toml ├── syntaxis-cli.toml └── ... (only configs) ``` **Should also have**: ``` scripts/ ← NEW! ├── syntaxis-lib.nu ← Shared library ├── syntaxis-cli.nu ← NuShell wrapper ├── syntaxis-cli-lib.nu ← CLI utilities ├── syntaxis-tui.nu ← TUI wrapper ├── syntaxis-tui-lib.nu ← TUI utilities ├── syntaxis-api.nu ← API wrapper └── syntaxis-api-lib.nu ← API utilities ``` ### 2. Update provisioning.toml **Need to add to artifacts**: ```toml [artifacts] binaries = [...] configs = [...] docs = [...] scripts_for_wrappers = [ ← NEW SECTION "scripts/syntaxis-lib.nu", "scripts/syntaxis-cli.nu", "scripts/syntaxis-cli-lib.nu", "scripts/syntaxis-tui.nu", "scripts/syntaxis-tui-lib.nu", "scripts/syntaxis-api.nu", "scripts/syntaxis-api-lib.nu", ] ``` ### 3. Update install.sh Current code: ```bash install_binary() { cp "$source" "$dest" chmod 755 "$dest" } ``` Should be: ```bash install_binary() { local source="$1" local dest="$2" local binary_name=$(basename "$source") # Copy and rename to .real cp "$source" "$dest.real" chmod 755 "$dest.real" # Create bash wrapper cat > "$dest" << 'EOF' #!/bin/bash export NU_LIB_DIRS="$HOME/.config/syntaxis/scripts" exec nu "$HOME/.config/syntaxis/scripts/$binary_name.nu" "$@" EOF chmod 755 "$dest" } ``` ### 4. Update pack.nu Add collection of wrapper scripts: ```nu let wrapper_scripts = ( $config.artifacts.wrapper_scripts | each { |script_path| ... } ) ``` Copy to `scripts/` in bundle. --- ## My Recommendation ### ✅ YES: Implement Option A (Add Wrappers to Bundle) **Rationale**: 1. Users deserve same UX whether they install via dev or bundle 2. Auto-config injection is essential (users won't type --config 100s of times) 3. Complexity is justified (same as dev installation) 4. Bundle should be "self-contained" with all dependencies for good UX **Action Items**: 1. Update `provisioning.toml` to include wrapper scripts 2. Modify `install.sh` to create wrapper structure 3. Update `pack.nu` to include `scripts/` directory in bundle 4. Test complete installation flow 5. Update documentation to explain wrapper architecture --- ## Alternative: Keep Provision.sh? Wait, maybe `provision.sh` WAS useful after all! If we're adding wrapper complexity to `install.sh`, we might want: ```bash ./provision install # Just install binaries ./provision config # Just setup configs ./provision wrappers # Just create wrapper structure ./provision full # All three (install + config + wrappers) ``` In this case, `provision.sh` makes sense as an **orchestrator for wrapper creation**! But the issue remains: It's still **one-time use** during installation. --- ## Summary: What Do You Want to Do? Three options: 1. **Option A1**: Add wrappers to bundle installer - Users get same experience as dev installation - Requires modifying `install.sh`, `pack.nu`, `provisioning.toml` - Keep `provision.sh` as orchestrator (now it has value!) 2. **Option A2**: Add wrappers to bundle, no orchestrator - Same result but simpler - Users run two steps: `install.sh` + `setup-config.sh` - Scripts handle wrapper creation internally 3. **Option B**: Keep bundle simple - No wrappers in bundle - Users type `--config path` every time - Simpler but worse UX **Recommendation**: **Option A2** (add wrappers, no provision.sh orchestrator) --- ## Clear Statement **What you're asking**: - Should end users (bundle installers) get the same wrapper infrastructure that developers get? **What the answer should be**: - YES! Absolutely. Users need auto-config injection. **What needs to change**: - `install.sh` should rename binaries to `.real` and create bash wrappers - `pack.nu` should include NuShell wrapper scripts in bundle - Documentation should explain wrapper architecture to users