#!/usr/bin/env bash # scripts/install.sh — Lumina staged installer # # Runs install stages S0b–S5. # # Usage: # ./scripts/install.sh # run all implemented stages (S0b–S5) # ./scripts/install.sh --stage s1 # run only S1 # ./scripts/install.sh --stage s3-s5 # run S3 through S5 # ./scripts/install.sh --help # # All stages are idempotent. Re-running is safe. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # Source shared helpers # shellcheck source=lib/common.sh source "$SCRIPT_DIR/lib/common.sh" # ── Usage ────────────────────────────────────────────────────────────────── usage() { cat < Run only the specified stage or range --help Show this help Stages: S0b Docker install-if-missing (bootstrap) S1 Repository environment (.env) S2 Model + vision configuration + smoke test S3 Stack alignment (compose documentation; no-op on attach) S4 Sandbox verification or onboard (attach mode default) S5 Policy overlays + skills sync All stages are idempotent. Examples: $(basename "$0") # run S0b → S1 → S2 → S3 → S4 → S5 $(basename "$0") --stage s1 # run only S1 (env) $(basename "$0") --stage s5 # run only S5 (policy + skills) $(basename "$0") --stage s3-s5 # run S3 → S4 → S5 EOF } # ── Parse args ───────────────────────────────────────────────────────────── SINGLE_STAGE="" while [[ $# -gt 0 ]]; do case "$1" in --help|-h) usage; exit 0 ;; --stage) shift SINGLE_STAGE="${1:-}" if [[ -z "$SINGLE_STAGE" ]]; then log_error "--stage requires a value" exit 1 fi shift ;; *) log_error "Unknown argument: $1" usage exit 1 ;; esac done # ── Stage runners ────────────────────────────────────────────────────────── run_s0b() { log_section "S0b: Docker bootstrap" bash "$SCRIPT_DIR/bootstrap.sh" } run_s1() { bash "$SCRIPT_DIR/install/s1-env.sh" } run_s2() { bash "$SCRIPT_DIR/install/s2-models.sh" } run_s3() { log_section "S3: Stack alignment" log_info "OpenShell manages the Hermes sandbox container." log_info "Product compose (deploy/compose/) is optional for local MCP/webhooks." log_info "No action needed for UAT attach path." } run_s4() { bash "$SCRIPT_DIR/install/s4-sandbox.sh" } run_s5() { bash "$SCRIPT_DIR/install/s5-policy-skills.sh" } # ── Main ─────────────────────────────────────────────────────────────────── log_section "Lumina installer (stages S0b–S5)" warn_if_root if [[ -n "$SINGLE_STAGE" ]]; then case "$SINGLE_STAGE" in s0b) run_s0b ;; s1) run_s1 ;; s2) run_s2 ;; s3) run_s3 ;; s4) run_s4 ;; s5) run_s5 ;; s3-s5) run_s3; run_s4; run_s5 ;; *) log_error "Unknown stage: $SINGLE_STAGE" log_error "Valid stages: s0b, s1, s2, s3, s4, s5, s3-s5" exit 1 ;; esac else # Run all implemented stages in order run_s0b run_s1 run_s2 run_s3 run_s4 run_s5 fi log_section "Install complete (S0b–S5)" log_info "Next steps:" log_info " - Review .env for correctness" log_info " - Verify policy: nemohermes $(get_sandbox_name) policy-list" log_info " - Continue with S6 (doctor) when implemented" log_info " - See docs/INSTALL.md for full procedure"