diff --git a/scripts/gate-doc-drift.sh b/scripts/gate-doc-drift.sh index 3de014a..dde7a25 100755 --- a/scripts/gate-doc-drift.sh +++ b/scripts/gate-doc-drift.sh @@ -9,20 +9,31 @@ if grep -q '' STATE.md 2>/dev/null; then echo "GATE: PASS"; exit 0 fi -echo "[drift] pruefe im Manifest referenzierte Pfade..." -# Loop laeuft im Haupt-Shell (Process Substitution), damit fail=1 wirkt. +echo "[drift] pruefe im Manifest referenzierte Pfade (nur done/in_progress/drift)..." +# Nur Pfade aus ERLEDIGTEN Zeilen muessen existieren — 'todo'-Zeilen sind Plan, +# ihre Dateien gibt es absichtlich noch nicht. Treffer in eine Datei sammeln, +# damit fail=1 nicht in einer Pipe-Subshell verloren geht. +miss=$(mktemp) if [ -f "$man" ]; then - while read -r p; do - # Platzhalter und Nicht-Pfade ueberspringen. - case "$p" in - *" "*|*…*|_*|*path/to*) continue ;; - esac - case "$p" in - */*|*.py|*.md|*.sh|*.js|*.ts|*.yml|*.yaml|*.json) - [ -e "$p" ] || { echo " - fehlende Referenz: $p"; fail=1; } ;; - esac - done < <(grep -oE '`[^`]+`' "$man" | tr -d '`') + while IFS= read -r line; do + case "$line" in \|*) : ;; *) continue ;; esac # nur Tabellenzeilen + status=$(printf '%s' "$line" | sed 's/^|//; s/|[[:space:]]*$//' \ + | awk -F'|' '{print $NF}' | tr -d ' ' | tr 'A-Z' 'a-z') + case "$status" in done|in_progress|drift) : ;; *) continue ;; esac + while IFS= read -r tok; do + case "$tok" in *" "*|*…*|_*|*path/to*) continue ;; esac + case "$tok" in + */*|*.py|*.md|*.sh|*.js|*.ts|*.yml|*.yaml|*.json|*.conf|*.ini|*.txt) + [ -e "$tok" ] || echo "$status $tok" >> "$miss" ;; + esac + done < <(printf '%s\n' "$line" | grep -oE '`[^`]+`' | tr -d '`') + done < "$man" fi +if [ -s "$miss" ]; then + while IFS=" " read -r st p; do echo " - fehlende Referenz (Status $st): $p"; done < "$miss" + fail=1 +fi +rm -f "$miss" echo "[drift] STATE.md Stale-Check (Commits seit letzter Aenderung)..." last_state=$(git log -1 --format=%H -- STATE.md 2>/dev/null || true)