diff --git a/scripts/osvauco-health-check.sh b/scripts/osvauco-health-check.sh new file mode 100644 index 0000000..e28ebf9 --- /dev/null +++ b/scripts/osvauco-health-check.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# osvauco-health-check.sh — alias 'hc' +# Viderekobler til scripts/health-check.sh +exec "$(dirname "$0")/health-check.sh" "$@" diff --git a/scripts/osvauco-opax-boot.sh b/scripts/osvauco-opax-boot.sh new file mode 100644 index 0000000..80e89d8 --- /dev/null +++ b/scripts/osvauco-opax-boot.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +# ============================================================================= +# osvauco-opax-boot.sh — OSVauco OPAX session-starter +# Bruk: source ~/OSVauco/scripts/osvauco-opax-boot.sh +# NB: Må sources (ikke bash) for PROMPT_COMMAND + opax_logg_slutt. +# ============================================================================= + +OSVAUCO_DIR="$HOME/OSVauco" +ROADMAP="$OSVAUCO_DIR/docs/VAUCO_OS_ROADMAP.md" +TODO="$OSVAUCO_DIR/docs/TODO.md" +SESSION_LOG="$OSVAUCO_DIR/docs/OSVAUCO_OPAX_SESSION_LOG.md" + +GREEN="$(tput setaf 2 || true)" +RED="$(tput setaf 1 || true)" +YELLOW="$(tput setaf 3 || true)" +CYAN="$(tput setaf 6 || true)" +BOLD="$(tput bold || true)" +DIM="\033[2m" +NC="$(tput sgr0 || true)" + +SESSION_ID="$(date '+%Y%m%d-%H%M%S')" + +# ============================================================================= +# AUTO-AUTH RENEWAL +# ============================================================================= +ADC_SCOPE_FILE="$HOME/.config/gcloud/.osvauco-adc-renewed" + +printf "${BOLD}${CYAN} [ AUTH ]${NC}\n" +if ! gcloud auth print-access-token >/dev/null 2>&1; then + printf " ${YELLOW}⚠ gcloud auth utløpt — logger inn...${NC}\n" + gcloud auth login --no-launch-browser +else + printf " ${DIM}✦ gcloud auth OK${NC}\n" +fi + +# ADC sjekk +NEED_ADC_LOGIN=0 +if ! gcloud auth application-default print-access-token >/dev/null 2>&1; then + NEED_ADC_LOGIN=1 +elif [[ -f "$ADC_SCOPE_FILE" ]]; then + if [[ $(($(date +%s) - $(stat -c %Y "$ADC_SCOPE_FILE"))) -gt 28800 ]]; then + NEED_ADC_LOGIN=1 + fi +else + NEED_ADC_LOGIN=1 +fi + +if [[ $NEED_ADC_LOGIN -eq 1 ]]; then + printf " ${YELLOW}⚠ ADC utløpt eller gammel — fornyer...${NC}\n" + gcloud auth application-default login --no-launch-browser \ + --scopes="https://www.googleapis.com/auth/cloud-platform" + touch "$ADC_SCOPE_FILE" +else + printf " ${DIM}✦ ADC OK${NC}\n" +fi +printf " ${GREEN}✦ Auth klar${NC}\n\n" + +clear + +# ============================================================================= +# BOOT UI +# ============================================================================= +printf "${CYAN}OSVauco · OPAX ❱ %s · %s${NC}\n" "$SESSION_ID" "propane-will-491900-m5" +printf "${DIM}────────────────────────────────────────────────────────────${NC}\n" + +printf "${BOLD}SERVICES${NC}\n" +check_service() { + printf " %-12s " "$1" + if eval "$2" >/dev/null 2>&1; then printf "${GREEN}✦ OK${NC}\n"; else printf "${RED}✗ FAIL${NC}\n"; fi +} +check_service "Cloud Run" "curl -s -f -H \"Authorization: Bearer $(gcloud auth print-identity-token)\" https://opax.vauco.no/health" +check_service "GitHub" "gh auth status" +check_service "Git Remote" "git -C $OSVAUCO_DIR ls-remote origin refs/heads/main" + +printf "${DIM}────────────────────────────────────────────────────────────${NC}\n" + +printf "${BOLD}SYSTEM${NC}\n" +LOAD=$(cat /proc/loadavg | awk '{print $1}') +MEM=$(free -h | grep Mem | awk '{printf "%s/%s", $3, $2}') +DISK=$(df -h / | tail -1 | awk '{print $5}') +printf " %-12s Load: %s · RAM: %s · /: %s\n" "Resources" "$LOAD" "$MEM" "$DISK" +printf " %-12s %s\n" "Uptime" "$(uptime -p | sed 's/up //')" + +printf "${DIM}────────────────────────────────────────────────────────────${NC}\n" + +printf "${BOLD}NEXT${NC}\n" +NEXT_ROADMAP=$(awk '/^## NEXT/{f=1;next} f && /^## /{f=0} f && /^- \[ \]/{print;exit}' "$ROADMAP" 2>/dev/null || true) +printf " ${GREEN}▶ %s${NC}\n" "${NEXT_ROADMAP:-Ingen oppgave i roadmap}" + +printf "${DIM}────────────────────────────────────────────────────────────${NC}\n" +printf "${BOLD}QUICK COMMANDS${NC}\n" +printf " %-4s %-12s %-4s %-12s\n" "ca" "cost-audit" "cl" "cost-lens" +printf " %-4s %-12s %-4s %-12s\n" "cg" "cost-guard" "hc" "health-check" +printf " %-4s %-12s %-4s %-12s\n" "pf" "preflight" "st" "smoke-test" +printf " %-4s %-12s %-4s %-12s\n" "rl" "roadmap" "sl" "session-log" +printf " %-4s %-12s %-4s %-12s\n" "ms" "mirror-sync" "g" "gemini" +printf " %-4s %-12s %-4s %-12s\n" "sol" "session-exit" "" "" +printf "\n── ready ── SESSION %s ──\n\n" "$SESSION_ID" + +# ============================================================================= +# NVM +# ============================================================================= +export NVM_DIR="$HOME/.nvm" +[[ -s "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh" + +# ============================================================================= +# AVSLUTT-FUNKSJON +# ============================================================================= +sol() { + printf "\n ${BOLD}${CYAN}Sesjonslogg — avslutt${NC}\n" + printf " Hva ble gjort? (LØST / ULØST)\n > " + read -r DONE_DESC + [[ -z "$DONE_DESC" ]] && DONE_DESC="(ingen notat)" + printf " Uløste problemer? (Enter for ingen)\n > " + read -r UNSOLVED + [[ -z "$UNSOLVED" ]] && UNSOLVED="ingen" + cat >> "$SESSION_LOG" << EOF + +### Sesjonsavslutning +- Gjort : $DONE_DESC +- Uløst : $UNSOLVED +- Slutt : $(date '+%Y-%m-%d %H:%M %Z') +EOF + printf " ${GREEN}[OK]${NC} Logg oppdatert\n" + cd "$OSVAUCO_DIR" + git add docs/OSVAUCO_OPAX_SESSION_LOG.md 2>/dev/null || true + if ! git diff --cached --quiet; then + git commit -m "chore(session): logg sesjon $SESSION_ID — $DONE_DESC" + git push origin main + printf " ${GREEN}[OK]${NC} Pushet → GitHub\n\n" + fi +} +export -f sol 2>/dev/null || true +alias sol='sol' + +# ============================================================================= +# GEMINI-START +# ============================================================================= +read -r -p " Starte Gemini-CLI nå? [y/N]: " ANSWER +case "$ANSWER" in + y|Y) + if ! command -v gemini &>/dev/null; then + printf " ${RED}[XX]${NC} gemini ikke funnet.\n" + else + cd "$OSVAUCO_DIR" + gemini + fi + ;; + *) + echo " OK — kjør 'gemini' når du er klar. 🚀" + ;; +esac diff --git a/scripts/preflight.sh b/scripts/preflight.sh new file mode 100644 index 0000000..043df18 --- /dev/null +++ b/scripts/preflight.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# preflight.sh — alias 'pf' +# Sjekker auth, project, .env og git status +set -euo pipefail + +GREEN="$(tput setaf 2)"; RED="$(tput setaf 1)"; YELLOW="$(tput setaf 3)"; NC="$(tput sgr0)"; BOLD="$(tput bold)" + +ok() { printf " ${GREEN}✦ OK${NC} %s\n" "$1"; } +fail() { printf " ${RED}✗ FAIL${NC} %s\n" "$1"; } +warn() { printf " ${YELLOW}⚠ WARN${NC} %s\n" "$1"; } + +printf "${BOLD}OSVauco Preflight${NC}\n" +printf "────────────────────────────────\n" + +# 1. gcloud auth +if gcloud auth print-access-token >/dev/null 2>&1; then + ACCOUNT=$(gcloud auth list --filter=status:ACTIVE --format='value(account)' 2>/dev/null | head -1) + ok "gcloud auth ($ACCOUNT)" +else + fail "gcloud auth — ikke innlogget" + echo "" + echo " Kjør: gcloud auth login --no-launch-browser" + exit 1 +fi + +# 2. ADC +if gcloud auth application-default print-access-token >/dev/null 2>&1; then + ok "ADC (application-default)" +else + warn "ADC ikke satt — kjører: gcloud auth application-default login --no-launch-browser" + gcloud auth application-default login --no-launch-browser \ + --scopes="https://www.googleapis.com/auth/cloud-platform" +fi + +# 3. Prosjekt +PROJECT=$(gcloud config get-value project 2>/dev/null) +if [[ "$PROJECT" == "propane-will-491900-m5" ]]; then + ok "GCP project ($PROJECT)" +else + warn "Feil prosjekt: '$PROJECT' — setter til propane-will-491900-m5" + gcloud config set project propane-will-491900-m5 +fi + +# 4. .env +if [[ -f "$HOME/OSVauco/.env" ]]; then + ok ".env eksisterer" +else + fail ".env mangler — IKKE opprett fra .env.example" + echo " Hent fra Secret Manager:" + echo " gcloud secrets versions access latest --secret=osvauco-env --project=propane-will-491900-m5 > .env" +fi + +# 5. Git status +cd "$HOME/OSVauco" +GIT_BRANCH=$(git branch --show-current 2>/dev/null) +GIT_DIRTY=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ') +if [[ "$GIT_BRANCH" == "main" ]]; then + ok "git branch (main)" +else + warn "git branch er '$GIT_BRANCH' — forventet main" +fi +[[ "$GIT_DIRTY" -gt 0 ]] && warn "$GIT_DIRTY ustaged endringer" || ok "git working tree (rent)" + +printf "────────────────────────────────\n" +echo ""