From 46be2f321d53f1601170817caa9b7c228e060b48 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Sun, 31 May 2026 13:24:41 +0200 Subject: [PATCH] =?UTF-8?q?feat(scripts):=20opax2.sh=20=E2=80=94=20Claude?= =?UTF-8?q?=204.7=20session=20starter=20med=20auto=20handoff-prompt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/opax2.sh | 167 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 scripts/opax2.sh diff --git a/scripts/opax2.sh b/scripts/opax2.sh new file mode 100644 index 0000000..424c19e --- /dev/null +++ b/scripts/opax2.sh @@ -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"