syntaxis/docs/wrappers/wrapper-deployment-analysis.md
Jesús Pérez 9cef9b8d57 refactor: consolidate configuration directories
Merge _configs/ into config/ for single configuration directory.
Update all path references.

Changes:
- Move _configs/* to config/
- Update .gitignore for new patterns
- No code references to _configs/ found

Impact: -1 root directory (layout_conventions.md compliance)
2025-12-26 18:36:23 +00:00

309 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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