# syntaxis Provisioning System A modular, offline-first provisioning system for building, packaging, and distributing syntaxis binaries and configurations across multiple platforms. **This system focuses on LOCAL and SINGLE-MACHINE provisioning. For remote/multi-host deployment, see integration with [project-provisioning](https://github.com/Akasha/project-provisioning).** ## Overview The provisioning system is built on **modular NuShell scripts** that operate **independently** while supporting orchestrated workflows. Each component can be used standalone or combined through the `provctl` orchestrator. ### Key Features - ✅ **Service Catalog**: Central registry of all available services with metadata - ✅ **Service Discovery**: Tools to explore available services and presets - ✅ **Modular Design**: Each script can be used independently - ✅ **Offline-First**: Create self-contained bundles with all artifacts - ✅ **Multi-Platform**: Support for Linux, macOS, Windows (x86_64, ARM64) - ✅ **Configuration-Driven**: TOML-based configuration (no hardcoded values) - ✅ **Integrity Verification**: SHA256 checksums for all artifacts - ✅ **Backup & Safety**: Automatic backups before overwriting - ✅ **Manifest Tracking**: Installation tracking via TOML manifests - ✅ **Local Service Management**: Support for local service startup and monitoring ## Architecture ``` syntaxis/ ├── configs/ │ ├── services-catalog.toml ← Central service registry (NEW) │ ├── installation.toml ← Presets and local config │ └── provisioning/services/ ← Service definitions │ └── scripts/provisioning/ ├── service-catalog.nu ← Service discovery tool (NEW) ├── pack.nu ← Create distribution bundles ├── unpack.nu ← Extract bundles ├── install.nu ← Install binaries locally ├── deploy.nu ← Deploy configurations ├── install-with-presets.nu ← Local installation with presets ├── provctl.nu ← Orchestrator for local workflows ├── common/ │ ├── platform.nu ← OS/arch detection │ ├── manifest.nu ← Manifest I/O │ └── validate.nu ← Integrity checking └── README.md ← This file ``` ## What's New: Service Catalog System **The service catalog is the bridge between syntaxis and project-provisioning.** ### Service Registry (`configs/services-catalog.toml`) Centralized specification of all syntaxis services: ```toml [service.syntaxis-api] name = "syntaxis-api" display_name = "syntaxis REST API" description = "REST API server" type = "server" [service.syntaxis-api.server] default_host = "127.0.0.1" default_port = 3000 scheme = "http" [service.syntaxis-api.usage] health_check_endpoint = "/health" examples = [ "syntaxis-api --bind 127.0.0.1:3000", "curl http://127.0.0.1:3000/health", ] ``` ### Service Discovery Tool (`scripts/provisioning/service-catalog.nu`) Explore what's available: ```bash # List all services nu scripts/provisioning/service-catalog.nu list # Get details about a service nu scripts/provisioning/service-catalog.nu info syntaxis-api # See how to use a service nu scripts/provisioning/service-catalog.nu usage syntaxis-api # Show what's in a preset nu scripts/provisioning/service-catalog.nu preset dev # View port assignments nu scripts/provisioning/service-catalog.nu ports # Export for project-provisioning nu scripts/provisioning/service-catalog.nu export staging ``` ### Why This Matters The service catalog allows: 1. **Users to discover** what services are available and how to use them 2. **Developers to understand** service dependencies and configurations 3. **project-provisioning to automatically** deploy services with correct: - Port assignments - Health checks - Resource limits - Dependencies - Startup ordering **Without hardcoding anything in project-provisioning!** ## Configuration The system is configured via `configs/provisioning.toml`. Key sections: ### Targets Define supported platforms and their properties: ```toml [targets.x86_64-unknown-linux-gnu] enabled = true os = "linux" arch = "x86_64" libc = "glibc" formats = ["tar.gz", "deb"] default_prefix = "/usr/local" ``` ### Artifacts Specify what gets included in bundles: ```toml [artifacts] binaries = [ { name = "syntaxis-cli", crate = "cli" }, { name = "syntaxis-tui", crate = "tui" }, { name = "syntaxis-api", crate = "api" }, ] configs = ["configs/provisioning.toml", "configs/database-default.toml", ...] docs = ["README.md", "docs/installation.md"] ``` ### Packaging Strategies Configure how bundles are created: ```toml [packaging.tar_gz] enabled = true format = "tar.gz" compression = "gzip" platforms = ["linux", "macos"] ``` ## Commands ### 1. pack.nu - Create Bundles Creates distribution bundles from built binaries. ```bash # Create bundle for current platform nu scripts/provisioning/pack.nu # Create for specific target nu scripts/provisioning/pack.nu --target x86_64-unknown-linux-gnu # Create with specific format nu scripts/provisioning/pack.nu --target aarch64-apple-darwin --format zip # List available targets nu scripts/provisioning/pack.nu --list-targets # Dry run nu scripts/provisioning/pack.nu --dry-run ``` **Options:** - `--target ` - Target triple (default: current platform) - `--format ` - Package format: tar.gz, zip, deb, rpm (default: tar.gz) - `--output ` - Output directory (default: dist/) - `--verify` - Verify bundle after creation - `--list-targets` - Show available targets - `--dry-run` - Preview without creating **Output:** ``` dist/ ├── syntaxis-v0.1.0-x86_64-linux.tar.gz # The bundle ├── syntaxis-v0.1.0-x86_64-linux.checksums.toml # SHA256 checksums ``` ### 2. unpack.nu - Extract Bundles Extracts and validates bundle contents. ```bash # Extract to current directory nu scripts/provisioning/unpack.nu bundle.tar.gz # Extract to specific location with verification nu scripts/provisioning/unpack.nu bundle.tar.gz --dest /tmp/syntaxis --verify # Dry run (preview) nu scripts/provisioning/unpack.nu bundle.tar.gz --dry-run ``` **Options:** - `--dest ` - Destination directory (default: current) - `--verify` - Verify checksums after extraction - `--dry-run` - Preview without extracting **Output:** ``` destination/ └── syntaxis-v0.1.0-x86_64-linux/ ├── manifest.toml ├── bin/ │ ├── syntaxis-cli │ ├── syntaxis-tui │ └── syntaxis-api ├── configs/ │ ├── provisioning.toml │ └── ... └── docs/ ├── README.md └── ... ``` ### 3. install.nu - Install Binaries Installs binaries to system from extracted bundles. ```bash # Install from extracted bundle nu scripts/provisioning/install.nu --source ./syntaxis-v0.1.0 # Install to custom prefix nu scripts/provisioning/install.nu --prefix /opt/syntaxis # Install to home directory with symlinks nu scripts/provisioning/install.nu --prefix ~/.local --create-links # Install with backup of existing binaries nu scripts/provisioning/install.nu --backup # Force overwrite without prompting nu scripts/provisioning/install.nu --force ``` **Options:** - `--source ` - Source directory containing binaries (default: bin/) - `--prefix ` - Installation prefix (default: /usr/local or ~/.local) - `--create-links` - Create symlinks in ~/.local/bin - `--backup` - Backup existing binaries before overwriting - `--force` - Force overwrite without prompting - `--dry-run` - Preview installation **Creates:** - Binaries in `/bin/` - Installation manifest in `~/.syntaxis/manifest.toml` ### 4. deploy.nu - Deploy Configurations Deploys configuration files to system. ```bash # Deploy to default location nu scripts/provisioning/deploy.nu --source ./syntaxis-bundle/configs # Deploy to custom directory nu scripts/provisioning/deploy.nu --source ./configs --config-dir /etc/syntaxis # Deploy with backup nu scripts/provisioning/deploy.nu --backup # Dry run nu scripts/provisioning/deploy.nu --dry-run ``` **Options:** - `--source ` - Source configs directory (default: configs/) - `--config-dir ` - Target location (default: ~/.config/syntaxis) - `--backup` - Backup existing configs before overwriting - `--force` - Force overwrite without prompting - `--dry-run` - Preview deployment **Creates:** - Config files in `/` - Deployment manifest in `~/.syntaxis/deployment.toml` ### 5. provctl.nu - Orchestrator Coordinates multiple provisioning operations. ```bash # Show help nu scripts/provisioning/provctl.nu help # Build a bundle nu scripts/provisioning/provctl.nu build-bundle --target x86_64-linux # Extract and install a bundle nu scripts/provisioning/provctl.nu install-bundle --bundle bundle.tar.gz # Complete setup: extract + install + deploy nu scripts/provisioning/provctl.nu full-install --bundle bundle.tar.gz --verify # Check installation status nu scripts/provisioning/provctl.nu status # List available targets nu scripts/provisioning/provctl.nu list-targets # Verify bundle integrity nu scripts/provisioning/provctl.nu verify-bundle --bundle bundle.tar.gz # Clean staging directories nu scripts/provisioning/provctl.nu clean ``` ## Workflow Examples ### Scenario 1: Build and Distribute Bundle (Developer) ```bash # 1. Create bundle for all platforms nu scripts/provisioning/pack.nu --target x86_64-unknown-linux-gnu --output dist/ nu scripts/provisioning/pack.nu --target aarch64-apple-darwin --output dist/ nu scripts/provisioning/pack.nu --target x86_64-pc-windows-msvc --output dist/ # 2. Bundles are ready in dist/ ls dist/ # → syntaxis-v0.1.0-x86_64-linux.tar.gz # → syntaxis-v0.1.0-aarch64-darwin.tar.gz # → syntaxis-v0.1.0-windows.zip ``` ### Scenario 2: Install from Bundle (User - Offline) ```bash # 1. User receives bundle: syntaxis-v0.1.0-x86_64-linux.tar.gz # 2. Option A: Step-by-step (see what's happening) nu scripts/provisioning/unpack.nu bundle.tar.gz --dest /tmp nu scripts/provisioning/install.nu --source /tmp/syntaxis-v0.1.0/bin --prefix ~/.local nu scripts/provisioning/deploy.nu --source /tmp/syntaxis-v0.1.0/configs # 3. Option B: Orchestrated (one command) nu scripts/provisioning/provctl.nu full-install --bundle bundle.tar.gz --prefix ~/.local # 4. Verify installation nu scripts/provisioning/provctl.nu status syntaxis-cli --version ``` ### Scenario 3: Deploy to Team Infrastructure ```bash # On CI/CD machine (build server) nu scripts/provisioning/pack.nu --target x86_64-linux --output releases/ # On target machines (multiple VMs/servers) for machine in server1 server2 server3; do scp releases/syntaxis-v0.1.0-x86_64-linux.tar.gz $machine:/tmp/ ssh $machine "nu provisioning/provctl.nu full-install --bundle /tmp/bundle.tar.gz" done ``` ### Scenario 4: Upgrade Existing Installation ```bash # User already has syntaxis installed # 1. Get new bundle curl -O https://releases.example.com/syntaxis-v0.2.0-x86_64-linux.tar.gz # 2. Install with backup nu scripts/provisioning/unpack.nu bundle.tar.gz --dest /tmp --verify nu scripts/provisioning/install.nu --source /tmp/syntaxis-v0.2.0/bin --backup --force nu scripts/provisioning/deploy.nu --source /tmp/syntaxis-v0.2.0/configs --backup # 3. Verify new version syntaxis-cli --version ``` ## Common Tasks ### List Available Build Targets ```bash nu scripts/provisioning/pack.nu --list-targets ``` ### Verify Bundle Integrity ```bash nu scripts/provisioning/provctl.nu verify-bundle --bundle bundle.tar.gz ``` ### Check Installation Status ```bash nu scripts/provisioning/provctl.nu status ``` ### Create Dry Run ```bash # See what would be packed nu scripts/provisioning/pack.nu --dry-run # See what would be installed nu scripts/provisioning/install.nu --dry-run # See what would be deployed nu scripts/provisioning/deploy.nu --dry-run ``` ### Find Backup Files ```bash ls -la ~/.local/bin/syntaxis-*.backup.* ls -la ~/.config/syntaxis/*.backup.* ``` ### Clean Staging Directories ```bash nu scripts/provisioning/provctl.nu clean ``` ## Manifest Files Installation tracking is done via TOML manifest files in `~/.syntaxis/`: ### Installation Manifest `~/.syntaxis/manifest.toml` - Created by `install.nu`: ```toml [installation] timestamp = "2025-11-17T12:00:00Z" prefix = "~/.local" version = "0.1.0" [[binaries]] name = "syntaxis-cli" installed_at = "2025-11-17T12:00:00Z" [[binaries]] name = "syntaxis-tui" installed_at = "2025-11-17T12:00:00Z" [[binaries]] name = "syntaxis-api" installed_at = "2025-11-17T12:00:00Z" ``` ### Deployment Manifest `~/.syntaxis/deployment.toml` - Created by `deploy.nu`: ```toml [deployment] timestamp = "2025-11-17T12:00:05Z" config_dir = "~/.config/syntaxis" version = "0.1.0" [[configs]] name = "provisioning.toml" deployed_at = "2025-11-17T12:00:05Z" ``` ## Bundle Structure ### Bundle Layout ``` syntaxis-v0.1.0-x86_64-linux/ ├── manifest.toml # Bundle metadata ├── bin/ # Compiled binaries │ ├── syntaxis-cli │ ├── syntaxis-tui │ └── syntaxis-api ├── configs/ # Configuration files │ ├── provisioning.toml │ ├── database-default.toml │ ├── cli/ │ │ └── syntaxis-cli.toml │ ├── tui/ │ │ └── syntaxis-tui.toml │ └── api/ │ ├── syntaxis-api.toml │ └── features/ ├── docs/ # Documentation (offline) │ ├── README.md │ ├── docs/installation.md │ └── CLAUDE.md └── scripts/ # Helper scripts (optional) └── install.sh # Bash installer ``` ### Bundle Manifest `manifest.toml` inside bundle: ```toml [bundle] version = "0.1.0" target = "x86_64-unknown-linux-gnu" created_at = "2025-11-17T12:00:00Z" format = "tar.gz" [artifacts] binaries = ["syntaxis-cli", "syntaxis-tui", "syntaxis-api"] configs = ["provisioning.toml", "database-default.toml", ...] docs = ["README.md", "docs/installation.md", "CLAUDE.md"] [checksums] "bin/syntaxis-cli" = "sha256:abcd1234..." "bin/syntaxis-tui" = "sha256:efgh5678..." "bin/syntaxis-api" = "sha256:ijkl9012..." ``` ## Utility Modules (common/) ### platform.nu Functions for platform detection: ```nushell # Detect current OS detect-os # → "linux", "macos", "windows" # Detect current architecture detect-arch # → "x86_64", "aarch64" # Map to cargo target triple current-target # → "x86_64-unknown-linux-gnu" # Check if target is available is-target-enabled target config_file # List all available targets list-targets config_file # Get supported formats for a target target-formats target config_file ``` ### manifest.nu Functions for manifest handling: ```nushell # Load manifest from file load manifest_file # → record # Create new manifest create version target format # Add checksums add-checksums manifest checksums_map # Verify checksums verify-checksums manifest bundle_dir # Validate manifest structure validate manifest # Save manifest to file save manifest manifest_file # Show manifest information info manifest_file ``` ### validate.nu Functions for integrity checking: ```nushell # Calculate SHA256 checksum sha256 file_path # Generate checksums for directory generate-checksums source_dir # Verify single file verify-file-checksum file_path expected_checksum # Verify all checksums verify-checksums checksums_file bundle_dir # Validate bundle structure validate-bundle-structure bundle_file # Validate directory permissions validate-permissions target_dir --write true ``` ## Environment Variables Scripts respect these environment variables: - `SYNTAXIS_CONFIG_DIR` - Configuration directory (default: ~/.config/syntaxis) - `SYNTAXIS_DATA_DIR` - Data directory (default: ~/.local/share/syntaxis) - `PROVISIONING_CONFIG` - Path to provisioning.toml (default: configs/provisioning.toml) ## Error Handling All scripts provide clear error messages: ```bash # Invalid target Error: Unsupported combination: os=linux, arch=arm64, libc=custom # Missing files Error: Bundle file not found: ./bundle.tar.gz # Permission denied Error: Cannot write to /usr/local/bin: insufficient permissions # Checksum mismatch Error: Checksum verification failed: - bin/syntaxis-cli: mismatch ``` ## Future Enhancements - [ ] Convert scripts to Rust binaries for performance - [ ] Homebrew formula support - [ ] Debian/RPM package generation - [ ] Docker image distribution - [ ] Auto-update mechanism - [ ] Telemetry and analytics - [ ] Signed releases (GPG) - [ ] Incremental/delta updates ## Troubleshooting ### Bundle creation fails ```bash # Check that binaries are built cargo build --release # Verify provisioning.toml nu scripts/provisioning/pack.nu --dry-run # Check available targets nu scripts/provisioning/pack.nu --list-targets ``` ### Installation fails ```bash # Check permissions ls -la ~/.local/bin/ # Try with sudo (not recommended) sudo nu scripts/provisioning/install.nu --prefix /usr/local # Check manifests cat ~/.syntaxis/manifest.toml ``` ### Configuration deployment fails ```bash # Check source directory ls -la configs/ # Try dry run nu scripts/provisioning/deploy.nu --dry-run # Check target permissions ls -la ~/.config/ ``` ## Contributing To extend the provisioning system: 1. **Add new command**: Create `new-command.nu` in `scripts/provisioning/` 2. **Add utilities**: Add functions to `common/` modules 3. **Update config**: Add sections to `configs/provisioning.toml` 4. **Update provctl**: Add action to `provctl.nu` 5. **Document**: Update this README with examples ## License Part of the syntaxis project. See LICENSE for details. --- **Last Updated**: 2025-11-17 **Status**: MVP - Core functionality complete **Next**: Additional package format support (deb, rpm, brew)