#!/usr/bin/env nu # VAPORA Build Script # Phase 0: Build all workspace crates # Follows NUSHELL_GUIDELINES.md - 17 rules # Build a single crate def build-crate [crate_name: string, release: bool = false] { print $"Building [($crate_name)]..." let result = if $release { do { cargo build --release -p $crate_name } | complete } else { do { cargo build -p $crate_name } | complete } if ($result.exit_code == 0) { { crate: $crate_name, success: true, error: null } } else { { crate: $crate_name, success: false, error: ($result.stderr | str trim) } } } # Build all workspace crates (sequentially to avoid cargo lock conflicts) def build-all [release: bool = false] { let crates = [ "vapora-shared", "vapora-agents", "vapora-llm-router", "vapora-backend", "vapora-frontend", "vapora-mcp-server" ] $crates | reduce -f [] {|crate, results| $results | append (build-crate $crate $release) } } # Check if all builds succeeded def check-build-results [results: list] { let failures = ($results | where {|r| not $r.success }) if (($failures | length) > 0) { print "" print "=== Build Failures ===" for failure in $failures { print $"✗ ($failure.crate): ($failure.error)" } false } else { true } } # Main build function def main [ --release # Build in release mode --crate: string # Build specific crate ] { print "=== VAPORA Build ===" print "" let build_mode = if $release { "release" } else { "debug" } print $"Build mode: [($build_mode)]" print "" let results = if ($crate == null or $crate == "") { build-all $release } else { [ (build-crate $crate $release) ] } # Check results print "" let success = (check-build-results $results) if $success { print "" print "=== Build Complete ===" let success_count = ($results | length) print $"✓ ($success_count) crate(s) built successfully" } else { print "" print "Build failed" exit 1 } }