#!/usr/bin/env bash # pre_verify-Gate (P1-5, 09.07.2026): erinnert den Agenten VOR dem Fertigmelden an # die zwei MC2-Pflichten aus AGENTS.md — py_compile-Gate und die dist-Falle. # Antwort {"action":"continue","message":...} = Agent arbeitet weiter; {} = durchlassen. set -u payload="$(cat -)" attempt=$(printf %s "$payload" | jq -r '.extra.attempt // 0' 2>/dev/null || echo 0) # Ein-Schuss: nach dem ersten Nudge nicht erneut nerven (Docs-Empfehlung). if [ "$attempt" != "0" ]; then printf '{}'; exit 0; fi mapfile -t paths < <(printf %s "$payload" | jq -r '.extra.changed_paths[]? // empty' 2>/dev/null) [ ${#paths[@]} -eq 0 ] && { printf '{}'; exit 0; } msgs=() # Gate 1: py_compile fuer alle geaenderten .py, die existieren pyfail="" for p in "${paths[@]}"; do case "$p" in *.py) if [ -f "$p" ] && ! err=$(python3 -m py_compile "$p" 2>&1); then pyfail="${pyfail}${p}: ${err}"$'\n' fi ;; esac done if [ -n "$pyfail" ]; then msgs+=("py_compile-Gate ROT:"$'\n'"${pyfail}Erst fixen, dann fertigmelden.") fi # Gate 2: dist-Falle — frontend/src geaendert, aber kein frontend/dist angefasst. # Feuert NUR in Repos mit der MC2-Konvention (frontend/dist ist git-getrackt) — # sonst nudgt es in beliebigen Spielordnern ohne Build (False-Positive, 09.07. beobachtet). srcfile=""; dist=0 for p in "${paths[@]}"; do case "$p" in */frontend/src/*|frontend/src/*) srcfile="$p" ;; */frontend/dist/*|frontend/dist/*) dist=1 ;; esac done if [ -n "$srcfile" ] && [ $dist -eq 0 ]; then # Repo-Wurzel vom geaenderten File aus hochlaufen (max 8 Ebenen). root=$(dirname "$srcfile"); n=0 while [ $n -lt 8 ] && [ -n "$root" ] && [ "$root" != "/" ] && [ ! -e "$root/.git" ]; do root=$(dirname "$root"); n=$((n+1)) done if [ -e "$root/.git" ] && git -C "$root" ls-files frontend/dist 2>/dev/null | head -1 | grep -q .; then msgs+=("AGENTS.md-Gate: Du hast frontend/src geaendert, aber frontend/dist nicht. Die Box baut NICHT selbst: cd frontend && npm run build, dann das neue dist im selben Branch mit-committen — sonst zeigt die Box nach Merge+Deploy den alten Stand.") fi fi if [ ${#msgs[@]} -eq 0 ]; then printf '{}'; exit 0; fi joined=$(printf '%s\n\n' "${msgs[@]}") jq --null-input --arg m "$joined" '{action:"continue", message:$m}'