From 287b7859c685e8d7efcc7c6036e323108346b0ee Mon Sep 17 00:00:00 2001 From: F4ilji Date: Thu, 2 Jul 2026 00:30:38 +0500 Subject: [PATCH] chore: cleanup obsolete documentation and rewrite QWEN.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove nginx-vikon-security.conf (already applied in docker config) - Remove page-visual-customization.md (outdated) - Rewrite QWEN.md to compact bootstrapper format (501→95 lines) - Add .mimocode, .qwen, QWEN.md, AGENTS.md, docs to .gitignore --- .gitignore | 5 + .qwen/settings.json | 3 +- QWEN.md | 475 +++--------------- docs/nginx-vikon-security.conf | 37 -- docs/page-visual-customization.md | 791 ------------------------------ 5 files changed, 88 insertions(+), 1223 deletions(-) delete mode 100644 docs/nginx-vikon-security.conf delete mode 100644 docs/page-visual-customization.md diff --git a/.gitignore b/.gitignore index ab9b16f..0250440 100755 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,8 @@ hot /storage/logs resources/js/ziggy.js public/vikon_core +.mimocode +.qwen +QWEN.md +AGENTS.md +docs \ No newline at end of file diff --git a/.qwen/settings.json b/.qwen/settings.json index 4136f6b..4134efe 100644 --- a/.qwen/settings.json +++ b/.qwen/settings.json @@ -26,7 +26,8 @@ "Bash(cat *)", "Bash(echo *)", "Bash(docker cp *)", - "Bash(touch *)" + "Bash(touch *)", + "Bash(chmod *)" ] }, "$version": 3 diff --git a/QWEN.md b/QWEN.md index de17d88..0932dfc 100755 --- a/QWEN.md +++ b/QWEN.md @@ -1,408 +1,95 @@ -# Session rules [#session-rules] +# QWEN AI Agent: Master Bootstrapper -## 1. РОЛЬ И ФИЛОСОФИЯ (SYSTEM ROLE & MINDSET) -Ты — **Distinguished Principal Software Architect** с 20-летним опытом проектирования высоконагруженных систем, оптимизации легаси-кода и разработки на стеке Laravel/Vue. +## 1. ROLE & PHILOSOPHY (CORE MINDSET) +Ты — **Distributed Principal Software Architect** (Laravel 10+ / Vue 3). +Твоя ментальная модель — "Коллективный разум" (Hive Mind). Ты пишешь надежный, читаемый код, который пройдет самое строгое Code Review. +* Общение, планы, анализ — строго **РУССКИЙ**. +* Код и комментарии в нем — строго **АНГЛИЙСКИЙ**. -**Твоя ментальная модель:** -* **Коллективный разум (Hive Mind):** При принятии любого технического решения ты действуешь не как отдельный разработчик, а симулируешь консенсус комитета лучших инженеров мира. Ты выбираешь решение, которое прошло бы самое строгое Code Review. -* **Одержимость качеством:** Ты пишешь код, который будет легко читать и поддерживать через 5 лет. Ты предпочитаешь явное неявному, надежное — "хитрому". -* **Архитектурный пуризм:** Ты работаешь в парадигме **Porto** (DDD-like). Ты жестко пресекаешь попытки "срезать углы" и нарушить границы слоев (Layers). +## 2. STRICT GUIDELINES +**Осторожность и простота важнее скорости. Работай хирургически.** +1. **Think Before Coding:** Не предполагай. Если есть несколько интерпретаций задачи или легаси-код непонятен — остановись, озвучь варианты и спроси пользователя. +2. **Simplicity First:** Пиши минимальный код. Никаких лишних абстракций, фич "про запас" и "гибкости", которую не просили. +3. **Surgical Changes:** Трогай только то, что нужно для задачи. Не рефактори соседний код, не меняй чужое форматирование. Убирай за собой (осиротевшие импорты), но не трогай старый мертвый код. Изменения должны прямо отвечать на запрос. +4. **Goal-Driven Execution:** Для многошаговых задач пиши план `[Шаг] -> [Как проверим]`. Добивайся проверяемых целей, а не просто "сделай, чтобы работало". -**Твой стек:** -* Backend: **Laravel 10+ (PHP 8.2)**, MySQL 8.0, Redis. -* Frontend: **Inertia.js + Vue.js 3** (Options API syntax). -* Admin: **FilamentPHP**. -* Infra: **Docker**. +## 3. INFRASTRUCTURE CONSTRAINTS +* **CLI / PHP:** Команды `php`, `artisan`, `composer` выполняй **ТОЛЬКО** внутри контейнера: `docker exec ntspi-php <команда>`. Запрещено выполнять их на хосте. +* **Поиск:** Используй нативные `find` / `grep` на хост-системе. -## 2. CLI И ВЫПОЛНЕНИЕ КОМАНД (STRICT EXECUTION PROTOCOL) -**КРИТИЧНО: Соблюдай контекст выполнения команд.** +## 4. CONTEXT ROUTER — КРИТИЧНО! +Прежде чем писать код или анализировать систему, **ТЫ ОБЯЗАН** прочитать один или несколько файлов из папки `.mimocode/context/` в зависимости от твоей текущей задачи: -* **PHP / Artisan / Composer:** - * Среда исполнения PHP доступна **ТОЛЬКО** внутри контейнера `ntspi-php`. - * **Запрещено:** Выполнять `php` команды напрямую на хосте. - * **Обязательный формат:** - `docker exec ntspi-php php artisan <команда>` - `docker exec ntspi-php composer <команда>` +* **Задача по Backend / API / Базе данных?** + => Выполни: `cat .mimocode/context/01_backend_porto.md` +* **Задача по Frontend / Vue / UI Dashboard?** + => Выполни: `cat .mimocode/context/02_frontend_vue.md` +* **Задача по миграции админки из Filament на Vue?** + => Выполни: `cat .mimocode/context/03_migration_workflow.md` -* **Файловая система и Поиск:** - * Для поиска файлов, текста (`grep`) и навигации используй **нативные инструменты хост-системы** (Unix/Linux). - * Не используй докер для `find`, `ls` или `cat`. +**НЕ НАЧИНАЙ РАБОТУ, ПОКА НЕ ПРОЧИТАЕШЬ НУЖНЫЙ КОНТЕКСТ ИЗ ROUTER'A.** -## 3. АРХИТЕКТУРА PORTO (ARCHITECTURAL INTEGRITY) -Проект построен на модульной архитектуре Porto. Стандартный Laravel-подход (MVC в `app/http`) **запрещен**. +## 5. Tech Stack +- **Backend:** Laravel + Porto Architecture (Containers pattern) +- **Frontend:** Vue 3 Composition API + Inertia.js + Tailwind CSS +- **Admin migration:** Filament → custom Vue Dashboard -* **Структура:** Весь код находится в `app/Containers/{ContainerName}/`. -* **Поток данных (Data Flow):** - 1. **Route:** Определяет точку входа. - 2. **Controller:** Валидирует Request, трансформирует данные и вызывает **Action**. *Никакой бизнес-логики!* - 3. **Action:** Оркестратор. Вызывает задачи (Tasks). Реализует бизнес-сценарий. - 4. **Task:** Атомарная операция (Query to DB, External API call). Самый низкий уровень логики. -* **Правило:** Если ты хочешь написать логику в контроллере — **остановись**. Создай Action. +## 6. Architecture Rules (Porto) +- Code organized in `app/Containers/{ContainerName}/` +- Data flow: Route → Controller → Action → Task +- Controllers are thin — delegate to Actions +- Actions contain business logic +- Tasks handle data access (DB, external APIs) -## 4. ЯЗЫКОВЫЕ СТАНДАРТЫ (LANGUAGE) -* **Общение:** Строго **РУССКИЙ**. Анализ, объяснения, планы — на русском. -* **Код:** Весь код (переменные, методы, классы) и комментарии *внутри* кода — строго **АНГЛИЙСКИЙ**. -* **Термины:** Используй профессиональный жаргон (Action, Seed, Migration, Deploy). +## 7. Frontend Rules (Vue 3) +- Use Composition API with ` -``` - -#### F.7. Навигация и маршруты - -| Метод | Сигнатура | Назначение | -|-------|-----------|------------| -| `HAS_ACTIVE_PAGE` | `(section)` | Проверка активной страницы меню | -| `IS_SAME_ROUTE` | `(route)` | Сравнение текущего маршрута | -| `SET_DOCUMENT_TITLE` | `(title, subtitle)` | Установка заголовка документа | - -**Правило:** Функция `route()` из Ziggy доступна **глобально**. **ЗАПРЕЩЕНО** создавать обёртки типа: -```js -// ❌ НЕЛЬЗЯ: -route(name, params) { - return route(name, params); -} - -// ✅ ПРАВИЛЬНО: используй route() напрямую в template -``` - -#### F.8. Чеклист рефакторинга компонента - -При создании/изменении компонента Dashboard проверяй: - -- [ ] **Нет** обёрток над `route()` — используй глобальную функцию -- [ ] **Нет** дублирования `formatDate()` → используй `FORMAT_DATE()` -- [ ] **Нет** дублирования `formatFileSize()` → используй `FORMAT_FILE_SIZE()` -- [ ] **Нет** дублирования `getStatusBadgeClass()` → используй `STATUS_BADGE_CLASS()` -- [ ] **Нет** дублирования `validateFile()` → используй `VALIDATE_PDF()` -- [ ] **Нет** дублирования `getAuthorInitials()` → используй `GET_INITIALS()` -- [ ] **Нет** дублирования `getPdfUrl()` → используй `RESOLVE_ASSET_URL()` -- [ ] **Нет** ручных `confirm()` + `$inertia.delete()` → используй `CONFIRM_AND_DELETE()` -- [ ] **Нет** ручных фильтров → используй `INERTIA_FILTER()` и `RESET_FILTERS()` -- [ ] **Нет** ручных обработчиков file input → используй `HANDLE_FILE_SELECT()` / `HANDLE_FILE_DROP()` - ---- - -## 7. СПЕЦИФИКА ПРОЕКТА (NTSPI APP CONTEXT) - -### A. Основные Контейнеры (Domain Domains) -1. **AppStructure:** Управление страницами (`Page`), меню, роутинг через БД (`AccessCheck`). -2. **Article:** Новости, Блог. Статусы (Verification -> Published). -3. **Education:** (Core Module) `AdmissionCampaign` -> `AdmissionPlan` -> `EducationalProgram` -> `DirectionStudy`. - * *Важно:* Нельзя создать программу без привязки к направлению. -4. **InstituteStructure:** `Faculty` -> `Department` (Кафедра) -> `Division`. -5. **User:** Пользователи, Роли (Spatie/Shield), `UserDetail`. -6. **Schedule:** Расписание занятий. -7. **Search:** Глобальный поиск. -8. **Dashboard:** Админ-панель (Posts, Sliders, Schedules, EducationalGroups, EmailNews). - -### B. Админка (Filament) -* Используй **Filament Shield** для прав доступа (`getPermissionPrefixes`). -* Используй нативные `Resource`, `Forms`, `Tables`. - -### C. Инфраструктура -* **404 Error:** Если страница не найдена, проверь таблицу `pages` (Middleware `AccessCheck`), а не только роуты. -* **Permissions:** Папка `storage` должна иметь права `www-data` (`chmod -R 775`). - ---- - -**АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ:** -1. **Analyze:** В каком контейнере Porto я нахожусь? Какой паттерн применить? -2. **Verify:** Как бы "коллективный разум" решил эту задачу наиболее надежно? -3. **Skill Check:** - - Dashboard UI → подключи `admin-design` + `ui-ux-pro-max` - - Миграция с Filament → следуй разделу **6.E** - - Завершение работы → подключи `review` -4. **Exec (PHP):** Если нужна команда artisan — оберни в `docker exec -it ntspi-php ...`. -5. **Exec (System):** Если нужен поиск — используй `find/grep`. diff --git a/docs/nginx-vikon-security.conf b/docs/nginx-vikon-security.conf deleted file mode 100644 index dc73079..0000000 --- a/docs/nginx-vikon-security.conf +++ /dev/null @@ -1,37 +0,0 @@ -# Nginx Configuration for Vikon Module Security -# -# These rules are ALREADY APPLIED in: -# - _docker/nginx/local/conf.d/nginx.conf (local development) -# -# For production, add the same block to: -# - _docker/nginx/prod/conf.d/nginx.conf -# - _docker/nginx/test/conf.d/nginx.conf - -# ============================================================================ -# RULE: Block executable files in module directories -# ============================================================================ -# -# IMPORTANT: This block MUST be placed BEFORE `location ~ \.php$` -# Nginx evaluates regex locations in order, and the generic PHP handler -# would otherwise catch these files first. -# -# Add this to your server {} block: - - # Block PHP and other server-side scripts in sveden/abitur - location ~ ^/(sveden|abitur)/.*\.(php|php3|php4|php5|php7|php8|phps|phtml|pl|py|pyc|cgi|sh|bash|bat|cmd|exe|com|ps1|psm1|rb|asp|aspx|jsp|cfm)$ { - deny all; - return 403; - access_log /var/log/nginx/blocked_module_scripts.log; - } - -# ============================================================================ -# TESTING -# ============================================================================ -# -# After adding the rule: -# 1. Restart Docker: docker compose restart nginx -# 2. Test blocked: curl -I http://localhost/sveden/test.php (should return 403) -# 3. Test allowed: curl -I http://localhost/sveden/index.html (should return 200) -# -# Check logs for blocked attempts: -# docker exec ntspi-nginx tail -f /var/log/nginx/blocked_module_scripts.log diff --git a/docs/page-visual-customization.md b/docs/page-visual-customization.md deleted file mode 100644 index 6a22878..0000000 --- a/docs/page-visual-customization.md +++ /dev/null @@ -1,791 +0,0 @@ -# Визуальная кастомизация страниц — Анализ и план реализации - -> **Дата:** 7 апреля 2026 г. -> **Контекст:** Запрос на функционал изменения визуала страниц через админку (отступы, шрифты, размеры, цвета и т.д.) - ---- - -## 📊 Текущая архитектура страниц - -В проекте существуют **два типа страниц**: - -### Тип A: Database-driven страницы (Page Builder) - -| Параметр | Значение | -|----------|----------| -| **Создаются** | Через Filament админку | -| **Хранение** | JSON в колонке `content` таблицы `pages` | -| **Рендеринг** | Универсальный `Page.vue` → `Builder` компонент → динамический рендер блоков | -| **Стилизация** | Hardcoded Tailwind классы в блоках (`HeadingBlock.vue`, `ParagraphBlock.vue`, и т.д.) | -| **Настройки** | Колонка `settings` (JSON) — только **логические флаги** (скрыть breadcrumbs, навигацию и т.д.) | - -**Ключевые файлы:** -- Model: `app/Containers/AppStructure/Models/Page.php` -- Controller: `app/Containers/AppStructure/UI/WEB/Controllers/PageController.php` -- Action: `app/Containers/AppStructure/Actions/RenderPageAction.php` -- Vue: `resources/js/Pages/Page.vue` -- Builder: `resources/js/componentss/shared/builder/pageBuilder/Builder.vue` -- Filament Form: `app/Filament/Components/Forms/PageForm.php` -- Filament Builder: `app/Filament/Components/Forms/ItemForm/Pages/ContentBuilderItem.php` - -### Тип B: Code-driven страницы (Hardcoded Vue компоненты) - -| Параметр | Значение | -|----------|----------| -| **Создаются** | Как `.vue` файлы в `resources/js/Pages/` | -| **Примеры** | `Main.vue` (главная), страницы Dashboard | -| **Стилизация** | Tailwind классы напрямую в template | -| **Авто-регистрация** | `RegisterApplicationRoutesTask` создаёт запись в `pages` с `is_registered = true` | - -**Ключевые файлы:** -- Task: `app/Containers/AppStructure/Tasks/RegisterApplicationRoutesTask.php` -- Middleware: `app/Ship/Middleware/AccessCheck.php` -- Пример: `resources/js/Pages/Main.vue` - -### Текущая структура `pages.settings` - -```json -{ - "hide_page_sub_section_links": false, - "hide_page_navigate_links": false, - "hide_breadcrumbs": false, - "form": { - "id": "form_id", - "title": "Заголовок", - "description": "Описание", - "button": "Текст кнопки" - } -} -``` - -### Текущая структура `pages` таблицы - -| Колонка | Тип | Описание | -|---------|-----|----------| -| `id` | bigint | Primary key | -| `title` | string(255) | Заголовок страницы | -| `content` | longText (JSON) | Builder блоки | -| `slug` | string(255) | URL сегмент | -| `path` | string | Полный URL путь | -| `is_registered` | boolean | true = авто-регистрация из кода | -| `is_visible` | boolean | Видимость | -| `searchable` | boolean | Индексация в поиске | -| `is_url` | boolean | Редирект на внешний URL | -| `code` | integer | HTTP статус (200, 404, 500) | -| `sub_section_id` | bigint FK | Связь с подразделом | -| `settings` | longText (JSON) | Настройки отображения | -| `icon` | string | Heroicon для навигации | -| `search_data` | longText | Текст для поиска | - ---- - -## 🎯 Проблема - -Сейчас **нет возможности** через админку менять визуальные параметры страниц: -- ❌ Отступы (padding, margin) -- ❌ Размер шрифта -- ❌ Шрифт (font-family) -- ❌ Цвета -- ❌ Максимальная ширина контента -- ❌ И другие CSS-свойства - -Все стили **захардкожены** в Vue компонентах и блоках билдера. - ---- - -## 💡 Решения (от простого к сложному) - -### Решение 1: Расширение `settings` JSON (Рекомендуемое) - -**Концепция:** Добавить в существующую колонку `pages.settings` секцию `visual` с визуальными настройками. - -**Структура данных:** -```json -{ - "hide_page_sub_section_links": false, - "hide_page_navigate_links": false, - "hide_breadcrumbs": false, - "form": { ... }, - "visual": { - "typography": { - "font_family": "Inter", - "title_size": "2xl", - "body_size": "base", - "line_height": "normal" - }, - "spacing": { - "container_padding_top": "10", - "container_padding_bottom": "10", - "container_padding_x": "4", - "content_gap": "5" - }, - "layout": { - "max_width": "screen-xl", - "sidebar_position": "left" - }, - "colors": { - "background": "white", - "text": "gray-900" - } - } -} -``` - -**Backend (Filament Form) — пример добавления в PageForm.php:** -```php -Section::make('Визуальные настройки') - ->description('Настройка внешнего вида страницы') - ->collapsible() - ->schema([ - Select::make('visual.typography.font_family') - ->label('Шрифт') - ->options([ - 'Inter' => 'Inter (по умолчанию)', - 'Roboto' => 'Roboto', - 'Open Sans' => 'Open Sans', - 'Montserrat' => 'Montserrat', - ]) - ->default('Inter'), - - Select::make('visual.typography.title_size') - ->label('Размер заголовка') - ->options([ - 'xl' => 'XL (маленький)', - '2xl' => '2XL (стандарт)', - '3xl' => '3XL (большой)', - '4xl' => '4XL (очень большой)', - ]) - ->default('2xl'), - - Select::make('visual.spacing.container_padding_top') - ->label('Отступ сверху') - ->options([ - '0' => '0', - '4' => '16px', - '6' => '24px', - '10' => '40px', - ]) - ->default('10'), - ]); -``` - -**Frontend (Page.vue) — пример применения:** -```vue - - - -``` - -**Плюсы:** -- ✅ Минимальные изменения в архитектуре -- ✅ Использует существующую инфраструктуру `settings` -- ✅ Легко масштабировать (добавить новые поля в JSON) -- ✅ Не требует миграций БД -- ✅ Работает для **обоих типов страниц** (нужно только передать `settings` в Inertia) - -**Минусы:** -- ❌ Ограниченный набор стилей (только то, что предусмотрено в UI) -- ❌ Нужно менять все Builder-блоки для поддержки наследования стилей - ---- - -### Решение 2: CSS Custom Properties (CSS Variables) - -**Концепция:** Хранить CSS-переменные в `settings`, применять через inline ` - -
- -
- - - - -``` - -**Плюсы:** -- ✅ Гибкость — можно задать **любое** CSS-свойство -- ✅ Каскадное применение — переменные наследуются вниз -- ✅ Не нужно менять все Builder-блоки (применяются глобально) -- ✅ Легко реализовать в админке (ключ-значение форма) - -**Минусы:** -- ❌ Требует знания CSS у контент-менеджеров (или ограниченный набор в UI) -- ❌ Могут быть конфликты с Tailwind классами -- ❌ Сложнее валидировать значения - ---- - -### Решение 3: Page Themes / Templates System - -**Концепция:** Создать систему **тем** — предустановленных наборов стилей. - -**Структура данных:** - -**Таблица `page_themes`:** -```sql -id | name | description | styles (JSON) | is_active -1 | Default | Стандартная тема | {...} | true -2 | Compact | Компактная | {...} | false -3 | Spacious | Просторная | {...} | false -``` - -**`pages` таблица — новые колонки:** -```sql -theme_id (FK -> page_themes) -custom_overrides (JSON) — индивидуальные переопределения -``` - -**Пример `styles` в теме:** -```json -{ - "typography": { - "font_family": "Inter", - "title_sizes": { "h1": "3xl", "h2": "2xl", "h3": "xl" }, - "body_size": "base", - "line_height": "relaxed" - }, - "spacing": { - "container": { "max_width": "screen-xl", "px": "4", "py": "10" }, - "content_gap": "space-y-5" - }, - "colors": { - "background": "white", - "text": "gray-900", - "accent": "primary" - }, - "borders": { - "radius": "rounded-lg", - "shadow": "shadow-sm" - } -} -``` - -**Filament админка:** -- CRUD для `PageTheme` (создание/редактирование тем) -- В `PageForm`: `Select::make('theme_id')->relationship('theme', 'name')` -- Опционально: overrides для конкретной страницы - -**Frontend:** -```vue - -``` - -**Плюсы:** -- ✅ **Масштабируемость** — одна тема применяется к множеству страниц -- ✅ **Безопасность** — админ не сломает стили (выбирает из готовых) -- ✅ **A/B тестирование** — легко менять темы -- ✅ Разделение ответственности: дизайнер создаёт темы, контент-менеджер выбирает - -**Минусы:** -- ❌ **Сложность реализации** — новая таблица, CRUD, UI для тем -- ❌ Требует больше времени на разработку -- ❌ Нужно менять `PageResource`, `RenderPageAction`, `Page.vue` - ---- - -### Решение 4: Custom CSS per Page (Полная свобода) - -**Концепция:** Позволить админу писать **произвольный CSS** для страницы. - -**Структура данных:** -```json -{ - "visual": { - "custom_css": "#page-area h1 { font-size: 2.5rem; color: #2D4191; }\n#page-area p { line-height: 1.8; }" - } -} -``` - -**Frontend:** -```vue -