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)
309 lines
7.7 KiB
Markdown
309 lines
7.7 KiB
Markdown
# 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
|