Commit Graph

8 Commits

Author SHA1 Message Date
Дмитрий 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
Дмитрий 952373fce5 phase2(trigger): Vue 3 + Vuetify 3 + ESLint+Prettier+Vue + vue-tsc + Vitest
Триггер фазы 2 выполнен — первый коммит в app/resources/js/. Активирует
5 из 6 инструментов фазы 2 (CLAUDE.md §3.3) — без Histoire (отдельно).

Tailwind удалён (правило CLAUDE.md §5 п.2).

Стек:
  - vue@3.5, vuetify@3.12, @vitejs/plugin-vue@6 (для Vite 8 совместимости —
    @vitejs/plugin-vue@5 поддерживает только Vite 5/6), vite-plugin-vuetify@2
    (auto-import), sass-embedded
  - eslint@10 (flat-config), eslint-plugin-vue@10,
    @vue/eslint-config-typescript@14, eslint-config-prettier, prettier@3.8
  - typescript@6, vue-tsc@3.2
  - vitest@4.1, @vue/test-utils, jsdom, @vitest/coverage-v8

Конфиги:
  - app/vite.config.js — vue + vuetify auto-import
  - app/vitest.config.ts — jsdom + setup file для ResizeObserver/
    IntersectionObserver/matchMedia/CSS.supports stubs (без них Vuetify
    падает в JSDOM)
  - app/eslint.config.js — flat-config
  - app/.prettierrc.json, app/tsconfig.json

Frontend-структура:
  - resources/js/app.ts — точка входа
  - resources/js/plugins/vuetify.ts — палитра Forest (Teal/ivory/теало-нуар
    из BRANDBOOK_v2 §3)
  - resources/js/components/AppShell.vue — первый компонент: v-app +
    v-app-bar + v-card
  - resources/css/app.css — Inter (UI, opsz axis), JetBrains Mono
    (.numeric, tnum)
  - resources/views/welcome.blade.php — упрощён под Vue mount

Smoke-тесты Vitest 3/3 за 2.8 сек:
  - монтируется без ошибок
  - содержит «Лидерра.»
  - рендерит chip с фазой 2

Build: 158 модулей за 386 ms (184 KB JS / 295 KB CSS gzipped).

npm-scripts: lint:vue, format, format:check, type-check, test:vue.
lefthook job #8 (ESLint на staged .ts/.vue) добавлен в pre-commit.
Полный type-check (vue-tsc) и Vitest — отдельно вручную (медленно для
pre-commit: ~3 сек на каждый).

CLAUDE.md v1.16 → v1.17 (фаза 1 → фаза 2 в §6).
Реестр Открытые_вопросы v1.25 → v1.26.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:07:14 +03:00
Дмитрий e81eeef1fe phase1(db-tooling): squawk v2.51 + pgFormatter v5.9 — закрытие тулчейна фазы 1
Активны Прил. Н #15 squawk и #16 pgFormatter; фаза 1 по тулчейну
закрыта 13/17 (без #17 pg_partman — Windows native стек).

squawk:
- bin/squawk.exe (npm i -g squawk-cli + копия из ~/AppData/...
  /squawk-cli/js/binaries/squawk → bin/squawk.exe; npm-wrapper
  не находит spawn-target без .exe на Windows)
- .squawk.toml: 9 правил исключено (5 bootstrap-неприменимых +
  4 дизайнных решения проекта). Smoke-test на db/schema.sql — 0 issues.
- lefthook.yml: pre-commit job на staged *.sql
- npm run lint:sql

pgFormatter:
- bin/pgFormatter/ (pg_format + lib/ из v5.9 release tarball,
  запуск через Cygwin Perl 5.42.2 из Git for Windows — без
  отдельной установки ActivePerl/Strawberry)
- Без авто-fix хука: diff vs db/schema.sql 3255 строк
  (UPPERCASE→lowercase для типов, плотный одностроковый стиль,
  перетасовка inline-комментариев) — стиль schema.sql ручной,
  авто-fix недопустим
- Только ручной режим: npm run format:sql:check (dry-run + diff),
  npm run format:sql (пишет в db/schema.sql.formatted для review)

Документы:
- Tooling Прил. Н v1.5 → v1.6 (§0 «Что нового», §3.3 таблица,
  §10.1 п.8 ⏸→, §11.4 уточнение по Cygwin Perl)
- CLAUDE.md v1.8 → v1.9 (§0 ссылка, §6 текущая фаза 17/28,
  колонтитул)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 12:56:29 +03:00
Дмитрий 59f8ca04bb phase1(hooks-fix): сужение pre-push lychee + 2 битых ссылки + allowlist demo HTML
При первом запуске pre-push hook'ов после установки lefthook (`4eee06f`)
обнаружились 3 проблемы — все легитимны, не в самом lefthook'е:

1. **gitleaks-full-history** ловил 42 хита `ru-phone-unmasked` в HTML-концептах
   handoff Платона (liderra_v8_handoff/concepts/v8_*.html и web/v8/v8_*.html).
   Это ДЕМО-данные для визуализации, не реальные ПДн. Добавлены в allowlist
   .gitleaks.toml: `liderra_v8_handoff/concepts/.*\.html` + `web/v8/.*\.html`
   + `app/composer.lock`.

2. **lychee-links** ловил 21 ошибку «Cannot resolve root-relative link» на
   ссылки `/login`, `/register`, `/legal/*` в HTML-концептах. Эти маршруты
   появятся только в фазе 2+ (Vue+Vuetify реализация). Сужен glob
   pre-push lychee — выкинут `web/**/*.html`. Дополнительно добавлены
   `liderra_v8_handoff/concepts` и `web/v8` в .lychee.toml exclude_path
   как защита для других вариантов запуска.

3. **2 РЕАЛЬНЫХ битых ссылки** в narrative — спасибо lychee, нашёл:
   - `docs/CRM_bp-gr_Инструкция_v8_5.md:6128` ссылался на `brandbook.md`,
     но этот файл удалён 08.05.2026 (заменён на `liderra_v8_handoff/docs/
     BRANDBOOK_v2.md` v8 Forest). Исправлен относительный путь.
   - `README.md:88` ссылался на `docs/README_АРХИВ_v8_4.md`, но переименован
     в `_v8_5.md` коммитом `4ffc19a` от 07.05.2026. Поправлено + bump v8.4→v8.5
     в подписи.

Финальный smoke-test после правок:
  - gitleaks detect (full history): «no leaks found»
  - lychee на narrative .md: 122 OK / 0 Errors / 5 Excluded

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 12:00:15 +03:00
Дмитрий 4eee06fb22 phase1(hooks): lefthook auto-install + Pint + Larastan pre-commit hooks
Закрывает Tooling §10.1 шаги 10/11 («хуки в .claude/settings.json для
Pint/Larastan» — реализация через lefthook, как и было обещано в
CLAUDE.md §3.5: «Pre-commit (gitleaks, link-check) — не здесь, отдельно
через git hooks (lefthook)»).

Добавлено в lefthook.yml:
  - pre-commit job #5 «pint»: glob app/**/*.php, root app/,
    `php vendor/bin/pint {staged_files}` + stage_fixed: true
    (авто-fix форматирования PSR-12 на staged PHP)
  - pre-commit job #6 «larastan»: glob app/**/*.php, root app/,
    `php vendor/bin/phpstan analyse --no-progress --memory-limit=512M`
    (полный анализ при любой правке *.php — phpstan нужен граф классов,
    точечный анализ только staged невозможен)

Хуки установлены через `npx lefthook install` — .git/hooks/pre-commit
и .git/hooks/pre-push сгенерированы. Smoke-test:
  - pint --test (на default scaffold) → passed
  - phpstan analyse --no-progress → 0 ошибок выше baseline (3 в baseline)

Это опционально-блокирующий слой: при коммите .php — Pint авто-форматирует,
Larastan ловит ошибки выше phpstan-baseline.neon. Обход — `LEFTHOOK=0
git commit` (использовать только для emergency).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:44:52 +03:00
Дмитрий 887abf444e rebrand(v8.5→Лидерра): дизайн-handoff Платона v8 Forest + Лидпоток→Лидерра
Получен handoff-пакет liderra_v8_handoff/ от дизайнера Платона
(kpd9363@gmail.com) от 07.05.2026 — v8 Forest. Заказчик 08.05 решил
применить только в части дизайна, имени, логотипа. Функционал, состав
страниц и правила (CTO-11, click-wrap, SSO break-glass, 14 статусов
воронки) — без изменений (источник — ТЗ v8.5/schema v8.5).

Что сделано:

- Массовая замена Лидпоток→Лидерра (с учётом падежей: Лидерры/Лидерре)
  в 33 файлах (449 вхождений) — все .md/.sql/.json/.toml/.yml/.txt/.html,
  кроме исторических упоминаний внутри liderra_v8_handoff/
- Удалён docs/brandbook.md v1.1 — заменён на BRANDBOOK_v2.md из handoff
- Скопированы 13 концептов liderra_v8_handoff/concepts/v8_*.html в
  web/v8/. Удалены старые web/01-login.html, 02-dashboard.html,
  03-deals.html, index.html (палитра v1.1 deprecated)
- CLAUDE.md v1.0→v1.1: §0 (BRANDBOOK_v2 + DEVELOPER_HANDOFF в источниках),
  §2 (палитра Forest, Inter+JBM, Lucide), §5 п.6 (anti-pattern Inter
  снят — в Forest Inter наш основной шрифт), §6 (13 концептов в web/v8/)
- Реестр Открытые_вопросы_v8_3.md v1.12→v1.13: добавлена запись о
  ребрендинге + 4 точечных расхождений handoff vs ТЗ (статусы воронки,
  click-wrap чекбоксы, SSO fallback, axe violations)
- package.json/package-lock.json: name lidpotok→liderra

4 расхождения handoff vs ТЗ (НЕ применены, источник истины — ТЗ/schema):

1. 14 «обобщённых» статусов в BRANDBOOK_v2 §3.6 ≠ 14 slug'ов в
   schema.sql:2076 (совпадает 2 из 14: «Переговоры», «Оплачено»).
   Источник — schema/ТЗ §6.4 (реселлерская модель из аудита crm.bp-gr.ru,
   6 системных + 8 настраиваемых статусов).
2. 3-й click-wrap в v8_login.html («маркетинг-опционально») ≠ ТЗ §1.5/§4.1
   («согласие на ПДн», обязательное, OPEN-Ж-3).
3. SSO в v8_admin.html («локальный 2FA fallback») ≠ ТЗ OPEN-И-13
   (break-glass super_admin, локальный 2FA выключен).
4. Заявление «axe-core 4.10.2 — 0 violations» в README handoff — локально
   Pa11y 9.1.1 + axe нашёл 81 violation на 10/13 HTML (преимущественно
   color-contrast на декоративных separator'ах с --ink-disabled).
   Чисто: settings/errors/palette_options.

Что НЕ включено в коммит:
- лендинг/TZ_landing_v1_0.md — untracked, не моя работа в этой сессии
- .tmp/ — gitignored

Что осталось (для следующих сессий):
- Возможное переименование GitHub-репо CoralMinister/lidpotok → liderra
  (отдельное решение заказчика)
- Опционально: обратная связь Платону по 4 расхождениям handoff vs ТЗ

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 07:11:58 +03:00
Дмитрий f1ea6a15a6 fix(config): B-1 — конфигурационные находки аудита B (P0+P1)
- cspell-words.txt: удалено сломанное `ofеrtу` (кириллица в латыни,
  пропущено мимо словаря; нормальные `оферта`/`оферты` уже есть).
- .gitignore: `.playwright-mcp/` → `**/.playwright-mcp/` (артефакт может
  появиться в любом подкаталоге, не только в корне).
- pa11y.config.json: добавлен `web/03-deals.html` (готовый прототип №03,
  ранее не попадал в a11y-check).
- lefthook.yml: pre-push +lychee-links — битые ссылки ловятся до push,
  как и было задумано (Прил. Н §1, в комментарии было, в jobs не было).
- CLAUDE.md §4: `gitleaks detect` / `gitleaks protect` → `./bin/gitleaks.exe ...`
  (на Windows бинарь в `bin/`, не в PATH).
- README.md: подпись `Прил. Л v0.1 от 05.05.2026` → `v0.4 от 06.05.2026`,
  синхронизация с таблицей версий (последняя запись v0.4).

Линтеры (markdownlint, cspell на затронутых .md) — чисто.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:31:14 +07:00
Дмитрий 6ff05fd7ea chore: phase 0 tooling baseline
Установлены 9 инструментов фазы 0 + lefthook для pre-commit/pre-push hooks.

Конфиги в корне:
- package.json + package-lock.json (10 dev-deps, 7 npm-скриптов)
- .markdownlint.json + .markdownlintignore — стиль Markdown
- cspell.json + cspell-words.txt — орфография ru/en + 350+ проектных терминов
- .lychee.toml — проверка ссылок с игнором плейсхолдеров
- .stylelintrc.json — стиль CSS в HTML-прототипах
- .gitleaks.toml — 8 кастомных правил для РФ-контекста (телефон, ИНН, ОГРН,
  паспорт, Yandex Cloud-tokens, webhook secrets) + allowlist для масок
- pa11y.config.json — WCAG 2.1 AA для web/01-login.html и web/02-dashboard.html
- .mcp.json — 3 MCP-сервера (Playwright, GitHub через офиц. hosted endpoint,
  PostgreSQL — заглушка)
- .gitignore — node_modules, bin/*, артефакты + задел на фазы 1–3
- .claude/settings.json — permissions allow/deny + хук авто-fix .md
- lefthook.yml — pre-commit (gitleaks + markdownlint + cspell + stylelint)
  и pre-push (полный gitleaks по истории)

Связано: docs/Tooling_v8_3.md (Прил. Н v1.0) — реестр 28 инструментов в 4
фазах; CLAUDE.md в корне — оперативная карта приоритета правил и команд.

Архитектурных изменений в проекте: 0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 04:44:20 +07:00