#!/bin/sh
# Зонный pre-commit фрагмент frontend/. Запускается диспетчером .git/hooks/pre-commit,
# которого ставит scripts/githooks/install.mjs (автоматически при npm install).
# Для коммитов без frontend-путей отрабатывает за миллисекунды и молчит.
# Крайний обход (осознанный, в лог не попадает): git commit --no-verify.

staged=$(git diff --cached --name-only)
[ -z "$staged" ] && exit 0

# 1) Файлы из списка «никогда не коммитить» (CLAUDE.md, гардрейлы): живой бриф владельца
# и личные настройки прав. START_PROMT.MD трекается и часто модифицирован — голый
# `git commit -a` унёс бы его молча.
forbidden=$(printf '%s\n' "$staged" | grep -E '^START_PROMT\.MD$|(^|/)\.claude/settings\.local\.json$')
if [ -n "$forbidden" ]; then
  echo 'pre-commit: в коммите файл из списка «никогда не коммитить» (CLAUDE.md, гардрейлы):' >&2
  printf '  %s\n' "$forbidden" >&2
  echo 'Коммитьте pathspec-формой без него: git commit -m "..." -- <свои пути>' >&2
  exit 1
fi

# 2) Смесь frontend/ и чужой зоны в одном коммите — картина обоих инцидентов 02.08
# (голый `git commit` унёс чужой индекс, D39.88). Фронт коммитит ТОЛЬКО frontend/,
# остальные зоны frontend/ не коммитят — легитимной смеси не существует.
front=$(printf '%s\n' "$staged" | grep -c '^frontend/')
other=$(printf '%s\n' "$staged" | grep -cv '^frontend/')
if [ "$front" -gt 0 ] && [ "$other" -gt 0 ]; then
  echo 'pre-commit: коммит смешивает frontend/ с другой зоной — так уезжает чужой индекс (D39.88).' >&2
  echo 'Разделите: git commit -m "..." -- <пути одной зоны>' >&2
  printf '%s\n' "$staged" | sed 's/^/  /' >&2
  exit 1
fi

[ "$front" -eq 0 ] && exit 0

# 3) Гейт качества зоны: тот же npm run check, что гоняют сессии руками, — один список
# инструментов, не дубль (STACK_DECISIONS §3 «одна команда проверки»).
if [ ! -d frontend/node_modules ]; then
  echo 'pre-commit: нет frontend/node_modules — выполните npm ci в frontend/ и повторите.' >&2
  exit 1
fi
if ! git diff --quiet -- frontend/; then
  echo 'pre-commit: в frontend/ есть незакоммиченные правки вне индекса; check идёт по рабочему дереву.' >&2
fi
echo 'pre-commit: npm run check (frontend), ~10 сек...' >&2
if ! npm --prefix frontend run check; then
  echo 'pre-commit: check красный — коммит остановлен. Чинить, не обходить.' >&2
  exit 1
fi
