feat(scripts): opax2.sh — Claude 4.7 session starter med auto handoff-prompt
This commit is contained in:
parent
6f8bd98013
commit
46be2f321d
167
scripts/opax2.sh
Normal file
167
scripts/opax2.sh
Normal 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"
|
||||||
Loading…
Reference in New Issue
Block a user