# ============================================================================= # lefthook.yml — Лидерра (фаза 0) # ============================================================================= # Документация: https://lefthook.dev # Установка хуков: npx lefthook install # Удаление хуков: npx lefthook uninstall # Ручной pre-commit: npx lefthook run pre-commit # Пропуск (один раз): LEFTHOOK=0 git commit -m "..." # # Принципы (Прил. Н §1): # - Pre-commit для быстрых проверок: gitleaks, markdownlint, cspell, Stylelint # - Pre-push для медленных: полный gitleaks по истории + lychee # - Pa11y — только в CI (требует Chromium) # ============================================================================= min_version: 2.0.0 # Pre-commit: проверки на staged-файлах перед каждым git commit pre-commit: parallel: false jobs: # 1. gitleaks — поиск ПДн / токенов / API-ключей в staged # Правило §5.2 правил Claude. Блокирует коммит при находке. - name: gitleaks run: ./bin/gitleaks.exe protect --staged --config .gitleaks.toml --no-banner fail_text: | gitleaks нашёл потенциальные ПДн / токены / API-ключи в diff. Если это маска / тестовое значение — добавь в allowlist .gitleaks.toml. Если реальные данные — удали и используй маски (+7XXXXXXXXXX, ***@***). # 2. markdownlint — стиль Markdown с авто-fix - name: markdownlint glob: "*.md" run: npx markdownlint-cli2 --fix {staged_files} stage_fixed: true fail_text: | markdownlint нашёл проблемы, которые не исправляются автоматически. Запусти `npm run lint:md:fix` или поправь руками. # 3. cspell — орфография на staged .md - name: cspell glob: "*.md" run: npx cspell --no-progress --no-summary {staged_files} fail_text: | cspell нашёл слова, отсутствующие в словаре. Если это валидное слово проекта — добавь в cspell-words.txt. Если опечатка — поправь. # 4. Stylelint — стиль CSS в HTML-прототипах - name: stylelint glob: "*.html" run: npx stylelint {staged_files} fail_text: | Stylelint нашёл проблемы в CSS прототипа. Запусти `npx stylelint --fix ` где возможно. # 5. Pint — code style PHP (фаза 1, Прил. Н #11). Авто-fix на staged .php в app/. - name: pint glob: "app/**/*.php" root: "app/" run: php vendor/bin/pint {staged_files} stage_fixed: true fail_text: | Pint не смог отформатировать какие-то файлы (синтаксическая ошибка PHP?). Запусти `cd app && composer pint` локально, посмотри вывод. # 6. Larastan — статанализ PHP (фаза 1, Прил. Н #12). Полный анализ при любой правке # *.php в app/ (точечный анализ только staged-файлов невозможен — phpstan нужен граф # классов). Скорость: ~5-10 с на default scaffold + baseline 3. - name: larastan glob: "app/**/*.php" root: "app/" # cache-dir задан через tmpDir в app/phpstan.neon (Sprint 2 Phase A, # O-perf-07 — ускорение инкрементальных прогонов). run: php vendor/bin/phpstan analyse --no-progress --memory-limit=512M fail_text: | Larastan нашёл новые ошибки выше baseline. Запусти `cd app && composer stan` локально и поправь. Если ошибка ложная — обнови `app/phpstan-baseline.neon` (см. feedback_environment.md п.25 — генерация baseline в 2 шага). # 7. squawk — линтер миграций PostgreSQL (фаза 1, Прил. Н #15). Срабатывает только # на staged *.sql (db/schema.sql и будущие raw-SQL-миграции). Конфиг .squawk.toml # в корне отключает bootstrap-неприменимые правила и дизайнные предпочтения проекта. - name: squawk glob: "*.sql" run: ./bin/squawk.exe {staged_files} fail_text: | squawk нашёл проблемы в SQL. Конфиг — .squawk.toml в корне проекта. Если правило неприменимо к bootstrap — добавь в excluded_rules в .squawk.toml. Если это будущая миграция Laravel в app/database/migrations/ — создай локальный .squawk.toml рядом с более строгими правилами. pgFormatter (Прил. Н #16) — отдельно через `npm run format:sql:check`, НЕ в pre-commit (стиль schema.sql ручной, авто-fix не применяется). # 8. ESLint+Prettier+Vue — frontend стиль (фаза 2, Прил. Н #22). Lint-only # на staged .ts/.vue в app/resources/js/. Полный type-check (vue-tsc) и Vitest — # отдельно (медленно для pre-commit: ~3 сек на vue-tsc, ~3 сек на vitest). # Запускать вручную: `cd app && npm run type-check && npm run test:vue`. - name: eslint-vue glob: "app/resources/js/**/*.{ts,vue}" root: "app/" run: npx eslint {staged_files} fail_text: | ESLint нашёл проблемы в Vue/TS-файлах. Запусти `cd app && npm run lint:vue` локально и поправь. Авто-форматирование: `cd app && npm run format`. # Pre-push: проверки перед git push (медленнее, но реже запускаются) pre-push: parallel: false jobs: # 5. Полный gitleaks-скан всей истории (не только staged) - name: gitleaks-full-history run: ./bin/gitleaks.exe detect --source . --no-banner --config .gitleaks.toml --redact fail_text: | gitleaks нашёл утечки в истории коммитов. Перед push разберись с каждой находкой. # 6. lychee — проверка ссылок в narrative-доках (.md). HTML-концепты в web/v8/ # и liderra_v8_handoff/concepts/ намеренно НЕ проверяются — там root-relative # ссылки на будущие маршруты Vue+Vuetify (/login, /register, /legal/*). - name: lychee-links run: ./bin/lychee.exe --config .lychee.toml "docs/**/*.md" "db/**/*.md" "*.md" fail_text: | lychee нашёл битые ссылки в .md. Запусти `npm run links` локально, поправь URL или добавь в `.lychee.toml` exclude. # Подавить служебный вывод skip_output: - meta - skips