Files
portal/lefthook.yml
T
Дмитрий 20d4682e21 feat(backend): Sprint 2 Phase A — Pest 4 browser scaffold + mutation + lazy-loading + Larastan cache
Sprint 2 Phase A (modernization). Закрытие audit O-stack-01/02/03 + O-perf-07:

- O-stack-01: Pest 4 browser-tests scaffold. testsuite Browser в phpunit.xml,
  Pest.php extend(...)->in('Browser'), tests/Browser/SmokeTest.php
  (login-flow + deal-create-flow). На Windows native PHP плагин
  pest-plugin-browser требует ext-sockets (отсутствует в стандартной
  сборке) и при автозагрузке вызывает socket_create_listen() ДО старта
  тестов, что ломает весь Pest. Поэтому плагин НЕ в require-dev,
  тесты помечены ->skip(...) с инструкцией активации на Linux CI.
  Скелет тестов в комментариях — на CI достаточно
  composer require pestphp/pest-plugin-browser --dev + npx playwright
  install + раскомментировать тела.
- O-stack-02: infection/infection ^0.32.7 в require-dev + app/infection.json
  (minMsi=50, source: Http/Models/Services). composer mutation script.
  Запуск отдельной задачей в CI (медленный). allow-plugins для
  infection/extension-installer.
- O-stack-03: Laravel 13 string-based lazy-loading в routes/web.php —
  убран блок use App\Http\Controllers\Api\* (16 импортов), все
  ссылки заменены на строки 'App\Http\...\X@method'. Контроллеры
  не загружаются автозагрузчиком при boot route'ов; класс резолвится
  только при матче маршрута. Использован строковый синтаксис, а не
  FQN-class — Pint default preset (fully_qualified_strict_types fixer)
  сворачивает FQN-class обратно в use, на строки не действует.
- O-perf-07: Larastan result cache через tmpDir: .phpstan-cache в
  phpstan.neon (cache-dir не дублируется флагом — phpstan не принимает
  оба источника). lefthook job 6 (larastan) использует этот же
  tmpDir автоматически. Ускорение инкрементальных pre-commit прогонов:
  на правке одного файла — переанализ только зависящих, не всего
  графа классов. .phpstan-cache в .gitignore.

Pest: 416/416 PASS + 2 skipped (browser smoke pending Linux CI).
Larastan: 0 errors above baseline.
Infection: vendor/bin/infection --version → 0.32.7.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 19:18:38 +03:00

134 lines
7.3 KiB
YAML
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.
# =============================================================================
# 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 <file>` где возможно.
# 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