20d4682e21
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>
134 lines
7.3 KiB
YAML
134 lines
7.3 KiB
YAML
# =============================================================================
|
||
# 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
|