textmachine/frontend/scripts/githooks/pre-commit

48 lines
3 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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