diff --git a/.mcp.json b/.mcp.json index 7f3705bb..52fc50b9 100644 --- a/.mcp.json +++ b/.mcp.json @@ -14,6 +14,10 @@ }, "comment": "Фаза 0 #3 — официальный hosted GitHub MCP (https://github.com/github/github-mcp-server). Требует env GITHUB_TOKEN с PAT (scopes: repo, read:org, не давать admin/delete). Раньше использовали deprecated @modelcontextprotocol/server-github — заменён 06.05.2026." }, - "_comment_postgres": "PostgreSQL MCP временно убран. Когда поднимется локальная dev-БД — добавить блок 'postgres' с command='npx', args=['-y', '@modelcontextprotocol/server-postgres', 'postgresql://localhost:5432/liderra_dev']. В фазе 1 — заменяется Laravel Boost (см. Tooling §3.1)." + "laravel-boost": { + "command": "php", + "args": ["app/artisan", "boost:mcp"], + "comment": "Фаза 1 #10 — Laravel Boost MCP (laravel/boost v2.4.6). Заменяет PostgreSQL MCP из фазы 0. Через Roster детектит установленные пакеты (Laravel 13, Pest 4, Pint, Larastan, IDE Helper) и серверит соответствующие guidelines + DB query/schema/tinker tools. Кастомный Vuetify 3 guideline — в app/.ai/guidelines/vuetify.md. Конфиг wizard'а — app/boost.json (написан вручную: wizard сломан на кириллице-пути)." + } } } diff --git a/app/.ai/guidelines/vuetify.md b/app/.ai/guidelines/vuetify.md new file mode 100644 index 00000000..184bd51f --- /dev/null +++ b/app/.ai/guidelines/vuetify.md @@ -0,0 +1,73 @@ +# Vuetify 3 (Лидерра) + +Проект использует **Vuetify 3** как единственную UI-библиотеку (CTO-11 в реестре открытых вопросов). + +## НЕ использовать (CLAUDE.md §5 п.2) + +- Tailwind CSS / shadcn-vue / Element UI / Naive UI / Quasar / PrimeVue / Bootstrap / Vuestic +- Inertia.js / Livewire / Filament / Flux UI / Nova / Folio / Volt / Wayfinder +- jQuery / Vue 2 + +## Палитра — v8 Forest + +Источник: `liderra_v8_handoff/docs/BRANDBOOK_v2.md` §3 + DEVELOPER_HANDOFF.md §3. + +| Токен | Значение | Назначение | +|---|---|---| +| primary | `#0F6E56` (Teal 600) | Кнопки, акценты, активные состояния — неоспариваемый | +| primary-dark | `#012019` | Sidebar (теало-нуар) | +| background | `#F6F3EC` (warm ivory) | Page background | +| surface | `#FFFFFF` | Карточки, диалоги | +| on-surface | OKLCH-токены см. BRANDBOOK_v2 §3.5 | Текст, иконки | + +Vuetify-тема `liderraLight` (и опционально `liderraDark`) — определена в `resources/js/plugins/vuetify.ts` (создаётся в фазе 2). + +**14 статусов воронки** имеют свои OKLCH-цвета — но **slug'и брать ТОЛЬКО из `db/schema.sql:2076`** (источник истины — schema/ТЗ §6.4, не handoff). Палитру маппить на slug'и при реализации. + +## Шрифты + +- **UI:** Inter (variable, axis `opsz` 14..32). Подключение — Google Fonts с `subset cyrillic`. +- **Numerics + код:** JetBrains Mono с `font-feature-settings: "tnum"` (табличные цифры). + +Шрифты задаются на `:root` через CSS-переменные, Vuetify темы подхватывают через `defaultTheme.variables`. + +## Иконки + +- **Lucide** (через `lucide-vue-next`). НЕ Material Icons, НЕ Font Awesome. + +## Компоненты + +Использовать **только** Vuetify 3 компоненты: + +- Формы: `v-text-field`, `v-select`, `v-autocomplete`, `v-checkbox`, `v-radio-group`, `v-switch`, `v-textarea` +- Кнопки/действия: `v-btn`, `v-btn-toggle`, `v-fab` +- Layout: `v-app`, `v-app-bar`, `v-navigation-drawer`, `v-main`, `v-container`, `v-row`, `v-col` +- Данные: `v-data-table`, `v-data-table-server`, `v-data-iterator` +- Карточки/диалоги: `v-card`, `v-dialog`, `v-bottom-sheet`, `v-snackbar` +- Навигация: `v-tabs`, `v-stepper`, `v-breadcrumbs`, `v-pagination` +- Канбан: `v-row` + `v-col` + `v-card` (drag-and-drop через `vuedraggable@next` или `@vueuse/integrations`) + +Дефолтный material-стиль переопределяется через `:root` CSS-переменные из BRANDBOOK_v2 + `defaults` в Vuetify-плагине. + +## A11y (WCAG 2.1 AA) + +- Все компоненты должны проходить **Pa11y 9.x + axe** (см. CLAUDE.md §5 п.3 — Pa11y единственный источник истины, НЕ Lighthouse). +- Контраст текста на белом — минимум **4.5:1** для обычного текста, **3:1** для крупного (≥18pt или ≥14pt bold). +- Все интерактивные элементы должны иметь `aria-label` или видимый текст. +- Focus-стили НЕ удалять — Vuetify 3 рисует ring через `--v-focus-opacity`. + +## Тестирование + +- Vitest для unit-тестов компонентов. +- **Histoire** (НЕ Storybook, см. CLAUDE.md §5 п.6 / Tooling Прил. Н #24) для каталога компонентов. +- Pa11y-CI на `histoire build` output перед merge'ом. + +## Связанные документы + +- `liderra_v8_handoff/docs/BRANDBOOK_v2.md` — палитра, типографика, spacing, статусы (брендинг) +- `liderra_v8_handoff/docs/DEVELOPER_HANDOFF.md` — токены, компоненты, 25 экранов +- `db/schema.sql:2076` — 14 slug'ов статусов воронки (источник истины) +- `docs/CRM_bp-gr_Инструкция_v8_5.md` — функционал и состав экранов (источник истины) +- `web/v8/v8_*.html` — 13 HTML-концептов как референс + +При расхождении handoff vs ТЗ — приоритет **ТЗ + schema** (см. CLAUDE.md §0 + memory `reference_handoff.md`). diff --git a/app/boost.json b/app/boost.json new file mode 100644 index 00000000..f4af2b60 --- /dev/null +++ b/app/boost.json @@ -0,0 +1,7 @@ +{ + "agents": [ + "claude_code" + ], + "guidelines": true, + "mcp": true +} diff --git a/app/composer.json b/app/composer.json index b7d39e07..8b9bb0bf 100644 --- a/app/composer.json +++ b/app/composer.json @@ -15,6 +15,7 @@ "barryvdh/laravel-ide-helper": "*", "fakerphp/faker": "^1.23", "larastan/larastan": "*", + "laravel/boost": "^2.4", "laravel/pail": "^1.2.5", "laravel/pao": "^1.0.6", "laravel/pint": "^1.29", diff --git a/app/composer.lock b/app/composer.lock index 1dd55cff..f0170d38 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "65090803eaf67b2bc04be6640c03edac", + "content-hash": "1937213c7c2ad08891326a312df854f7", "packages": [ { "name": "brick/math", @@ -7168,6 +7168,145 @@ }, "time": "2026-04-29T18:32:34+00:00" }, + { + "name": "laravel/boost", + "version": "v2.4.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/boost.git", + "reference": "c9ea6368c66f7c0e6a9b26706b401de900cdb9ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/boost/zipball/c9ea6368c66f7c0e6a9b26706b401de900cdb9ac", + "reference": "c9ea6368c66f7c0e6a9b26706b401de900cdb9ac", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.9", + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "laravel/mcp": "^0.5.1|^0.6.0|^0.7.0", + "laravel/prompts": "^0.3.10", + "laravel/roster": "^0.5.0", + "php": "^8.2" + }, + "require-dev": { + "laravel/pint": "^1.27.0", + "mockery/mockery": "^1.6.12", + "orchestra/testbench": "^9.15.0|^10.6|^11.0", + "pestphp/pest": "^2.36.0|^3.8.4|^4.1.5", + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Boost\\BoostServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Boost\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.", + "homepage": "https://github.com/laravel/boost", + "keywords": [ + "ai", + "dev", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/boost/issues", + "source": "https://github.com/laravel/boost" + }, + "time": "2026-04-28T11:52:01+00:00" + }, + { + "name": "laravel/mcp", + "version": "v0.7.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/mcp.git", + "reference": "3513b4feca5f1678be4d2261dcfa8e456436d02a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/mcp/zipball/3513b4feca5f1678be4d2261dcfa8e456436d02a", + "reference": "3513b4feca5f1678be4d2261dcfa8e456436d02a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/container": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/http": "^11.45.3|^12.41.1|^13.0", + "illuminate/json-schema": "^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "illuminate/validation": "^11.45.3|^12.41.1|^13.0", + "php": "^8.2" + }, + "require-dev": { + "laravel/pint": "^1.20", + "orchestra/testbench": "^9.15|^10.8|^11.0", + "pestphp/pest": "^3.8.5|^4.3.2", + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.2.4" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Mcp": "Laravel\\Mcp\\Server\\Facades\\Mcp" + }, + "providers": [ + "Laravel\\Mcp\\Server\\McpServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Mcp\\": "src/", + "Laravel\\Mcp\\Server\\": "src/Server/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Rapidly build MCP servers for your Laravel applications.", + "homepage": "https://github.com/laravel/mcp", + "keywords": [ + "laravel", + "mcp" + ], + "support": { + "issues": "https://github.com/laravel/mcp/issues", + "source": "https://github.com/laravel/mcp" + }, + "time": "2026-04-21T10:23:03+00:00" + }, { "name": "laravel/pail", "version": "v1.2.6", @@ -7400,6 +7539,67 @@ }, "time": "2026-04-20T15:26:14+00:00" }, + { + "name": "laravel/roster", + "version": "v0.5.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/roster.git", + "reference": "5089de7615f72f78e831590ff9d0435fed0102bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/roster/zipball/5089de7615f72f78e831590ff9d0435fed0102bb", + "reference": "5089de7615f72f78e831590ff9d0435fed0102bb", + "shasum": "" + }, + "require": { + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/routing": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "symfony/yaml": "^7.2|^8.0" + }, + "require-dev": { + "laravel/pint": "^1.14", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^3.0|^4.1", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Roster\\RosterServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Roster\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Detect packages & approaches in use within a Laravel project", + "homepage": "https://github.com/laravel/roster", + "keywords": [ + "dev", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/roster/issues", + "source": "https://github.com/laravel/roster" + }, + "time": "2026-03-05T07:58:43+00:00" + }, { "name": "mockery/mockery", "version": "1.6.12", @@ -9882,6 +10082,82 @@ ], "time": "2024-10-20T05:08:20+00:00" }, + { + "name": "symfony/yaml", + "version": "v7.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "c660d6538545a3e8e65a5621ee3d7a6d352892c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c660d6538545a3e8e65a5621ee3d7a6d352892c7", + "reference": "c660d6538545a3e8e65a5621ee3d7a6d352892c7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-05T08:01:55+00:00" + }, { "name": "ta-tikoma/phpunit-architecture-test", "version": "0.8.7",