#!/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