/
ump-team
/
ump-infra
Обзор
Документация
Войти
/
ump-team
/
ump-infra
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
main
scripts/git_commit_guard.sh
67 строк
3 KB
Dmitry Kochenov
init v0.0.2
19 июл 2026, 19:11
19 июл 2026, 19:11
13d6d0b
Код
Авторство
О чём код?
#!/usr/bin/env bash # Pre-commit hook: защита plans/ от удаления и модификации без PROTECT-ГЕЙТ запрет изменений планов # # Источники: # - https://docs.github.com/en/code-security/concepts/supply-chain-security/immutable-releases # - https://dev.to/trknhr/lessons-from-the-spring-2026-oss-incidents # # P1-14 audit finding: pre-commit hook обходится через `git commit --no-verify`. # Это задокументированное ограничение Git — pre-commit hooks voluntary. Для # критичной инфраструктуры (plans/, immutable files) требуется ДОПОЛНИТЕЛЬНО: # 1. Server-side protection rules (GitHub: branch protection rules + required # status checks; GitVerse: аналог branch protection в web UI). # 2. CODEOWNERS file для plans/ (требует review от владельцев). # 3. CI check `protect_files.py --check` в .gitverse/workflows/ci.yml — # уже реализован (см. ci.yml → "Verify immutable files protection"). # # Без server-side защиты агент с доступом на запись может обойти pre-commit # hook одной командой `git commit --no-verify`. set -euo pipefail # Файлы планов, защищённые от прямого изменения PROTECTED_DIRS=( "plans/" ) # Маркер разрешения (создаётся через PROTECT-ГЕЙТ) ALLOW_MARKER="_meta/.allow-protected-edit" # Проверка маркера if [ -f "$ALLOW_MARKER" ]; then exit 0 fi # Проверка staged файлов STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACMRD 2>/dev/null || true) if [ -z "$STAGED_FILES" ]; then exit 0 fi VIOLATIONS=0 for file in $STAGED_FILES; do for dir in "${PROTECTED_DIRS[@]}"; do if [[ "$file" == "$dir"* ]]; then echo "❌ ЗАПРЕЩЕНО: изменение плана без PROTECT-ГЕЙТ: $file" echo "" echo "Для изменения планов:" echo " 1. Получите разрешение через PROTECT-ГЕЙТ" echo " 2. touch $ALLOW_MARKER" echo " 3. git add $file && git commit" echo " 4. rm $ALLOW_MARKER" echo "" echo "См. .agent/rules/06-interactive-protocol.md §PROTECT-ГЕЙТ" VIOLATIONS=$((VIOLATIONS + 1)) fi done done if [ $VIOLATIONS -gt 0 ]; then echo "Найдено $VIOLATIONS нарушений. Коммит заблокирован." exit 1 fi exit 0