#!/usr/bin/env bash # ensure-typedialog.sh # Ensures TypeDialog is installed and available in PATH # Used by setup commands and scripts that depend on TypeDialog # # Usage: # source ensure-typedialog.sh # Load as functions # ensure_typedialog_installed # Check and install if needed # ensure_typedialog_component tui # Ensure specific component set -euo pipefail # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" INSTALLER_SCRIPT="${SCRIPT_DIR}/install-typedialog.sh" # ============================================================================ # Helper Functions # ============================================================================ print_info() { echo -e "${BLUE}ℹ️ $1${NC}" >&2 } print_success() { echo -e "${GREEN}✅ $1${NC}" >&2 } print_warning() { echo -e "${YELLOW}⚠️ $1${NC}" >&2 } print_error() { echo -e "${RED}❌ $1${NC}" >&2 } check_command() { command -v "$1" &> /dev/null } # ============================================================================ # TypeDialog Installation Checks # ============================================================================ ensure_typedialog_installed() { local force=${1:-false} if check_command "typedialog"; then local version=$(typedialog --version 2>/dev/null | head -1) print_success "TypeDialog available ($version)" return 0 fi if [[ "$force" == "true" ]]; then print_warning "TypeDialog not found - installing..." if [[ ! -f "$INSTALLER_SCRIPT" ]]; then print_error "TypeDialog installer not found at: $INSTALLER_SCRIPT" return 1 fi # Run installer if bash "$INSTALLER_SCRIPT" --components all --skip-validation 2>&1 | grep -E "(✅|❌|⚠️)" >&2; then if check_command "typedialog"; then print_success "TypeDialog installed successfully" return 0 else print_error "Installation completed but typedialog not in PATH" return 1 fi else print_error "TypeDialog installation failed" return 1 fi else print_warning "TypeDialog not found (--force to install)" return 1 fi } ensure_typedialog_component() { local component=$1 local component_binary="typedialog" case "$component" in cli) component_binary="typedialog" ;; tui) component_binary="typedialog-tui" ;; web) component_binary="typedialog-web" ;; ag) component_binary="typedialog-ag" ;; ai) component_binary="typedialog-ai" ;; prov-gen) component_binary="typedialog-prov-gen" ;; *) print_error "Unknown component: $component" return 1 ;; esac if check_command "$component_binary"; then local version=$("$component_binary" --version 2>/dev/null | head -1 || echo "unknown") print_success "TypeDialog $component available ($version)" return 0 else print_warning "TypeDialog $component not available" return 1 fi } ensure_typedialog_backends() { local required_backends=${1:-"cli"} # Default to CLI print_info "Checking required backends: $required_backends" IFS=',' read -ra backends <<< "$required_backends" local missing=() for backend in "${backends[@]}"; do backend=$(echo "$backend" | xargs) # trim if ! ensure_typedialog_component "$backend"; then missing+=("$backend") fi done if [[ ${#missing[@]} -gt 0 ]]; then print_warning "Missing backends: ${missing[*]}" return 1 fi print_success "All required backends available" return 0 } # ============================================================================ # Version Checking # ============================================================================ check_typedialog_version() { if ! check_command "typedialog"; then print_error "TypeDialog not installed" return 1 fi local installed=$(typedialog --version 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "unknown") local required=$(grep -A 2 'name = "typedialog"' "${PROJECT_ROOT}/core/versions.ncl" 2>/dev/null | grep 'current = "' | sed 's/.*current = "\([^"]*\)".*/\1/' || echo "unknown") echo "$installed" if [[ "$installed" == "$required" ]] || [[ "$required" == "unknown" ]]; then return 0 fi print_warning "Version mismatch: installed=$installed, expected=$required" return 1 } # ============================================================================ # Main Entry Point (when run as script) # ============================================================================ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then # Script mode case "${1:-check}" in check) ensure_typedialog_installed false ;; install|ensure) ensure_typedialog_installed true ;; component) ensure_typedialog_component "${2:-cli}" ;; backends) ensure_typedialog_backends "${2:-cli}" ;; version) check_typedialog_version ;; help) cat <