#!/usr/bin/env bash set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" runtime_root="$repo_root/tools/gitnexus/runtime" runtime_gitnexus="$runtime_root/gitnexus" runtime_shared="$runtime_root/gitnexus-shared" retained_root="${HYPERTWIST_GITNEXUS_SOURCE_ROOT:-$repo_root/mirrors/GitNexus}" retained_gitnexus="$retained_root/gitnexus" retained_shared="$retained_root/gitnexus-shared" usage() { cat <<'EOF' Usage: scripts/bootstrap-hypertwist-gitnexus.sh [--if-missing] Materializes a HyperTwist-owned GitNexus runtime under tools/gitnexus/runtime/ from the retained GitNexus working reference. Behavior: - copies gitnexus + gitnexus-shared into the local runtime landing zone - removes copied node_modules so host-correct native dependencies are rebuilt - installs gitnexus-shared first, then gitnexus, while intentionally skipping the retained root prepare rebuild because HyperTwist only needs the shipped CLI plus host-correct dependency payloads - runs npm rebuild afterward so native dependency hooks refresh for the current host without forcing a fresh retained-source TypeScript compile - verifies that @ladybugdb/core loads successfully before declaring success Options: --if-missing exits early only when the repo-owned runtime is already usable; otherwise repairs/rebuilds it in place EOF } probe_runtime() { local runtime_dir="$1" local cli_path="$runtime_dir/dist/cli/index.js" if [[ ! -f "$cli_path" ]]; then return 1 fi local probe_output="" local probe_exit=0 set +e probe_output="$( cd "$runtime_dir" && node --input-type=module -e 'try { await import("@ladybugdb/core"); } catch (error) { const code = error?.code ? `${error.code}: ` : ""; const message = error?.message || String(error); console.error(`${code}${message}`); process.exit(1); }' 2>&1 )" probe_exit=$? set -e if [[ "$probe_exit" -eq 0 ]]; then return 0 fi probe_output="${probe_output//$'\n'/ }" echo "Repo-owned GitNexus runtime is not usable yet (${probe_output})." >&2 return 1 } copy_runtime_sources() { if [[ ! -d "$retained_gitnexus" || ! -d "$retained_shared" ]]; then cat >&2 </dev/null 2>&1; then echo "npm is required to bootstrap the repo-owned GitNexus runtime." >&2 exit 1 fi echo "Bootstrapping repo-owned GitNexus runtime under $runtime_root" echo "Installing gitnexus-shared dependencies..." (cd "$runtime_shared" && npm install --legacy-peer-deps --no-fund --no-audit --ignore-scripts) echo "Installing gitnexus dependencies..." (cd "$runtime_gitnexus" && npm install --legacy-peer-deps --no-fund --no-audit --ignore-scripts) echo "Rebuilding GitNexus native/runtime dependencies for this host..." (cd "$runtime_gitnexus" && npm rebuild --legacy-peer-deps --no-fund --no-audit) } if [[ "${1:-}" == "--help" ]]; then usage exit 0 fi if [[ "${1:-}" == "--if-missing" ]]; then if probe_runtime "$runtime_gitnexus" >/dev/null 2>&1; then printf 'Repo-owned GitNexus runtime already present under %s\n' "$runtime_root" exit 0 fi elif [[ $# -gt 0 ]]; then usage >&2 exit 1 fi copy_runtime_sources install_runtime if ! probe_runtime "$runtime_gitnexus"; then echo "Repo-owned GitNexus runtime bootstrap finished, but the runtime probe still failed." >&2 exit 1 fi printf 'Repo-owned GitNexus runtime is ready under %s\n' "$runtime_root"