48 lines
3 KiB
Bash
Executable file
48 lines
3 KiB
Bash
Executable file
#!/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
|