# =============================================================================
# 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
