* chore(docs): konsolider MASTERPLAN/ROADMAP/HANDOFF til én sannhet
Bakgrunn: revisjon 2026-05-31 avdekket at vi hadde to MASTERPLAN-er som
ikke matchet, en deprecated VAUCO_OS_ROADMAP som fortsatt ble brukt, tre
parallelle HANDOFF-filer, AGENT_RULEBOOK med feil region (us-central1)
og feil MCP_SERVICE (opax-mcp-core), og committed Git merge-konflikt-
markører i selve session-loggen.
Endringer:
- Ny docs/MASTERPLAN.md (autoritativ, erstatter både rot-MASTERPLAN.md og
forrige docs-versjon). Tydeligere hierarki:
Vauco AS → Vauco OS (plattform) → OPAX (engine) → Moduler
- Ny docs/ROADMAP.md (erstatter docs/VAUCO_OS_ROADMAP.md som var deprecated)
- Ny docs/HANDOFF.md — én fil, overskrives per sesjon (per planregelen)
- Oppdatert docs/AGENT_RULEBOOK.md:
Region: us-central1 → europe-west1
AI-modell: gemini-2.5-pro (midlertidig, venter på Claude EU-kvote)
Vertex AI loc: europe-west1
MCP_SERVICE: opax-mcp-core → osvauco-agent
- Fjernet Git merge-konfliktmarkører i docs/OSVAUCO_OPAX_SESSION_LOG.md
- Flyttet HANDOFF_20260526/20260531/20260531_claude47 → docs/archive/handoffs/
- Slettet duplikat-filer i docs/archive/ (Cost_Management_Rules,
GCPBestPractices, OSVAUCO_OPAX_SESSION_LOG — alle dekket av live-filer)
- Slettet rot-MASTERPLAN.md (erstattet av peker-fil), VAUCO_OS_ROADMAP.md,
Procfile (legacy fra POC, ikke brukt av Cloud Run)
- docs/TODO.md → peker-fil mot ROADMAP
Repo-strategi (fra MASTERPLAN §3):
- 4 aktive repos: OSVauco (mono), vauco-bootstrap, threadstone-landing,
vauco-saas.github.io
- 3 arkiverte: vauco-os, vauco-gemini-tui-bridge, command-hub
- 2 parkerte (lever videre, ikke aktivt jobb): threadstone-instructions,
deep-dream — venter på hver sin trigger (Threadstone-app pilot / første
betalende kunde på CostGuard)
Etter merge: neste oppgave er F8 (browser-end-to-end på opax.vauco.no).
Co-authored-by: Perplexity <noreply@perplexity.ai>
* docs: inkorporer vauco.no salgsportal (apex) i planen
Hovedhull avdekket: vauco.no viser fortsatt Proisp 'Under construction'
placeholder. Planen manglet helt et spor for apex-siden — bedriftens
ansikt utad og portalen som leder besøkende til riktig modul.
MASTERPLAN endringer:
- §1 Plattformhierarki: utvidet fra 3 til 4 nivåer; vauco.no apex
lagt til som egen kunde-flate (over Vauco OS i hierarkiet)
- §2 Domener: vauco.no/www.vauco.no markert som placeholder (skal
erstattes), reserverte subdomener (status./docs./careers.)
dokumentert, email-infra-status notert
- §3 Repos: vauco-site lagt til som 5. aktive repo (public,
GitHub Pages — eget repo fordi sidens kildekode skal være public
mens mono-repoet må forbli privat)
- §4b NY: vauco.no salgsportal — full spec for formål, IA,
visuell retning, salgs-flow, teknisk stack, versjons-evolusjon
V1 → V4
- §11 Kjente hull: OQ-23..OQ-26 lagt til (apex-placeholder,
SPF/DKIM/DMARC, personvern/vilkår, statuspage)
ROADMAP endringer:
- NEXT-seksjon utvidet med V-spor: V1a–V1e (vauco.no MVP)
kan kjøres parallelt med CG3
- KJENTE HULL-seksjon lagt til
HANDOFF oppdatert med oppsummering av nye tillegg.
NY FIL: docs/vauco-site/DESIGN.md
- Klar-til-plukk-opp build-spec for V1 MVP
- Sidekart, copy-utkast, farger, typografi, layout, performance-mål
- DNS-tabell for å flytte vauco.no fra Proisp-parking til GitHub Pages
- SPF/DKIM/DMARC oppskrift
- Bygg-rekkefølge med konkrete gh/git-kommandoer
- Akseptkriterier for V1 APPROVED
Etter merge har vi to parallelle spor:
- Spor A: F8 (OPAX end-to-end) + CG3 (CostGuard frontend)
- Spor B: V1 (vauco.no MVP)
Begge har egne HITL gates.
* chore(scripts): konsolider boot/opax/opax2 + hotkeys + README
- boot.sh: ny daglig VM-starter (rename fra osvauco-opax-boot.sh)
* auto-fornyer gcloud auth + ADC (>8t)
* git pull current branch
* spør: opax (Gemini 2.5 Pro) / opax2 (Claude) / hopp over
* setter aliaser: pf hc st at ca cl cg costs ms logg mp rl ho rb sl osv sol
* printer NESTE OPPGAVE fra docs/HANDOFF.md
- opax.sh: region europe-west1, model gemini-2.5-pro, peker på docs/HANDOFF.md
- opax2.sh: peker på docs/HANDOFF.md (ikke arkivert handoff), advarer om kvote
- scripts/README.md: hotkey-tabell + bashrc-snippet + lock-tabell
- Slettet: scripts/archived/ (7 filer i git-historikk), osvauco-health-check.sh
* fix(scripts): OS VAUCO-header, github-status, auto-context, exit-hook
boot.sh:
- Ny header: OS VAUCO (stort) + Vauco OS subtitle
- [ REPO + GITHUB ] viser: fetch, pull, ahead/behind, uncommitted, last commit,
gh CLI auth-status, åpne PRs på branchen
- 'ghs' alias = gh pr list + gh issue list
- NESTE OPPGAVE regex case-insensitive (matcher 'NESTE OPPGAVE' og 'Neste oppgave')
opax.sh / opax2.sh:
- Ny header: OS VAUCO / OPAX (cyan) og OS VAUCO / OPAX2 (Claude) (magenta)
- Sjekker MASTERPLAN + ROADMAP + RULEBOOK + HANDOFF + gh auth i preflight
- Auto-laster RULEBOOK + MASTERPLAN + ROADMAP + HANDOFF inn i CLI som kontekst
ved oppstart (gemini -p / claude -p, fallback til stdin)
- Exit-hook: spør 'Vil du logge sesjonen nå?' når TUI avsluttes, kjører sol()
- ABSOLUTT REGEL (ingen handling uten PLAN APPROVED) injiseres i kontekst
* fix(scripts): NESTE OPPGAVE-parsing + gemini sandbox workaround
- Bytt awk(IGNORECASE) → sed-pipeline som funker på både gawk og mawk
(HANDOFF.md har '## 🔄 Neste oppgave: ...' — emoji + capitalized)
- Flytt auto-context fra /tmp/ → $OSVAUCO_DIR/.gemini/context/ og .claude/context/
Gemini CLI sandboxer alt utenfor workspace; /tmp er blokkert.
- Send relativ sti (.gemini/context/session-PID.md) til 'gemini -p @...'
- Rydd context-filer eldre enn 1 dag ved oppstart
- .gitignore: ekskluder .gemini/context/ + .claude/context/
* fix(scripts): flytt context til tmp-context/ (Gemini respekterer .gitignore)
Gemini CLI nekter å lese filer som er git-ignored. .gemini/context/ var
ignored, så context-fil ble blokkert.
- Ny mappe: tmp-context/ (innenfor workspace, ikke gitignored som dir)
- Kun session-*.md er gitignored (selve filene), ikke mappen
- tmp-context/README.md beholder mappen i git
- Ny .geminiignore: lar Gemini lese tmp-context/ men ignorerer
node_modules, .terraform, dist osv.
* fix(scripts): bytt context-filnavn til ctx-*.md (Gemini respekterer .gitignore)
Gemini CLI blokkerer enhver fil som matcher et .gitignore-mønster, selv
om den ikke er i .geminiignore. Vi hadde 'tmp-context/session-*.md' i
.gitignore som blokkerte session-PID.md.
Løsning:
- Fjern session-pattern fra .gitignore helt
- Bytt filnavn: session-$$.md → ctx-$$.md
- Mappen ryddes uansett av find -mtime +1 -delete ved hver opax-oppstart
- Kommentar i .gitignore forklarer hvorfor og hvordan skippe lokalt
* fix(scripts): start gemini/claude TUI uten -p (TUI bombet pga non-interactive mode)
Problem: 'gemini -p "..."' kjører non-interactive (svarer + avslutter) —
det er derfor TUI ikke kom opp etter at vi la til auto-context.
Løsning: Gemini CLI auto-laster .gemini/GEMINI.md ved hver TUI-start.
- Oppdaterte .gemini/GEMINI.md: model=gemini-2.5-pro (var Claude 4.6),
boot-prompt peker på MASTERPLAN/ROADMAP/HANDOFF (var slettet ROADMAP)
- opax.sh og opax2.sh: fjernet -p flag, kjører bare 'gemini'/'claude' = full TUI
- Slettet tmp-context/ (ikke nødvendig — GEMINI.md gjør jobben)
- Modellen får LOCKED DEFS automatisk fra GEMINI.md
- For full kontekst-load, skriv 'BOOT' i TUI
* chore(session): logg 20260531-153243 — git pull origin chore/consolidate-2026-05-31
* feat(opax): auto-kjør BOOT-prompt ved hver TUI-start
---------
Co-authored-by: Perplexity <noreply@perplexity.ai>
Co-authored-by: Chris Christiansen <chris.christian...@>
272 lines
11 KiB
Bash
Executable File
272 lines
11 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# boot.sh — OSVauco daily VM session-starter
|
|
#
|
|
# Bruk: source ~/OSVauco/scripts/boot.sh
|
|
# Eller legg i ~/.bashrc:
|
|
# [[ $- == *i* && -z "$OSVAUCO_BOOTED" ]] && source ~/OSVauco/scripts/boot.sh
|
|
# =============================================================================
|
|
|
|
export OSVAUCO_BOOTED=1
|
|
OSVAUCO_DIR="${OSVAUCO_DIR:-$HOME/OSVauco}"
|
|
HANDOFF="$OSVAUCO_DIR/docs/HANDOFF.md"
|
|
ROADMAP="$OSVAUCO_DIR/docs/ROADMAP.md"
|
|
MASTERPLAN="$OSVAUCO_DIR/docs/MASTERPLAN.md"
|
|
RULEBOOK="$OSVAUCO_DIR/docs/AGENT_RULEBOOK.md"
|
|
SESSION_LOG="$OSVAUCO_DIR/docs/OSVAUCO_OPAX_SESSION_LOG.md"
|
|
|
|
# Locked values (matcher docs/AGENT_RULEBOOK.md)
|
|
export GOOGLE_CLOUD_PROJECT="propane-will-491900-m5"
|
|
export GOOGLE_CLOUD_LOCATION="europe-west1"
|
|
export VERTEX_AI_LOCATION="europe-west1"
|
|
export OSVAUCO_SERVICE="osvauco-agent"
|
|
DIRECT_URL="https://osvauco-agent-357036551735.europe-west1.run.app"
|
|
DOMAIN_URL="https://opax.vauco.no"
|
|
|
|
GREEN="$(tput setaf 2 2>/dev/null || true)"
|
|
RED="$(tput setaf 1 2>/dev/null || true)"
|
|
YELLOW="$(tput setaf 3 2>/dev/null || true)"
|
|
CYAN="$(tput setaf 6 2>/dev/null || true)"
|
|
MAGENTA="$(tput setaf 5 2>/dev/null || true)"
|
|
WHITE="$(tput setaf 7 2>/dev/null || true)"
|
|
BOLD="$(tput bold 2>/dev/null || true)"
|
|
DIM="$(tput dim 2>/dev/null || true)"
|
|
NC="$(tput sgr0 2>/dev/null || true)"
|
|
|
|
SESSION_ID="$(date '+%Y%m%d-%H%M%S')"
|
|
export OSVAUCO_SESSION_ID="$SESSION_ID"
|
|
export OSVAUCO_SESSION_START="$(date '+%Y-%m-%d %H:%M %Z')"
|
|
|
|
ok() { printf " ${GREEN}✦${NC} %s\n" "$1"; }
|
|
warn() { printf " ${YELLOW}⚠${NC} %s\n" "$1"; }
|
|
fail() { printf " ${RED}✗${NC} %s\n" "$1"; }
|
|
|
|
# =============================================================================
|
|
# HEADER — OS VAUCO
|
|
# =============================================================================
|
|
clear
|
|
printf "${CYAN}${BOLD}"
|
|
cat << 'LOGO'
|
|
___ ____ __ __ _ _ _ ____ ___
|
|
/ _ \/ ___| \ \ / /_ _| | | | | |/ ___|/ _ \
|
|
| | | \___ \ \ \ / / _` | | | | | | | | | | |
|
|
| |_| |___) | \ V / (_| | |__| |_| | |___| |_| |
|
|
\___/|____/ \_/ \__,_|____|\___/ \____|\___/
|
|
LOGO
|
|
printf "${NC}${DIM} Vauco OS · Operasjonsplatform · %s${NC}\n" "$(date '+%Y-%m-%d %H:%M')"
|
|
printf "${DIM} ──────────────────────────────────────────────────────${NC}\n\n"
|
|
|
|
# =============================================================================
|
|
# 1. AUTH
|
|
# =============================================================================
|
|
printf "${BOLD}${CYAN}[ AUTH ]${NC}\n"
|
|
if ! gcloud auth print-access-token >/dev/null 2>&1; then
|
|
warn "gcloud auth utløpt — kjører login (no-browser)..."
|
|
gcloud auth login --no-launch-browser
|
|
else
|
|
ACCT=$(gcloud auth list --filter=status:ACTIVE --format='value(account)' 2>/dev/null | head -1)
|
|
ok "gcloud auth ($ACCT)"
|
|
fi
|
|
|
|
ADC_FILE="$HOME/.config/gcloud/.osvauco-adc-renewed"
|
|
NEED_ADC=0
|
|
if ! gcloud auth application-default print-access-token >/dev/null 2>&1; then
|
|
NEED_ADC=1
|
|
elif [[ ! -f "$ADC_FILE" ]] || [[ $(($(date +%s) - $(stat -c %Y "$ADC_FILE" 2>/dev/null || echo 0))) -gt 28800 ]]; then
|
|
NEED_ADC=1
|
|
fi
|
|
if [[ $NEED_ADC -eq 1 ]]; then
|
|
warn "ADC utløpt eller >8t — fornyer..."
|
|
gcloud auth application-default login --no-launch-browser \
|
|
--scopes="https://www.googleapis.com/auth/cloud-platform" && touch "$ADC_FILE"
|
|
else
|
|
ok "ADC OK"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 2. PROJECT
|
|
# =============================================================================
|
|
printf "${BOLD}${CYAN}[ PROJECT ]${NC}\n"
|
|
CURRENT_PROJ=$(gcloud config get-value project 2>/dev/null)
|
|
if [[ "$CURRENT_PROJ" != "$GOOGLE_CLOUD_PROJECT" ]]; then
|
|
gcloud config set project "$GOOGLE_CLOUD_PROJECT" >/dev/null 2>&1
|
|
warn "Satt project → $GOOGLE_CLOUD_PROJECT"
|
|
else
|
|
ok "project = $GOOGLE_CLOUD_PROJECT"
|
|
fi
|
|
ok "region = $GOOGLE_CLOUD_LOCATION (Vertex EU)"
|
|
|
|
# =============================================================================
|
|
# 3. REPO + GITHUB STATUS
|
|
# =============================================================================
|
|
printf "${BOLD}${CYAN}[ REPO + GITHUB ]${NC}\n"
|
|
if [[ -d "$OSVAUCO_DIR/.git" ]]; then
|
|
cd "$OSVAUCO_DIR"
|
|
BRANCH=$(git branch --show-current)
|
|
git fetch --quiet origin 2>/dev/null && ok "git fetch OK" || warn "git fetch feilet (offline?)"
|
|
|
|
# Pull
|
|
if git pull --ff-only origin "$BRANCH" >/dev/null 2>&1; then
|
|
ok "git pull OK (branch: $BRANCH)"
|
|
else
|
|
warn "git pull ikke fast-forward — sjekk 'git status'"
|
|
fi
|
|
|
|
# Ahead/behind
|
|
AHEAD=$(git rev-list --count "origin/$BRANCH..HEAD" 2>/dev/null || echo "?")
|
|
BEHIND=$(git rev-list --count "HEAD..origin/$BRANCH" 2>/dev/null || echo "?")
|
|
if [[ "$AHEAD" == "0" && "$BEHIND" == "0" ]]; then
|
|
ok "sync med origin/$BRANCH"
|
|
else
|
|
warn "ahead=$AHEAD behind=$BEHIND vs origin/$BRANCH"
|
|
fi
|
|
|
|
# Uncommitted
|
|
DIRTY=$(git status --porcelain | wc -l)
|
|
if [[ "$DIRTY" == "0" ]]; then
|
|
ok "working tree clean"
|
|
else
|
|
warn "$DIRTY uncommitted endringer ('git status' for liste)"
|
|
fi
|
|
|
|
# Last commit
|
|
LAST=$(git log -1 --format='%h %s (%cr)' 2>/dev/null)
|
|
printf " ${DIM}last:${NC} %s\n" "$LAST"
|
|
|
|
# gh CLI auth
|
|
if command -v gh >/dev/null 2>&1; then
|
|
if gh auth status >/dev/null 2>&1; then
|
|
GH_USER=$(gh api user --jq '.login' 2>/dev/null || echo "?")
|
|
ok "gh CLI auth ($GH_USER)"
|
|
# Open PRs på denne branchen
|
|
OPEN_PR=$(gh pr list --head "$BRANCH" --json number,title --jq '.[0] | "PR #\(.number): \(.title)"' 2>/dev/null)
|
|
[[ -n "$OPEN_PR" ]] && printf " ${DIM}pr:${NC} %s\n" "$OPEN_PR"
|
|
else
|
|
warn "gh CLI ikke autentisert — kjør: gh auth login"
|
|
fi
|
|
else
|
|
warn "gh CLI ikke installert — installer: sudo apt install gh"
|
|
fi
|
|
else
|
|
fail "Repo ikke funnet på $OSVAUCO_DIR"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 4. LOCKED DEFS
|
|
# =============================================================================
|
|
printf "${BOLD}${CYAN}[ LOCKED ]${NC}\n"
|
|
printf " ${DIM}service=${NC}%s ${DIM}lb=${NC}34.98.77.173\n" "$OSVAUCO_SERVICE"
|
|
printf " ${DIM}url=${NC}%s\n" "$DOMAIN_URL"
|
|
printf " ${DIM}direct=${NC}%s\n" "$DIRECT_URL"
|
|
|
|
# =============================================================================
|
|
# 5. NESTE OPPGAVE (matcher både "NESTE OPPGAVE" og "Neste oppgave")
|
|
# =============================================================================
|
|
printf "${BOLD}${CYAN}[ NESTE OPPGAVE ]${NC}\n"
|
|
if [[ -f "$HANDOFF" ]]; then
|
|
NEXT=$(sed -n '/^##.*[Nn]este [Oo]ppgave/,/^## /p' "$HANDOFF" | sed '1d;$d' | sed '/^$/d' | head -12)
|
|
if [[ -n "$NEXT" ]]; then
|
|
printf "${GREEN}%s${NC}\n" "$NEXT"
|
|
else
|
|
warn "Ingen 'Neste oppgave'-seksjon funnet i HANDOFF.md"
|
|
fi
|
|
else
|
|
fail "HANDOFF.md mangler: $HANDOFF"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 6. ALIASER / HOTKEYS
|
|
# =============================================================================
|
|
alias pf='source $OSVAUCO_DIR/scripts/preflight.sh'
|
|
alias hc='bash $OSVAUCO_DIR/scripts/health-check.sh'
|
|
alias st='bash $OSVAUCO_DIR/scripts/smoke-test.sh'
|
|
alias at='bash $OSVAUCO_DIR/scripts/acceptance-test.sh'
|
|
alias opax='source $OSVAUCO_DIR/scripts/opax.sh'
|
|
alias opax2='source $OSVAUCO_DIR/scripts/opax2.sh'
|
|
alias ca='bash $OSVAUCO_DIR/scripts/cost-audit.sh'
|
|
alias cl='bash $OSVAUCO_DIR/scripts/cost-lens.sh'
|
|
alias cg='bash $OSVAUCO_DIR/scripts/cost-guard.sh'
|
|
alias costs='bash $OSVAUCO_DIR/scripts/cost-lens.sh'
|
|
alias ms='bash $OSVAUCO_DIR/scripts/sync-gdrive-mirror.sh'
|
|
alias logg='bash $OSVAUCO_DIR/scripts/opax-logg-slutt.sh'
|
|
alias rl='${PAGER:-less} $ROADMAP'
|
|
alias mp='${PAGER:-less} $MASTERPLAN'
|
|
alias ho='${PAGER:-less} $HANDOFF'
|
|
alias rb='${PAGER:-less} $RULEBOOK'
|
|
alias sl='${PAGER:-less} $SESSION_LOG'
|
|
alias osv='cd $OSVAUCO_DIR'
|
|
alias reboot-osv='unset OSVAUCO_BOOTED; source $OSVAUCO_DIR/scripts/boot.sh'
|
|
alias ghs='gh pr list && gh issue list'
|
|
|
|
# sol() — avslutt-funksjon
|
|
sol() {
|
|
printf "\n ${BOLD}${CYAN}Sesjonsavslutning${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 $OSVAUCO_SESSION_ID
|
|
- Start : $OSVAUCO_SESSION_START
|
|
- Slutt : $(date '+%Y-%m-%d %H:%M %Z')
|
|
- Gjort : $DONE_DESC
|
|
- Uløst : $UNSOLVED
|
|
EOF
|
|
ok "Logg oppdatert"
|
|
cd "$OSVAUCO_DIR"
|
|
git add docs/OSVAUCO_OPAX_SESSION_LOG.md 2>/dev/null
|
|
if ! git diff --cached --quiet; then
|
|
git commit -m "chore(session): logg $OSVAUCO_SESSION_ID — $DONE_DESC" -q
|
|
git push origin "$(git branch --show-current)" -q && ok "Pushet → GitHub"
|
|
fi
|
|
}
|
|
export -f sol
|
|
|
|
# =============================================================================
|
|
# 7. QUICK COMMANDS-TABELL
|
|
# =============================================================================
|
|
printf "${DIM}────────────────────────────────────────────────────────────${NC}\n"
|
|
printf "${BOLD}HOTKEYS${NC}\n"
|
|
printf " %-8s %-22s %-8s %-22s\n" "opax" "Gemini 2.5 Pro TUI" "opax2" "Claude Opus 4.7 TUI"
|
|
printf " %-8s %-22s %-8s %-22s\n" "pf" "preflight" "hc" "health-check"
|
|
printf " %-8s %-22s %-8s %-22s\n" "st" "smoke-test" "at" "acceptance-test"
|
|
printf " %-8s %-22s %-8s %-22s\n" "ca" "cost-audit" "cl" "cost-lens"
|
|
printf " %-8s %-22s %-8s %-22s\n" "cg" "cost-guard" "costs" "cost-lens (alias)"
|
|
printf " %-8s %-22s %-8s %-22s\n" "mp" "vis MASTERPLAN" "rl" "vis ROADMAP"
|
|
printf " %-8s %-22s %-8s %-22s\n" "ho" "vis HANDOFF" "rb" "vis RULEBOOK"
|
|
printf " %-8s %-22s %-8s %-22s\n" "sl" "vis SESSION_LOG" "logg" "manuell logg-slutt"
|
|
printf " %-8s %-22s %-8s %-22s\n" "ghs" "gh PRs + issues" "ms" "mirror-sync (GDrive)"
|
|
printf " %-8s %-22s %-8s %-22s\n" "osv" "cd ~/OSVauco" "sol" "avslutt + commit"
|
|
printf " %-8s %-22s\n" "reboot-osv" "kjør boot.sh på nytt"
|
|
printf "${DIM}────────────────────────────────────────────────────────────${NC}\n"
|
|
|
|
# =============================================================================
|
|
# 8. NVM
|
|
# =============================================================================
|
|
export NVM_DIR="$HOME/.nvm"
|
|
[[ -s "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh"
|
|
|
|
# =============================================================================
|
|
# 9. VALG: opax / opax2 / hopp over
|
|
# =============================================================================
|
|
printf "\n${BOLD}Hvilken TUI vil du starte?${NC}\n"
|
|
printf " ${CYAN}1${NC}) opax — Gemini 2.5 Pro (Vertex EU) ${DIM}[default]${NC}\n"
|
|
printf " ${MAGENTA}2${NC}) opax2 — Claude Opus 4.7 (Vertex EU)\n"
|
|
printf " ${DIM}3${NC}) hopp over (jobb i shell)\n"
|
|
printf " Velg [1/2/3]: "
|
|
read -r CHOICE
|
|
case "${CHOICE:-1}" in
|
|
1|"")
|
|
printf " ${GREEN}→ starter opax (Gemini 2.5 Pro)${NC}\n\n"
|
|
source "$OSVAUCO_DIR/scripts/opax.sh"
|
|
;;
|
|
2)
|
|
printf " ${MAGENTA}→ starter opax2 (Claude)${NC}\n\n"
|
|
source "$OSVAUCO_DIR/scripts/opax2.sh"
|
|
;;
|
|
*)
|
|
printf " ${DIM}OK — shell ready. Kjør 'opax' eller 'opax2' når du er klar.${NC}\n\n"
|
|
;;
|
|
esac
|