#!/usr/bin/env bash # Rauchtest ohne echte Werkzeuge: Server starten, Beispielpakete veröffentlichen, # mit dem CLI in ein Test-Repo abgleichen (→ KONZEPT.md 17). # # scripts/smoke-test-local.sh # Arbeitsordner wird danach gelöscht # KEEP=1 scripts/smoke-test-local.sh # Arbeitsordner bleibt zum Ansehen set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" WORK="$(mktemp -d)" PORT="${PORT:-8765}" URL="http://127.0.0.1:$PORT" export HUGIN_DATABASE_URL="sqlite:///$WORK/hugin.db" export HUGIN_ADMIN_TOKEN="rauchtest-admin" export HUGIN_CLI_MIN_VERSION="0.1.0" export HUGIN_DOWNLOAD_DIR="$WORK/downloads" mkdir -p "$HUGIN_DOWNLOAD_DIR/0.2.0" && touch "$HUGIN_DOWNLOAD_DIR/0.2.0/hugin-linux-amd64" ADMIN=(-H "Authorization: Bearer $HUGIN_ADMIN_TOKEN") cleanup() { [[ -n "${SERVER:-}" ]] && kill "$SERVER" 2>/dev/null || true if [[ -z "${KEEP:-}" ]]; then rm -rf "$WORK"; else echo "Arbeitsordner: $WORK"; fi } trap cleanup EXIT api() { curl -fsS -H "Content-Type: application/json" "$@"; } key() { python3 -c 'import json,sys; print(json.load(sys.stdin)["key"])'; } echo "== Server" (cd "$ROOT/server" && uv run -q hugin-server migrate) (cd "$ROOT/server" && exec uv run -q hugin-server run --host 127.0.0.1 --port "$PORT") >"$WORK/server.log" 2>&1 & SERVER=$! for _ in $(seq 50); do curl -fsS "$URL/readyz" >/dev/null 2>&1 && break; sleep 0.2; done curl -fsS "$URL/readyz"; echo echo "== Tenants, Projekte, Keys" api "${ADMIN[@]}" "$URL/api/v1/admin/tenants" -d '{"slug":"plattform","name":"Plattform"}' >/dev/null api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/plattform/projects" -d '{"slug":"kern","name":"Kern"}' >/dev/null api "${ADMIN[@]}" "$URL/api/v1/admin/tenants" -d '{"slug":"shop","name":"Shop"}' >/dev/null api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/shop/projects" -d '{"slug":"web","name":"Web"}' >/dev/null AUTHOR=$(api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/plattform/keys" -d '{"kind":"project","name":"autor","project":"kern","roles":["pub_author"]}' | key) REVIEWER=$(api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/plattform/keys" -d '{"kind":"project","name":"pruefer","project":"kern","roles":["pub_reviewer"]}' | key) READER=$(api "${ADMIN[@]}" "$URL/api/v1/admin/tenants/shop/keys" -d '{"kind":"project","name":"web","project":"web"}' | key) publish() { local folder="$ROOT/contract/examples/packages/$1" zip="$WORK/package.zip" rm -f "$zip"; (cd "$folder" && zip -qr "$zip" .) curl -fsS -H "Authorization: Bearer $AUTHOR" -H "Content-Type: application/zip" --data-binary "@$zip" "$URL/api/v1/drafts" >/dev/null local base="$URL/api/v1/packages/${1%/*}/versions/${1#*/}" api -H "Authorization: Bearer $AUTHOR" -X POST "$base/submit" >/dev/null api -H "Authorization: Bearer $REVIEWER" "$base/approve" -d '{"comment":"Rauchtest"}' >/dev/null echo " veröffentlicht: $1" } echo "== Pakete" publish pub-munin-nutzen/1.4.0 publish pub-hausregeln/1.0.0 publish pub-munin-anbindung/1.0.0 curl -fsS "${ADMIN[@]}" -X PUT -H "Content-Type: application/json" "$URL/api/v1/admin/mandatory/pub-munin-anbindung" -d '{"tenant":null}' echo "== CLI" (cd "$ROOT/cli" && go build -o "$WORK/hugin" ./cmd/hugin) REPO="$WORK/repo"; mkdir -p "$REPO"; cd "$REPO"; git init -q printf '# Web\n\nUnser Projekt.\n' > CLAUDE.md export HUGIN_KEY="$READER" "$WORK/hugin" init --server "$URL" --project web >/dev/null sed -i.alt 's/^packages: \[\]/packages:\n - pub-munin-nutzen\n - pub-hausregeln/' .hugin.yaml && rm -f .hugin.yaml.alt "$WORK/hugin" sync "$WORK/hugin" check echo "== Aktualisierung" publish pub-munin-nutzen/1.5.0 set +e; "$WORK/hugin" check; RC=$?; set -e [[ $RC -eq 1 ]] || { echo "check hätte die neue Version melden müssen (rc=$RC)"; exit 1; } "$WORK/hugin" sync "$WORK/hugin" status echo "== Autoren: new, validate, try, upload" export HUGIN_SERVER="$URL" cd "$WORK" HUGIN_KEY="$AUTHOR" "$WORK/hugin" new command pub-rauch-befehl cat > pub-rauch-befehl/hugin.yaml <<'YAML' id: pub-rauch-befehl kind: command version: 1.0.0 owner: kern scope: public description: Rauchtest für Befehle. arguments: [ziel] YAML printf 'Prüfe {{ziel}} und fasse zusammen. $ARGUMENTS\n' > pub-rauch-befehl/COMMAND.md HUGIN_KEY="$AUTHOR" "$WORK/hugin" validate pub-rauch-befehl cd "$REPO" cp hugin.lock "$WORK/lock-vorher" HUGIN_KEY="$AUTHOR" "$WORK/hugin" try "$WORK/pub-rauch-befehl" grep -q 'Prüfe $ziel' .claude/commands/pub-rauch-befehl.md cmp -s hugin.lock "$WORK/lock-vorher" || { echo "try hat hugin.lock verändert"; exit 1; } "$WORK/hugin" try --remove [[ ! -e .claude/commands/pub-rauch-befehl.md ]] || { echo "try --remove hat nicht aufgeräumt"; exit 1; } cd "$WORK" set +e; printf 'Nimm $1\n' > pub-rauch-befehl/COMMAND.md HUGIN_KEY="$AUTHOR" "$WORK/hugin" upload pub-rauch-befehl; RC=$?; set -e [[ $RC -eq 1 ]] || { echo "Linter hätte \$1 ablehnen müssen (rc=$RC)"; exit 1; } printf 'Prüfe {{ziel}} und fasse zusammen.\n' > pub-rauch-befehl/COMMAND.md HUGIN_KEY="$AUTHOR" "$WORK/hugin" upload --submit pub-rauch-befehl api -H "Authorization: Bearer $REVIEWER" "$URL/api/v1/packages/pub-rauch-befehl/versions/1.0.0/approve" -d '{}' >/dev/null cd "$REPO" sed -i.alt 's/^ - pub-hausregeln$/ - pub-hausregeln\n - pub-rauch-befehl/' .hugin.yaml && rm -f .hugin.yaml.alt "$WORK/hugin" sync grep -q 'Prüfe $ziel' .claude/commands/pub-rauch-befehl.md echo "== suche und Versionsprüfung des CLI" "$WORK/hugin" search munin | tee "$WORK/search.txt" grep -q "pub-munin-nutzen" "$WORK/search.txt" || { echo "search findet pub-munin-nutzen nicht"; exit 1; } (cd "$ROOT/cli" && go build -ldflags "-X main.Version=0.0.9" -o "$WORK/hugin-alt" ./cmd/hugin) set +e; "$WORK/hugin-alt" check > "$WORK/check-alt.txt" 2>&1; RC=$?; set -e [[ $RC -eq 1 ]] && grep -q "älter als die nötige Version 0.1.0" "$WORK/check-alt.txt" || { cat "$WORK/check-alt.txt"; echo "altes CLI nicht gemeldet"; exit 1; } (cd "$ROOT/cli" && go build -ldflags "-X main.Version=0.1.0" -o "$WORK/hugin-010" ./cmd/hugin) "$WORK/hugin-010" check > "$WORK/check-010.txt" 2>&1 || true grep -q "hugin 0.2.0 ist verfügbar" "$WORK/check-010.txt" || { cat "$WORK/check-010.txt"; echo "Hinweis auf neue Version fehlt"; exit 1; } echo "== Nutzung" sqlite3 "$WORK/hugin.db" "select repo, package_id, version, tools from hugin_usage order by package_id" 2>/dev/null || true echo "Rauchtest ok."