#!/usr/bin/env bash # --------------------------------------------------------------------------- # Dev stack setup for `yarn dev` # --------------------------------------------------------------------------- # Sets this worktree's slot and ports (see scripts/slots.sh for the scheme), # then prepares its dev stack: clears stale Next.js output, registers the slot # with the dev portal, and archives its logs on exit. # # Only source this when starting or stopping the stack. Tools that just need # the ports should use scripts/with-slots.sh, which has no side effects. # # Usage: # source scripts/dev-env.sh # export env vars into current shell # . scripts/dev-env.sh # same thing, POSIX style # # Override the slot manually: # HDX_DEV_SLOT=5 . scripts/dev-env.sh # --------------------------------------------------------------------------- # shellcheck source=./slots.sh . "${BASH_SOURCE[0]%/*}/slots.sh" hdx_dev_ports # Git metadata for portal labels HDX_DEV_BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')" HDX_DEV_WORKTREE="$(basename "$PWD")" # --- Shared NX build cache across all worktrees --- # NX cache is content-hash based so changed files get cache misses (correct # behavior). Unchanged packages reuse cached output regardless of worktree. NX_CACHE_DIRECTORY="${HOME}/.config/hyperdx/nx-cache" mkdir -p "$NX_CACHE_DIRECTORY" export HDX_DEV_BRANCH export HDX_DEV_WORKTREE export NX_CACHE_DIRECTORY # --- Clean up stale Next.js state from previous sessions --- # Nuke the entire .next directory to avoid stale webpack bundles, lock files, # and cached module resolutions after common-utils rebuilds. rm -rf "${PWD}/packages/app/.next" 2>/dev/null || true # --- Set up directories for portal discovery + logs --- HDX_DEV_SLOTS_DIR="${HOME}/.config/hyperdx/dev-slots" HDX_DEV_LOGS_DIR="${HDX_DEV_SLOTS_DIR}/${HDX_DEV_SLOT}/logs" mkdir -p "$HDX_DEV_LOGS_DIR" export HDX_DEV_SLOTS_DIR export HDX_DEV_LOGS_DIR cat > "${HDX_DEV_SLOTS_DIR}/${HDX_DEV_SLOT}.json" </dev/null; then kill "$HDX_PORTAL_PID" 2>/dev/null || true fi rm -f "${HDX_DEV_SLOTS_DIR}/${HDX_DEV_SLOT}.json" 2>/dev/null || true # Archive logs to history instead of deleting if [ -d "$HDX_DEV_LOGS_DIR" ] && [ -n "$(ls -A "$HDX_DEV_LOGS_DIR" 2>/dev/null)" ]; then _ts=$(date -u +%Y-%m-%dT%H:%M:%SZ) _hist="${HDX_DEV_SLOTS_DIR}/${HDX_DEV_SLOT}/history/dev-${_ts}" mkdir -p "$_hist" mv "$HDX_DEV_LOGS_DIR"/* "$_hist/" 2>/dev/null || true cat > "$_hist/meta.json" </dev/null || true } trap _hdx_cleanup_slot EXIT # Print summary echo "╔══════════════════════════════════════════════════════════════╗" echo "║ HyperDX Dev Environment — Slot ${HDX_DEV_SLOT}$(printf '%*s' $((27 - ${#HDX_DEV_SLOT})) '')║" echo "╠══════════════════════════════════════════════════════════════╣" echo "║ Branch: ${HDX_DEV_BRANCH}$(printf '%*s' $((45 - ${#HDX_DEV_BRANCH})) '')║" echo "║ Worktree: ${HDX_DEV_WORKTREE}$(printf '%*s' $((45 - ${#HDX_DEV_WORKTREE})) '')║" echo "╠══════════════════════════════════════════════════════════════╣" echo "║ App (Next.js) http://localhost:${HYPERDX_APP_PORT}$(printf '%*s' $((22 - ${#HYPERDX_APP_PORT})) '')║" echo "║ API http://localhost:${HYPERDX_API_PORT}$(printf '%*s' $((22 - ${#HYPERDX_API_PORT})) '')║" echo "║ ClickHouse http://localhost:${HDX_DEV_CH_HTTP_PORT}$(printf '%*s' $((22 - ${#HDX_DEV_CH_HTTP_PORT})) '')║" echo "║ MongoDB localhost:${HDX_DEV_MONGO_PORT}$(printf '%*s' $((29 - ${#HDX_DEV_MONGO_PORT})) '')║" echo "║ OTel HTTP http://localhost:${HDX_DEV_OTEL_HTTP_PORT}$(printf '%*s' $((22 - ${#HDX_DEV_OTEL_HTTP_PORT})) '')║" echo "║ OTel gRPC localhost:${HDX_DEV_OTEL_GRPC_PORT}$(printf '%*s' $((29 - ${#HDX_DEV_OTEL_GRPC_PORT})) '')║" echo "║ OpAMP localhost:${HYPERDX_OPAMP_PORT}$(printf '%*s' $((29 - ${#HYPERDX_OPAMP_PORT})) '')║" echo "╠══════════════════════════════════════════════════════════════╣" echo "║ Portal: http://localhost:${HDX_PORTAL_PORT}$(printf '%*s' $((28 - ${#HDX_PORTAL_PORT})) '')║" echo "╚══════════════════════════════════════════════════════════════╝"