feat(scripts): opax2.sh — Claude 4.7 session starter med auto handoff-prompt

This commit is contained in:
chrischristiansen-glitch 2026-05-31 13:24:41 +02:00
parent 6f8bd98013
commit 46be2f321d

167
scripts/opax2.sh Normal file
View File

@ -0,0 +1,167 @@
#!/usr/bin/env bash
# =============================================================================
# OPAX2.SH — Claude 4.7 session starter
#
# Bruk: source ~/OSVauco/scripts/opax2.sh
# Alias: opax2
#
# Forskjell fra opax:
# - Bruker Claude Opus 4.7 via Vertex AI EU endpoint
# - Mater inn handoff til claude automatisk ved oppstart
# - Region: europe-west1
# =============================================================================
OSVAUCO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
export GOOGLE_CLOUD_PROJECT="propane-will-491900-m5"
export GOOGLE_CLOUD_LOCATION="europe-west1"
export VERTEX_AI_ENDPOINT="eu"
export CLAUDE_MODEL="claude-opus-4-7@20260301"
HANDOFF_FILE="$OSVAUCO_DIR/docs/HANDOFF_20260531_claude47.md"
GREEN="$(tput setaf 2 2>/dev/null || printf '\033[0;32m')"
RED="$(tput setaf 1 2>/dev/null || printf '\033[0;31m')"
YELLOW="$(tput setaf 3 2>/dev/null || printf '\033[1;33m')"
CYAN="$(tput setaf 6 2>/dev/null || printf '\033[0;36m')"
MAGENTA="$(tput setaf 5 2>/dev/null || printf '\033[0;35m')"
WHITE="$(tput setaf 7 2>/dev/null || printf '\033[1;37m')"
DIM="$(tput dim 2>/dev/null || printf '\033[2m')"
BOLD="$(tput bold 2>/dev/null || printf '\033[1m')"
NC="$(tput sgr0 2>/dev/null || printf '\033[0m')"
OK="✔"
FAIL="✗"
SKIP="▷"
run_check() {
local description="$1"
local command_to_run="$2"
local error_message="$3"
local is_critical="${4:-false}"
printf " %-42s" "$description"
if eval "$command_to_run" &>/dev/null; then
printf "${GREEN}${OK} OK${NC}\n"
else
printf "${RED}${FAIL} FAIL${NC}\n"
if [[ "$is_critical" == "true" ]]; then
printf "\n ${RED}${BOLD}KRITISK:${NC} ${error_message}\n"
printf " ${YELLOW}Avbryter opax2-oppstart.${NC}\n\n"
return 1
else
printf " ${YELLOW}${NC} ${error_message}\n"
fi
fi
}
clear
printf "${MAGENTA}"
cat << 'LOGO'
___ _____ _ _ _ _ ___
/ _ \| _ || | | || \ | ||_ |
| | | | |_) || |__| || \| | | |
| | | | __/ | __ || . ` | | |
| |_| | | | | | || |\ | _| |_
\___/|_| |_| |_||_| \_||_____|
LOGO
printf "${NC}"
printf "${DIM} --------------------------------------------------${NC}\n"
printf " ${MAGENTA}OPAX2${NC} ${DIM}Claude 4.7 · Vertex AI EU · ${GOOGLE_CLOUD_PROJECT}${NC}\n"
printf "${DIM} --------------------------------------------------${NC}\n\n"
printf "${BOLD}${WHITE} Preflight...${NC}\n"
run_check "gcloud user authenticated" \
"gcloud auth list --filter=status:ACTIVE --format='value(account)' | grep -q @" \
"Kjør: gcloud auth login" \
true
run_check "ADC tilgjengelig" \
"gcloud auth application-default print-access-token --quiet" \
"Kjør: gcloud auth application-default login" \
true
run_check "GCP project = $GOOGLE_CLOUD_PROJECT" \
"[[ \$(gcloud config get-value project 2>/dev/null) == '$GOOGLE_CLOUD_PROJECT' ]]" \
"Kjør: gcloud config set project $GOOGLE_CLOUD_PROJECT" \
true
run_check "GitHub remote tilgjengelig" \
"git -C '$OSVAUCO_DIR' ls-remote --exit-code origin" \
"Kan ikke nå git remote" \
true
# Vertex AI EU endpoint sjekk
TOKEN=$(gcloud auth print-access-token 2>/dev/null || echo "")
run_check "Vertex AI EU endpoint nåbar" \
"curl -sf -o /dev/null -H 'Authorization: Bearer ${TOKEN}' \
'https://eu-aiplatform.googleapis.com/v1/projects/${GOOGLE_CLOUD_PROJECT}/locations/eu/publishers/anthropic/models'" \
"Sjekk Vertex AI EU tillatelser / Model Garden aktivering"
# Cloud Run sjekk (europe-west1)
CR_URL="https://osvauco-agent-357036551735.europe-west1.run.app"
IT=$(gcloud auth print-identity-token 2>/dev/null || echo "")
CR_HTTP=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $IT" \
"$CR_URL/health" 2>/dev/null || echo "000")
if [[ "$CR_HTTP" == "200" ]]; then
printf " %-42s${GREEN}${OK} OK${NC} (HTTP $CR_HTTP)\n" "Cloud Run osvauco-agent"
else
printf " %-42s${YELLOW}⚠ HTTP $CR_HTTP${NC}\n" "Cloud Run osvauco-agent"
printf " ${DIM}Direkte URL: $CR_URL${NC}\n"
fi
# opax.vauco.no IAP sjekk
DOMAIN_HTTP=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $IT" \
"https://opax.vauco.no/health" 2>/dev/null || echo "000")
if [[ "$DOMAIN_HTTP" == "200" ]]; then
printf " %-42s${GREEN}${OK} OK${NC} (HTTP $DOMAIN_HTTP)\n" "opax.vauco.no (IAP)"
else
printf " %-42s${YELLOW}▷ HTTP $DOMAIN_HTTP${NC} ${DIM}(Fase 8: verifiser IAP)${NC}\n" "opax.vauco.no (IAP)"
fi
printf "\n${MAGENTA}${BOLD}✦ OPAX2 klar — Claude 4.7 · europe-west1${NC}\n\n"
# --- Handoff-prompt ---
printf "${DIM} --------------------------------------------------${NC}\n"
printf "${BOLD} HANDOFF\n${NC}"
if [[ -f "$HANDOFF_FILE" ]]; then
printf " ${GREEN}${OK}${NC} ${DIM}$HANDOFF_FILE${NC}\n"
printf " Sende handoff til Claude nå? [Y/n]: "
read -r ANSWER
case "$ANSWER" in
n|N)
printf " ${DIM}Hopper over — kjør manuelt: claude < $HANDOFF_FILE${NC}\n\n"
;;
*)
printf " ${DIM}Starter Claude 4.7 med handoff...${NC}\n\n"
if command -v claude &>/dev/null; then
cd "$OSVAUCO_DIR"
# Sender handoff som første melding, så Claude leser kontekst før du skriver noe
BOOT_MSG=$(cat "$HANDOFF_FILE")
cat << EOF | claude
$BOOT_MSG
---
Du har nå lest handoff. Print en kort oppsummering (maks 5 linjer) av hva du forstår er status og neste steg. Ikke gjør noe annet. Vent på Chris sin godkjenning.
EOF
else
printf " ${RED}${FAIL}${NC} claude CLI ikke funnet.\n"
printf " ${DIM}Installer: npm install -g @anthropic-ai/claude-code${NC}\n\n"
fi
;;
esac
else
printf " ${YELLOW}${NC} Handoff ikke funnet: $HANDOFF_FILE\n\n"
fi
# --- Miljø og prompt ---
cd "$OSVAUCO_DIR" 2>/dev/null || true
export PS1="\[${MAGENTA}\]┌──(\[${CYAN}\]OPAX2:\[${BOLD}\]\w\[${NC}\])\[${NC}\]\n\[${MAGENTA}\]└─▪\[${NC}\] "
export OPAX2_LOADED=true
printf "${BOLD}${WHITE}QUICK COMMANDS${NC}\n"
printf " ${MAGENTA}%-8s${NC} %s\n" "hc" "health-check"
printf " ${MAGENTA}%-8s${NC} %s\n" "st" "smoke-test"
printf " ${MAGENTA}%-8s${NC} %s\n" "ca" "cost-audit"
printf " ${MAGENTA}%-8s${NC} %s\n" "sol" "avslutt + logg"
printf "\n"