# Installation Architecture: Targets with Configs & Wrappers **Status:** Analysis & Design Document **Created:** November 15, 2025 **Purpose:** Document installation strategy for syntaxis binaries with configuration management --- ## 1. Current Installation System ### 1.1 Installation Scripts Infrastructure **File:** `scripts/install-cli.nu` (NuShell) **Current Capabilities:** - Discovers binary crates in syntaxis (cli, api, tui, dashboard) - Installs binaries to system PATH via `cargo install` - Cleans up target/ directories (optional) - Shows installation status - Manages individual binary installation **Current Limitations:** ``` ✅ Installs binaries to ~/.cargo/bin/ (system PATH) ❌ Does NOT deploy configuration files ❌ Does NOT create wrapper scripts ❌ Does NOT manage config discovery at runtime ❌ No post-install configuration step ``` ### 1.2 Manifest Management Infrastructure **File:** `scripts/manifest.nu` (NuShell) **Tracks:** - Installed binaries (name, version, path, enabled/disabled status) - Configurations (name, type, path, enabled/disabled) - Installation metadata (creation date, root directory) **Example Structure:** ```toml # .syntaxis/manifest.toml (generated structure) [syntaxis] version = "0.1.0" created_at = "2025-11-15" installation_root = "/path/to/installation" [binaries] workspace = { enabled = true, installed_at = "2025-11-15", version = "0.1.0", path = "..." } syntaxis-tui = { enabled = true, installed_at = "2025-11-15", version = "0.1.0", path = "..." } [configurations] # Currently empty - needs enhancement ``` ### 1.3 Configuration Discovery System **File:** `scripts/common/find-config.nu` **Search Order:** 1. `.syntaxis/{filename}` - syntaxis specific 2. `.project/{filename}` - Generic project 3. `.coder/{filename}` - Documentation tracking 4. `{filename}` - Current directory fallback **Current Usage:** - Scripts use this to find config files at build/runtime - Database discovery (find-db-path) - TOML file discovery --- ## 2. Configuration System Analysis ### 2.1 Configuration File Locations **Current Structure:** ``` syntaxis/ ├── syntaxis/ │ ├── syntaxis-api-config.template.toml ⚠️ NEEDS RENAME │ └── configs/features/ │ ├── auth.toml.template │ ├── cache.toml.template │ ├── database.toml.template │ ├── health.toml.template │ ├── metrics.toml.template │ ├── multi_tenant.toml.template │ └── rate_limit.toml.template │ ├── shared/rust-api/shared-api-lib/ │ └── src/config/mod.rs (Config definitions) │ └── .syntaxis/ (Runtime configs after installation) ├── manifest.toml (Installation tracking) └── [configs deployed here at runtime] ``` ### 2.2 Configuration Loading Flow **Current (Hardcoded):** ```rust // shared-api-lib/src/config/mod.rs impl Config { pub fn load() -> Result { // 1. Try reading from env var let config_path = std::env::var("CONFIG_PATH") .unwrap_or_else(|_| "configs/default.toml".to_string()); // 2. Load from file let content = std::fs::read_to_string(&config_path)?; // 3. Deserialize let config: Config = toml::from_str(&content)?; Ok(config) } } ``` **Needs Enhancement:** - Use find-config logic for standardized discovery - Support multiple config locations - Environment variable overrides - Config validation and merging ### 2.3 Configuration Types **Main Configuration:** `syntaxis-api-config.toml` - Server settings (host, port) - Database connection - Logging level - Feature flags **Feature Configurations:** `configs/features/*.toml` - auth.toml - Authentication settings - database.toml - Database pooling - metrics.toml - Prometheus settings - rate_limit.toml - Rate limiting rules - cache.toml - Caching configuration - health.toml - Health check settings - multi_tenant.toml - Multi-tenancy settings **Missing Workspace-Specific Configs:** - projects.toml - Project management settings - tasks.toml - Task tracking configuration - phases.toml - Phase lifecycle configuration - audit.toml - Audit trail settings --- ## 3. Installation Targets Architecture ### 3.1 What is a "Target"? In syntaxis context, a **target** is: ``` A compiled binary + its associated configs + runtime metadata workspace (target) ├── Binary │ └── ~/.cargo/bin/workspace (executable) ├── Configuration │ ├── ~/.config/core/workspace.toml (main config) │ └── ~/.config/core/features/*.toml (feature configs) ├── Data │ └── ~/.local/share/core/ (runtime data) ├── Wrapper │ └── /usr/local/bin/workspace (wrapper script) └── Metadata └── .syntaxis/manifest.toml (installed version/path) ``` ### 3.2 Target Types **1. CLI Binary (syntaxis-cli)** ``` Purpose: Command-line interface Executable: ~/.cargo/bin/workspace Config: ~/.config/core/cli.toml Data: ~/.local/share/core/cli/ Wrapper: Yes (setup env, find config, pass args) ``` **2. TUI Binary (syntaxis-tui)** ``` Purpose: Terminal UI interface Executable: ~/.cargo/bin/syntaxis-tui Config: ~/.config/core/tui.toml Data: ~/.local/share/core/tui/ Wrapper: Yes (setup terminal, handle signals) ``` **3. API Server (syntaxis-api)** ``` Purpose: REST API server Executable: ~/.cargo/bin/syntaxis-api Config: ~/.config/core/api.toml Data: ~/.local/share/core/api/ Wrapper: Yes (setup environment, manage process) ``` **4. Dashboard (syntaxis-dashboard)** ``` Purpose: Web UI Type: Library + WASM frontend Config: ~/.config/core/dashboard.toml Data: ~/.local/share/core/dashboard/ Wrapper: Yes (manage server lifecycle) ``` --- ## 4. Configuration Deployment Strategy ### 4.1 Configuration File Organization **On Host System (After Installation):** ``` ~/.config/core/ ├── manifest.toml # Installation tracking ├── defaults.toml # Global defaults ├── workspace.toml # CLI config ├── syntaxis-tui.toml # TUI config ├── syntaxis-api.toml # API config ├── syntaxis-dashboard.toml # Dashboard config └── features/ # Feature configs ├── auth.toml ├── cache.toml ├── database.toml ├── health.toml ├── metrics.toml ├── multi_tenant.toml └── rate_limit.toml ~/.local/share/core/ ├── cli/ # CLI runtime data │ └── history.json ├── tui/ # TUI runtime data │ └── state.json ├── api/ # API runtime data │ ├── workspace.db │ └── logs/ └── dashboard/ # Dashboard runtime data └── cache/ ``` ### 4.2 Configuration Template Deployment **During Installation:** 1. Copy `syntaxis-api-config.template.toml` → `~/.config/core/syntaxis-api.toml` 2. Copy `configs/features/*.toml.template` → `~/.config/core/features/*.toml` 3. Create `.syntaxis/manifest.toml` with installation metadata 4. Register installed configurations in manifest **Version Management:** ```toml # manifest.toml entry [configurations.syntaxis-api] enabled = true type = "main" path = "~/.config/core/syntaxis-api.toml" version = "0.1.0" deployed_from = "syntaxis/syntaxis-api-config.template.toml" deployed_at = "2025-11-15T10:30:00Z" ``` --- ## 5. Wrapper Scripts Architecture ### 5.1 Purpose of Wrappers Wrapper scripts sit between the user/system and the binary, providing: ``` User Command: workspace --version ↓ Wrapper Script: workspace (wrapper) ↓ (setup environment) ├─ Find config file ├─ Set environment variables ├─ Validate config ├─ Setup logging └─ Call actual binary ↓ Actual Binary: ~/.cargo/bin/workspace.real ↓ Output to User ``` ### 5.2 Wrapper Implementation Strategy **Type 1: Shell-based Wrappers** (NuShell or Bash) ```nu #!/usr/bin/env nu # workspace wrapper - Setup environment and call actual binary # 1. Find configuration use scripts/common/find-config.nu [find-config] let config_file = (find-config "workspace.toml") # 2. Setup environment let config_dir = ( if ($config_file | is-empty) { "~/.config/syntaxis" } else { ($config_file | path dirname) } ) # 3. Set environment variables $env.WORKSPACE_CONFIG_DIR = ($config_dir | path expand) $env.WORKSPACE_DATA_DIR = ("~/.local/share/syntaxis" | path expand) $env.WORKSPACE_HOME = (pwd) # 4. Call actual binary with arguments ~/.cargo/bin/workspace.real ...$args ``` **Type 2: Rust-based Wrappers** ```rust // workspace-wrapper/main.rs use std::env; use std::process::Command; fn main() { // 1. Find and load config let config_dir = find_config_dir() .unwrap_or_else(|| get_default_config_dir()); // 2. Setup environment env::set_var("WORKSPACE_CONFIG_DIR", &config_dir); env::set_var("WORKSPACE_DATA_DIR", get_data_dir()); // 3. Validate config validate_config(&config_dir) .expect("Configuration validation failed"); // 4. Call actual binary let mut cmd = Command::new( get_actual_binary_path() ); cmd.args(env::args().skip(1)); let status = cmd.status() .expect("Failed to execute binary"); std::process::exit(status.code().unwrap_or(1)); } ``` ### 5.3 Wrapper Functions **1. Configuration Discovery & Validation** ``` Find config file ↓ Validate TOML syntax ↓ Check required fields ↓ Merge with feature configs ↓ Set CONFIG_PATH env var ``` **2. Environment Setup** ``` Set WORKSPACE_HOME Set WORKSPACE_CONFIG_DIR Set WORKSPACE_DATA_DIR Set WORKSPACE_LOG_LEVEL (from config) Set RUST_LOG (from log_level config) ``` **3. Pre-execution Hooks** ``` Check database connectivity (for API) Create data directories if missing Setup logging appenders Validate feature configurations ``` **4. Post-execution Cleanup** ``` Flush logs Close database connections Cleanup temp files ``` --- ## 6. Installation Flow ### 6.1 Complete Installation Process ``` ┌─────────────────────────────────────────────────────────┐ │ User: just scripts-install or install-cli.nu all │ └─────────────┬───────────────────────────────────────────┘ │ ├─ 1. DISCOVERY │ └─ Find all binary crates in workspace │ ├─ 2. COMPILATION │ └─ cargo build --release │ ├─ 3. BINARY INSTALLATION │ └─ cargo install --path {crate} │ └─ Binary placed in ~/.cargo/bin/ │ ├─ 4. CONFIGURATION DEPLOYMENT │ ├─ Create ~/.config/core/ │ ├─ Copy syntaxis-api-config.template.toml │ ├─ Copy features/*.toml.template │ └─ Parse and validate all configs │ ├─ 5. WRAPPER INSTALLATION │ ├─ Rename ~/.cargo/bin/workspace → ~/.cargo/bin/workspace.real │ ├─ Create wrapper script at ~/.cargo/bin/workspace │ └─ Make wrapper executable │ ├─ 6. MANIFEST REGISTRATION │ ├─ Load or create .syntaxis/manifest.toml │ ├─ Register binary (name, version, path) │ ├─ Register configurations │ └─ Save manifest │ └─ 7. VERIFICATION ├─ workspace --version (test wrapper) ├─ Test config discovery ├─ Validate environment setup └─ Print installation summary ``` ### 6.2 Installation Script Pseudocode ```nu #!/usr/bin/env nu # Phase 1: Compile binaries cargo build --release # Phase 2: Install binaries to ~/.cargo/bin/ for binary in [workspace syntaxis-tui syntaxis-api] { cargo install --path core/crates/{binary} } # Phase 3: Deploy configurations let config_dir = "~/.config/syntaxis" mkdir -p $config_dir mkdir -p $"($config_dir)/features" # Copy main configs cp syntaxis/syntaxis-api-config.template.toml \ "$config_dir/syntaxis-api.toml" # Copy feature configs cp syntaxis/configs/features/*.toml.template \ "$config_dir/features/" # Phase 4: Install wrappers for binary in [workspace syntaxis-tui syntaxis-api] { let binary_path = $"~/.cargo/bin/($binary)" # Rename actual binary mv $binary_path $"$binary_path.real" # Create wrapper script create-wrapper-script $binary $binary_path # Make executable chmod +x $binary_path } # Phase 5: Register in manifest register-binary "workspace" "0.1.0" "~/.cargo/bin/workspace" register-config "syntaxis-api" "main" "~/.config/core/syntaxis-api.toml" # Phase 6: Verify installation print "✅ Installation complete" print "" print "Test with:" print " workspace --version" print " syntaxis-tui" ``` --- ## 7. Proposed Implementation Roadmap ### Phase 1: Configuration Deployment (Weeks 1-2) **Tasks:** 1. Rename `syntaxis-api-config.template.toml` → `syntaxis-api-config.template.toml` 2. Create workspace-specific feature templates: - `configs/features/projects.toml.template` - `configs/features/tasks.toml.template` - `configs/features/phases.toml.template` - `configs/features/audit.toml.template` 3. Update `install-cli.nu` to copy config templates 4. Create `~/.config/core/` during installation **Deliverables:** - ✅ Config templates renamed and created - ✅ Installation script copies configs - ✅ Configuration files deployed to standard location ### Phase 2: Wrapper Script Implementation (Weeks 3-4) **Tasks:** 1. Create wrapper script generator 2. Implement configuration discovery in wrappers 3. Setup environment variables 4. Integrate manifest management 5. Test wrapper functionality **Deliverables:** - ✅ Wrapper scripts for workspace, syntaxis-tui, syntaxis-api - ✅ Config discovery working - ✅ Environment properly setup ### Phase 3: Manifest Enhancement (Weeks 4-5) **Tasks:** 1. Extend manifest.toml schema to track configs 2. Update manifest.nu to register configurations 3. Add config validation to manifest 4. Create config version tracking **Deliverables:** - ✅ Manifest tracks installed configs - ✅ Config versions tracked - ✅ Easy rollback capability ### Phase 4: Documentation & Testing (Weeks 5-6) **Tasks:** 1. Create installation guide 2. Create configuration guide 3. Write wrapper script documentation 4. Create troubleshooting guide 5. Add integration tests **Deliverables:** - ✅ docs/installation-guide.md - ✅ docs/configuration.md - ✅ WRAPPER_GUIDE.md - ✅ Integration tests passing --- ## 8. Key Design Decisions ### 8.1 Configuration Location **Decision:** `~/.config/core/` **Rationale:** - Follows XDG Base Directory Specification - Separates configs from binaries - Easy to backup/restore - Works on macOS, Linux, Windows (with WSL) - Per-user isolation **Alternative:** `/etc/core/` (would require sudo) ### 8.2 Wrapper Language **Decision:** NuShell for maximum compatibility **Rationale:** - Consistent with existing workspace scripts - Cross-platform (Windows, macOS, Linux) - Rich scripting capabilities - Same repo standard tool **Alternative:** Rust (compile-time, higher performance) ### 8.3 Configuration Format **Decision:** TOML (continue existing approach) **Rationale:** - Already in use throughout workspace - Human-readable - Serde support for validation - Feature-specific configs easy to compose ### 8.4 Manifest Location **Decision:** `.syntaxis/manifest.toml` **Rationale:** - Version-controlled for tracking - Centralized installation metadata - Easy to query installation state - Clear audit trail --- ## 9. Security Considerations ### 9.1 Configuration File Permissions ```bash # Config files should be readable by user only chmod 600 ~/.config/core/*.toml # Data directories should be user-writable chmod 700 ~/.local/share/core/ ``` ### 9.2 Wrapper Script Security ```bash # Wrapper scripts should not be world-writable chmod 755 ~/.cargo/bin/workspace # Binaries should not be world-writable chmod 755 ~/.cargo/bin/workspace.real ``` ### 9.3 Environment Variable Injection **Risk:** Wrapper script loads untrusted configs **Mitigation:** 1. Validate TOML syntax before loading 2. Check file ownership (must be current user) 3. Validate required fields before use 4. Reject unknown configuration keys (strict mode) ### 9.4 Database Access **Risk:** Database path from config could point to sensitive files **Mitigation:** 1. Validate database path is within `~/.local/share/core/` 2. Check database file permissions 3. Require explicit user approval for non-standard paths --- ## 10. Examples ### 10.1 User Installation Workflow ```bash # 1. Install all targets $ just scripts-install 🔨 Installing syntaxis binaries... ✅ workspace: Installed successfully ✅ syntaxis-tui: Installed successfully ✅ syntaxis-api: Installed successfully 📋 Configurations deployed to: ~/.config/core/ └── syntaxis-api.toml └── features/ ├── auth.toml ├── database.toml ├── ... # 2. Check installation $ just scripts-status 📊 Installation Status ✅ workspace (CLI) - Installed ✅ syntaxis-tui (TUI) - Installed ✅ syntaxis-api (API) - Installed (WIP) # 3. Verify wrapper works $ workspace --version syntaxis v0.1.0 Config loaded from: ~/.config/core/syntaxis-api.toml Data directory: ~/.local/share/core/ # 4. Edit configuration $ nano ~/.config/core/syntaxis-api.toml # 5. Restart to apply changes $ syntaxis-api ✅ Config validated ✅ Features loaded: auth, database, metrics ✅ Server listening on 0.0.0.0:8080 ``` ### 10.2 Configuration Discovery at Runtime ```rust // Inside binary (syntaxis-api or similar) use std::env; use std::path::PathBuf; fn load_config() -> Result { // 1. Check explicit environment variable if let Ok(path) = env::var("WORKSPACE_CONFIG_PATH") { return load_from_path(&path); } // 2. Use WORKSPACE_CONFIG_DIR (set by wrapper) let config_dir = env::var("WORKSPACE_CONFIG_DIR") .unwrap_or_else(|_| get_default_config_dir()); // 3. Try standard locations let candidates = vec![ PathBuf::from(&config_dir).join("syntaxis-api.toml"), PathBuf::from(&config_dir).join("default.toml"), PathBuf::from(env::current_dir()?).join("syntaxis-api.toml"), ]; for path in candidates { if path.exists() { return load_from_path(&path); } } Err("No configuration found".into()) } ``` --- ## 11. Files to Create/Modify ### Create New Files - [ ] `scripts/install-targets.nu` - Enhanced installation with configs & wrappers - [ ] `scripts/deploy-configs.nu` - Configuration deployment script - [ ] `scripts/create-wrappers.nu` - Wrapper script generator - [ ] `syntaxis/configs/features/projects.toml.template` - [ ] `syntaxis/configs/features/tasks.toml.template` - [ ] `syntaxis/configs/features/phases.toml.template` - [ ] `syntaxis/configs/features/audit.toml.template` - [ ] `docs/installation-guide.md` - User-facing installation documentation - [ ] `docs/configuration.md` - Configuration management guide - [ ] `WRAPPER_DESIGN.md` - Technical wrapper documentation ### Modify Existing Files - [ ] `scripts/install-cli.nu` - Add config deployment - [ ] `scripts/manifest.nu` - Add config registration - [ ] `syntaxis/syntaxis-api-config.template.toml` → `syntaxis-api-config.template.toml` - [ ] `Justfile` - Add installation targets recipe - [ ] `shared/rust-api/shared-api-lib/src/config/mod.rs` - Integrate find-config ### Update Documentation - [ ] README.md - Add installation instructions - [ ] syntaxis/README.md - Add wrapper documentation - [ ] .claude/ guidelines - Add installation best practices --- ## 12. Summary ### Current State - ✅ Basic binary installation working - ✅ Manifest tracking available - ✅ Config discovery system exists - ❌ Configs not deployed with binaries - ❌ No wrapper scripts - ❌ No environment setup at runtime ### Target State (After Implementation) - ✅ Complete binary installation with configs - ✅ Wrapper scripts setup environment - ✅ Configuration validation - ✅ Environment variable management - ✅ Standardized installation locations - ✅ Easy configuration management - ✅ Installation verification ### Next Steps 1. Review this document with team 2. Confirm design decisions 3. Begin Phase 1 (configuration deployment) 4. Follow phased roadmap 5. Write integration tests as work progresses --- **Document Version:** 1.0 **Status:** Design Review Ready **Last Updated:** November 15, 2025