#!/usr/bin/env bash # Session-Hygiene-Gate (Starter — an Repo anpassen). set -uo pipefail fail=0 note(){ echo " - $1"; fail=1; } # Dormant solange das Template nicht initialisiert ist (scripts/init.sh). if grep -q '' STATE.md 2>/dev/null; then echo "[hygiene] Template noch nicht initialisiert (scripts/init.sh) — uebersprungen." echo "GATE: PASS"; exit 0 fi echo "[hygiene] pruefe Working Tree..." [ -z "$(git status --porcelain)" ] || note "Working Tree nicht sauber." echo "[hygiene] STATE.md im aktuellen Branch aktualisiert?" base=$(git merge-base HEAD main 2>/dev/null || true) head=$(git rev-parse HEAD 2>/dev/null || true) if [ -n "$base" ] && [ "$base" != "$head" ]; then # echte Divergenz (Feature-Branch): Diff gegen Abzweigpunkt git diff --name-only "$base"...HEAD | grep -q '^STATE.md$' || \ note "STATE.md im aktuellen Branch nicht aktualisiert." else # auf main/Integration oder Root-Commit: letzten Commit pruefen git log -1 --name-only --pretty= | grep -q '^STATE.md$' || \ note "STATE.md im letzten Commit nicht angefasst." fi echo "[hygiene] Session-Log vorhanden?" ls sessions/[0-9]*.md >/dev/null 2>&1 || note "Kein Session-Log unter sessions/." echo "[hygiene] Conventional Commits?" git log -1 --pretty=%s | grep -Eq '^(feat|fix|docs|test|refactor|chore)(\(.+\))?: ' || \ note "Letzter Commit nicht conventional." echo "[hygiene] Model-Attribution im letzten Commit?" git log -1 --pretty=%B | grep -q 'Co-Authored-By: Claude' || \ echo " - Hinweis: letzter Commit ohne 'Co-Authored-By: Claude ' (Pflicht nur fuer Agenten-Commits)." if [ "$fail" -ne 0 ]; then echo "GATE: FAIL"; exit 1; fi echo "GATE: PASS"