phase1(boost): laravel/boost v2.4.6 + Vuetify guideline (Прил. Н #10)

Установка Laravel Boost вручную (без `php artisan boost:install`):
wizard падает в обоих режимах из-за двух багов окружения:
  - интерактив: PHP fatal на кириллице-пути при рендере laravel/prompts
    multiselect (нет UTF-8 codepage в Windows PowerShell)
  - --no-interaction: ConfiguresPrompts::multiselectFallback возвращает
    null → array_map() crash в L13 framework

Manual setup вместо wizard'а:
  - app/composer.json: laravel/boost ^2.4 + транзитивы (laravel/mcp v0.7,
    laravel/roster v0.5.1, symfony/yaml v7.4)
  - app/boost.json: agents=[claude_code], guidelines=true, mcp=true
  - .mcp.json (корень): добавлен блок laravel-boost — command=php,
    args=[app/artisan, boost:mcp]. Заменяет PostgreSQL MCP из фазы 0
    (был убран в _comment_postgres ещё ранее).
  - app/.ai/guidelines/vuetify.md: кастомный Vuetify 3 guideline по
    Tooling §10.2 + Forest-палитра + 14 slug'ов воронки берутся из
    schema.sql:2076 (НЕ из BRANDBOOK_v2 §3.6).

Smoke-test (boost:mcp via JSON-RPC):
  - protocolVersion 2024-11-05, serverInfo "Laravel Boost"
  - 9 tools: application-info, browser-logs, database-(connections|query|
    schema), get-absolute-url, last-error, read-log-entries, search-docs

Уточнение к CLAUDE.md §7: «отключать guidelines Inertia/Livewire/Tailwind/
Filament/Sail/PHPUnit» — избыточно. Boost через laravel/roster детектит
установленные пакеты из composer.lock; то, что не установлено, не серверит.
Pest 4 будет detected, PHPUnit guideline не активируется (PHPUnit убран
из direct deps в коммите 30f0335). Тех-уточнение к §10.1 шаг 4 — отдельно.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-08 11:05:21 +03:00
parent 3a9ed7101e
commit e04f53b103
5 changed files with 363 additions and 2 deletions
+5 -1
View File
@@ -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 сломан на кириллице-пути)."
}
}
}
+73
View File
@@ -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`).
+7
View File
@@ -0,0 +1,7 @@
{
"agents": [
"claude_code"
],
"guidelines": true,
"mcp": true
}
+1
View File
@@ -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",
+277 -1
View File
@@ -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",