# Celena CMS — история изменений

## 3.6.1 — 2026-08-22

### Маркетплейс
- Кнопка «Обновить до v…» больше не показывается для платного пакета без сохранённой лицензии — сервер всё равно отклонял такое обновление ошибкой «нужен лицензионный ключ». Вместо кнопки — бейдж «Доступно обновление — нужна лицензия» и кнопка «Купить»; после ввода ключа кнопка обновления появляется. Исправлено и на странице пакета, и в карточках каталога.

### Правила для ИИ-ассистентов
- В корне дистрибутива появился файл `AGENTS.md` (и `CLAUDE.md`, `.cursor/rules/celena.mdc`, `.github/copilot-instructions.md`) — правила работы с движком для Claude, Cursor, Copilot и других ассистентов: какие каталоги перезаписываются при обновлении, как кастомизировать через плагины и темы, грабли кэша шаблонов и кросс-СУБД SQL. Свои дополнения пишите в `AGENTS.local.md` — движок его не трогает.
- Указатели на эти правила добавлены в заголовки `index.php`, `admin.php`, `core/bootstrap.php` и в файлы `core/AGENTS.md`, `modules/AGENTS.md`.
- Публичная документация: новый раздел «Правки с помощью ИИ» в `/docs` и машиночитаемый указатель `/llms.txt`.

### Плагины
- SEO Pro 1.0.1: убрано ложное предупреждение «Ядро CMS старше 3.6» на свежей установке плагина при актуальном ядре — версия ядра теперь авторитетна в обе стороны, рантайм-проверка хука осталась только для ядер без константы версии. Сбой записи служебного флага теперь пишется в лог, а не проглатывается.

## 3.6 — 2026-08-18

### Маркетплейс плагинов и тем
- Раздел **Маркетплейс** в панели (`/admin/marketplace`) переписан: вкладки Плагины / Темы / Обновления / Лицензии / Установленные / Настройки, поиск и фильтры, карточки с постерами, страница пакета с галереей скриншотов и требованиями.
- Установка плагинов **и тем** в один клик, обновление тем и плагинов, кнопка «Обновить все», активация и удаление тем прямо из маркетплейса.
- Проверка обновлений в фоне: бейдж с числом обновлений в меню, плашка на дашборде, уведомление о новой версии Celena CMS.
- Лицензии для платных пакетов: ввод ключа, проверка на сервере, покупка по ссылке из панели с автоприёмом ключа.
- Установка из маркетплейса проверяет sha256 и Ed25519-подпись пакета; при обновлении делается резервная копия старой версии с откатом при ошибке (`storage/backups/`).
- Настройки маркетплейса в панели: адрес реестра, публичный ключ, проверка связи.
- **Оценки пакетов**: на странице установленного пакета в панели появился блок «Оценка пакета» — 5 звёзд, средний балл и «ваша оценка»; оценить пакет может только сайт, где он установлен, повторная оценка заменяет прежнюю.
- Витрина маркетплейса показывает рейтинг: звёзды и число оценок в карточке каталога, блок «Оценки» на странице пакета — крупный средний балл и распределение оценок от 5 до 1.
- В карточках каталога маркетплейса в панели — рейтинг (звёзды, средний балл, число оценок) и число установок.
- Постер пакета в панели теперь во всю ширину карточки (каталог, «Установленные»), а на странице пакета — крупным кадром, который открывается в галерее.

### Оформление сайта
- **Редактор шаблонов темы: настоящий предпросмотр.** Справа от кода — фрейм, где страница показана в оформлении редактируемой темы (весь её CSS, шапка и подвал), даже если активна другая тема. Страничные шаблоны (`home`, `news_list`, `news_full`, `page`, `search`, `404`, кабинет, витрина магазина) рендерятся целиком с реальными данными сайта, партиалы — внутри обёртки темы; карточки материалов и товаров показываются сеткой из трёх записей. Фрейм обновляется по кнопке «Обновить» и сам через 0,8 с после остановки набора, показывая **несохранённый** текст; есть переключатель ширины (вся ширина / 1280 / 768 / 390) и ссылка «Открыть отдельно». Формы в предпросмотре не отправляются, ссылки открываются в новой вкладке.
- **Проверка вёрстки в редакторе шаблонов**: кнопка «Проверить» и авто-проверка при сохранении находят незакрытые блоки движка (`[if]`, `[foreach]`, `[news]` без закрывающего), несбалансированные HTML-теги, оборванные комментарии `{* … *}` и отсутствующие включаемые файлы. Список замечаний с номерами строк выводится над редактором, клик по номеру ставит курсор на строку; сохранение при этом не блокируется. Ошибка компиляции шаблона показывается в самом фрейме с текстом и строкой.
- Страница **Оформление → Шаблоны** переделана в сетку карточек: постер темы, название, версия, автор, отметка активной темы и кнопки «Активировать», «Редактор», «Удалить».
- Постером служит файл `screenshot.png` (1200×750) в каталоге темы; если его нет — картинка из маркетплейса, иначе плашка с буквой. Скриншоты добавлены темам default, commerce, marketplace и celena-agency.

### Ядро
- **Комментарии к новостям отправляются без перезагрузки страницы** во всех темах: комментарий появляется в списке сразу, при премодерации показывается «Комментарий отправлен и появится после проверки», ошибки подсвечивают нужное поле. Без JavaScript форма работает как раньше — обычная отправка с перезагрузкой.
- `.env` при установке создаётся с правами `0600`.
- Определение IP клиента за доверенным прокси (`X-Forwarded-For` только от 127.0.0.1/::1 или списка `TRUSTED_PROXIES` в `.env`).
- Установщик пакетов сверяет slug из манифеста с запрошенным; сброс opcache и кэша шаблонов после установки.
- Ссылки при наведении больше не подчёркиваются нигде (сайт, темы, панель).
- Исправлена геометрия пунктов с подменю в боковом меню панели.
- Константа версии `CELENA_VERSION` — единая точка правки.
- Рантайм: атрибут `data-theme-fixed` на `<html>` запрещает авто-переключение темы по времени суток (для светлых лендингов).
- Рантайм `celena.js` больше не перезаписывает глобальный объект `window.Celena`, а дополняет его (`refresh`, `setTheme`, `csrf`). Раньше API плагинов, зарегистрированные до загрузки рантайма (например `window.Celena.Shop` из плагина shop), стирались и были недоступны темам и другим плагинам. Версия подключения `celena.js?v=4` во всех темах.
- Панель: галерея скриншотов пакета с лайтбоксом на странице пакета в маркетплейсе; постеры во вкладке «Установленные».
- Тема marketplace: логотип celena.io, теги-чипы в каталоге, ширина контейнера 1540px.
- Витрина маркетплейса: вкладки на странице пакета, лайтбокс галереи со стрелками/клавиатурой/подписями; в реестре название пакета — ссылка на редактирование.
- Реестр: CSP разрешает переход на Stripe Checkout после отправки формы покупки (form-action).
- **Демо тем**: на странице бесплатной темы в маркетплейсе появилась кнопка «Демо» — она открывает сайт-полигон, оформленный этой темой. Ссылка живёт 20 минут, работает без регистрации и не индексируется поисковиками; у платных пакетов демо нет.
- **Хук `template.output`** (`core/Template/Engine.php`): фильтр над готовым HTML страницы (`$html, $template, $theme`), вызывается один раз на верхнеуровневый `render()`. Плагины (SEO Pro, Popups, Reviews Pro, Social Login, Newsletter, Nova Poshta) вставляют через него мета-теги, JSON-LD, виджеты и кнопки перед `</head>`/`</body>`, не требуя правок тем. Без подписчиков поведение прежнее.
- **Безопасность панели: защита в глубину для маршрутов плагинов.** `Router` автоматически навешивает `AuthMiddleware` на любой маршрут `/admin/*`, зарегистрированный вне группы панели (так подключаются все плагины). Раньше гость или покупатель (роль `customer`) мог открыть админ-страницу плагина, если её контроллер проверял только факт входа — теперь гость уходит на `/admin/login`, покупатель — на `/account`. `/admin/login` и `/admin/logout` не затронуты.
- Панель документации плагина (`/admin/docs/plugin-panel?slug=`) не находила плагины со знаком подчёркивания в slug (`seo_pro`, `stripe_pay`): `Filter::slug()` превращал `_` в `-`. Теперь slug валидируется без транслитерации. Пункт «Документация» в подменю плагина — без эмодзи.

### Плагины из комплекта
- **leads**: форма заявки по умолчанию без привязки к конкретному сайту; получатель писем — из настроек сайта.
- **handbook**: раздел документации дополнен страницей об обновлении CMS.
- **shop 1.2.0**: точка расширения для платёжных шлюзов — фильтр `shop.checkout.redirect` после создания заказа (шлюз возвращает URL своей страницы оплаты), хелпер `Support\OrderPayments` (`markPaid`/`markRefunded`/`note`, идемпотентно, события `shop.order.paid`, `shop.order.refunded`), событие `shop.order.created` дополнено `grand_total`, `currency`, `payment_method_id/slug/kind`; страница «Спасибо» получает `order.payment_status`. Документация `docs/hooks.md` («Платёжные шлюзы»). Убраны упоминания ЮKassa.
- **Новые плагины в маркетплейсе (19.08.2026; в комплект ядра не входят, ставятся из панели «Маркетплейс»):**
  - **stripe_pay** (платный, €29): новый платёжный шлюз Stripe для магазина — Checkout Session, вебхук с проверкой Stripe-Signature и идемпотентностью по event.id, возвраты (полный/частичный) из админки, журнал платежей, режимы test/live, ссылка «оплатить позже».
  - **paypal_pay** (платный, €29): новый платёжный шлюз PayPal для магазина — Orders v2 (create → approve → capture), OAuth2 с кэшем токена, вебхуки с проверкой подписи через verify-webhook-signature и идемпотентностью, возвраты из админки, журнал, режимы sandbox/live.
  - **liqpay_pay** (платный, €19): новый плагин — приём оплат LiqPay (Checkout v3, подписанный колбэк с идемпотентностью, песочница, полный и частичный возврат, журнал платежей, проверка ключей).
  - **novaposhta_shipping** (платный, €19): новый плагин — доставка Новою Поштою (виджет выбора отделения/почтомата на чекауте через template.output, кэш справочников, три режима тарифа, ТТН и трекинг).
  - **seo_pro** (бесплатный): шаблоны title/description по типам страниц с плейсхолдерами, переопределения по URL, Open Graph и Twitter cards без дублей, JSON-LD (WebSite, Organization, BreadcrumbList), XML-карта сайта по правилам с перехватом /sitemap.xml, редактор robots.txt, редиректы 301/302 с масками и импортом CSV, монитор 404 с кнопкой «сделать редирект».
  - **reviews_pro** (бесплатный): отзывы с оценкой 1–5 и фото для товаров, статей и страниц; модерация с ответами магазина и колокольчиком, голоса «полезно», блок-тег [reviews_pro] и inline-сводка, авто-встраивание виджета, JSON-LD aggregateRating, антиспам (CSRF, honeypot, лимит по IP), безопасная загрузка фото через GD и письма-приглашения после доставки заказа.
  - **newsletter** (платный, €19): подписка с double opt-in и honeypot, списки-сегменты, кампании со статистикой открытий и кликов, отправка батчами через cron-эндпоинт, синхронизация с Brevo и Mailchimp, импорт/экспорт CSV, форма тегом {newsletter_form} и авто-встраивание в подвал.
  - **popups** (бесплатный): модальные окна, промо-полосы, slide-in и GDPR cookie-баннер с журналом согласий; триггеры задержки/скролла/exit-intent/клика, таргетинг по URL, устройству, языку и типу посетителя, частота показов, статистика показов/кликов/закрытий и форма подписки внутри попапа при активном newsletter.
  - **social_login** (бесплатный): вход в кабинет через Google/Facebook/Apple (OAuth 2.0 + OpenID Connect, PKCE, проверка id_token по JWKS), автовставка кнопок на страницы входа и регистрации, вкладка кабинета «Соцсети» с привязкой/отвязкой, журнал входов и настройки провайдеров в админке.
  - **backup** (платный, €29): резервные копии базы и файлов чистым PHP (дамп MySQL/PostgreSQL, zip-архив, полная копия одним файлом), расписание через cron-эндпоинт и CLI, ротация, хранение в S3-совместимых бакетах с подписью SigV4, восстановление из копии или загруженного файла со страховочным бэкапом, журнал заданий и уведомления на почту.

### Темы
- Новые темы в маркетплейсе (бесплатно, в комплект ядра не входят): **Newsroom** и **Boutique** (спокойные, минималистичные), **Prism** и **Lumen** (блог/журнал со слайдерами, «историями», reveal-анимациями), **Vertex** и **Bloom** (магазины: промо-слайдеры, «сделки дня», быстрый просмотр, Lookbook, анимированные кнопки). Все — без внешних шрифтов и библиотек, адаптивные, с уважением prefers-reduced-motion.
- Стандарт `screenshot.png` 1200×750 в корне темы — показывается в панели «Шаблоны» и в маркетплейсе.
- **Исправлено количество товара в корзине во всех новых темах.** В Boutique, Vertex и Bloom кнопки «−»/«+» меняли только цифру на экране, а корзина и сумма оставались прежними — теперь тема пишет изменения сама и не зависит от того, доступен ли ей API плагина магазина (Boutique 1.0.2, Vertex 1.0.1, Bloom 1.0.1). В Newsroom, Prism и Lumen кнопок «−»/«+» не было вовсе — они добавлены, а таблица корзины получила оформление в стиле темы (Newsroom, Prism, Lumen 1.0.1).
- **commerce**: исправлен промо-баннер (`_partials/promo_banner.tpl`) — из-за последовательности `*}` внутри комментария шаблона комментарий обрывался раньше времени, и хвост служебного текста печатался над баннером. Найдено новой проверкой вёрстки в редакторе шаблонов.
- **Вторая волна тем в маркетплейсе (19.08.2026, бесплатно, в комплект ядра не входят):** **Studio** (портфолио/агентство: графит + неоновый лайм, hero со сменой слов, сетка работ с фильтром по рубрикам без перезагрузки, счётчики, слайдер отзывов, форма заявки в плагин leads), **Horizon** (первая тёмная тема каталога: техно-медиа на #0b0f14 с янтарём, бегущая строка «Breaking», hero-слайдер с крупными датами, колонка «Тренды» со спарклайнами, тёмный кабинет и магазин), **Marketo** (маркетплейс: мега-меню категорий, hero-баннер с промо-плитками, полки-слайдеры товаров, «товар дня» с таймером, каталог с чипами-фильтрами, липкая мини-корзина), **Cafe** (ресторан/доставка: hero-слайдер блюд с зумом Ken Burns, меню табами с карточками «+ Add → − N +», бронь столика, карта-плейсхолдер без внешних API, чекаут под доставку с адресом и слотами времени, мобильная кнопка «Order»), **Folio** (личный блог/подкаст: воздушная вёрстка с горчичным акцентом, hero об авторе с анимированной подписью, лента с крупными датами, стилизованный аудиоплеер, оглавление статьи, единственная тема с переключателем light/dark на ядровых кнопках). Все — системные sans-шрифты, без CDN, слайдеры на scroll-snap, reveal по IntersectionObserver, prefers-reduced-motion, адаптив 1200/900/620; полный набор шаблонов (лента, статья с AJAX-комментариями, поиск, 404, кабинет, магазин с корзиной на localStorage). Исключены из архива ядра (`bin/build-dist.php`).

### Личные пакеты
- Файл-маркер `.private` в корне плагина или темы (или `"private": true` в манифесте) исключает пакет из сборки релиза, из публикации в маркетплейс и из проверки обновлений.

## 3.5 — 2026-07-02
- Первый публичный релиз.
