/
nv-lang
/
nova
Обзор
Документация
Войти
/
nv-lang
/
nova
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
main
scripts/githooks/pre-commit
65 строк
5 KB
Evgeniy Golovin
docs(231.2): полные шапки хуков guard-git/guard-memory/pre-commit
27 июл 2026, 11:28
27 июл 2026, 11:28
3d7fcf0
Код
Авторство
О чём код?
#!/bin/sh # pre-commit — общий git-хук пяти реп (nova/nova-http/nova-tls/nova-polaris/ # nova-compress), запускается на КАЖДЫЙ `git commit` во всех них разом. # # ПОЧЕМУ. Конфликт-маркеры и чужое авторство коммита раньше были правилами # только в тексте (памяти/CLAUDE.md) — соблюдение зависело от того, помнит # ли агент. Цена промаха измерена: 349 коммитов ушли под авторством # «Claude Haiku» через общий .git нескольких worktree (инцидент 2026-07-25). # План 231 трек Д п.2 (docs/plans/231-bug-cycle-exit.md, «Git-хуки в репе») # + исполнительный дом docs/plans/231.2-enforcement-infra.md §1. # # КАК ПОДКЛЮЧЁН. `core.hooksPath` в git-конфиге репы указывает на этот # каталог (`scripts/githooks`) вместо стандартного `.git/hooks` — так один # файл в главной репе nova обслуживает git-операции во всех пяти пакетных # репах без копирования. Проверено 2026-07-27: nova/nova-http/nova-tls/ # nova-polaris реально указывают сюда (`git config --get core.hooksPath`); # nova-compress — по описанию плана 231.2, доступа для проверки не было. # # ЧТО ПРОВЕРЯЕТ (падает с exit 1 = коммит заблокирован): # 1) Конфликт-маркеры в staged-диффе (`<<<<<<<`/`=======`/`>>>>>>>` — # только ДОБАВЛЕННЫЕ строки, `^\+`, т.к. staged-контекст с уже # существующими маркерами в НЕизменённых строках — не наша забота). # 2) Авторство: `git config user.name`/`user.email` не должны содержать # «Claude»/«claude»/«anthropic» (урок 349 коммитов выше). # 3) План 232 Ф.3: правка `spec/decisions/*.md` в staged без правки # обзорного `spec/<тема>.md` в том же коммите — блок, если только не # выставлена переменная `NOVA_OVERVIEW_NA=1` (единственный штатный # обход в этом скрипте; см. ниже — обход только для ЭТОГО правила, # правила 1 и 2 такого клапана не имеют). # # ИСПОЛЬЗОВАНИЕ. Автоматический — не запускается руками. Аварийный обход # ЖЁСТКО не рекомендован (`--no-verify` запрещён CLAUDE.md/dev-workflow.md # кроме явного разрешения владельца); единственный предусмотренный В САМОМ # СКРИПТЕ обход — `NOVA_OVERVIEW_NA=1 git commit ...` для правила 3 # (осознанный пропуск обзорной правки). # 1) Конфликт-маркеры в staged. if git diff --cached | grep -E '^\+(<<<<<<<|>>>>>>>|=======$)' >/dev/null 2>&1; then echo "pre-commit: conflict markers in staged — commit blocked." >&2 exit 1 fi # 2) Авторство: не Claude/anthropic (урок 2026-07-25, 349 коммитов). AN=$(git config user.name) AE=$(git config user.email) case "$AN $AE" in *[Cc]laude*|*anthropic*) echo "pre-commit: author '$AN <$AE>' blocked — restore owner git identity." >&2 exit 1;; esac # 3) 232 Ф.3: амендмент decisions без касания обзорных spec/*.md и без маркера [overview: n/a]. if git diff --cached --name-only | grep -q '^spec/decisions/'; then if ! git diff --cached --name-only | grep -qE '^spec/[^/]+\.md$'; then MSG_FILE="$1" if [ -z "${1:-}" ] || ! grep -q '\[overview: n/a\]' "${MSG_FILE:-/dev/null}" 2>/dev/null; then # pre-commit не видит сообщение — проверка маркера в commit-msg невозможна здесь; # мягкий блок с подсказкой обхода через env-переменную. if [ -z "${NOVA_OVERVIEW_NA:-}" ]; then echo "pre-commit(232): staged menyaet spec/decisions/, no ne trogaet obzornye spec/*.md." >&2 echo " Libo obnovi zatronutyi spec/<tema>.md v etom zhe kommite," >&2 echo " libo osoznanno propusti: NOVA_OVERVIEW_NA=1 git commit ..." >&2 exit 1 fi fi fi fi exit 0