y83 code / инструмент

Что нового

История изменений проекта прямо в приложении: что добавили, что поменяли, что починили — по каждому релизу, и для приложения, и для backend.

раздел реестра
Система
код
599 строк в 6 файлах
документ
30-changelog.md
Раздел: System
Идентификатор: changelog · Экран: ui/changelog/ (6 файлов, ~600 строк)
Снимок: 2026-10-11

1. Зачем и что это

Источник данных — генерируемый из CHANGELOG.md файл app/src/main/assets/changelog.json. То есть в приложение попадает ровно то, что написано в репозитории: отдельной «правки релизов под телефон» не существует.

2. Как попасть

Хаб инструментов → секция System → карточка «Что нового» (hub_changelog_title, подпись «Что изменилось в каждом релизе», тайл — «История»).

Откуда ещёПуть
Мостapp_navigate с screen: "changelog"

Маршрут: Screen.kt → MainRouter (ChangelogScreen).

3. Экран: элементы и действия

ЭлементЧто делает
ШапкаПромпт и мета: «N releases · A app · B backend»
Фильтр по областиAll / App / Backend
ПоискПо версии и тексту пунктов
Список релизовКарточки по версиям, новые сверху
Разделы релиза[+] Added, [~] Changed, [x] Fixed, [-] Removed, [>] Debug, [↑] Performance, [i] Diagnostics
Отметка установленной версииРелиз, совпадающий с установленным, помечается
Локальные датыМесяцы переводятся на язык интерфейса

4. Возможности подробно

Генерация JSON

Задача Gradle generateChangelogJson (app/build.gradle.kts:200) парсит CHANGELOG.md построчно:

ЭлементРегулярка
Релиз^## \[version\] — дата
Раздел^### Тип
Пункт^- текст

Продолжения пунктов (строки с отступом) склеиваются с предыдущим пунктом — без этого длинные описания молча терялись и в приложении пункт обрывался.

Задача подключена к preBuild, поэтому changelog.json перегенерируется при каждой сборке; файл помечен как output и обновляется только при изменении CHANGELOG.md.

Формат на выходе: [{"version": "...", "date": "...", "sections": [{"type": "Added", "items": ["…"]}]}].

Модель данных

ChangelogEntry(version, date, sections) и ChangelogSection(type, items). Разбор приложением идёт с ignoreUnknownKeys = true, так что лишние поля в JSON не ломают чтение.

Кэш

ChangelogRepository держит разобранный список в поле cached и читает assets один раз за процесс. Ошибка чтения или разбора даёт пустой список, а не падение.

Области релизов

changelogScopeOf определяет область по версии: если она начинается с backend (без учёта регистра) — это релиз backend, иначе — приложения. Заголовок показывает разбивку: «12 releases · 8 app · 4 backend».

Маркеры разделов

Тип в CHANGELOG.mdМаркер
Added[+]
Changed[~]
Fixed[x]
Removed[-]
Debug[>]
Performance[↑]
Diagnostics[i]

Даты

changelogDisplayDate переводит названия месяцев: берутся два массива ресурсов (исходный и локализованный) и делается замена подстрок. Сделано чистой функцией с параметрами по умолчанию, чтобы тестировать без Android-контекста.

Установленная версия

changelogIsInstalled сравнивает базовую часть версии (до дефиса, без префикса v, в нижнем регистре) с установленной versionName. Отметка ставится только для релизов приложения — у backend нет «установленной версии» в смысле APK.

5. Данные: БД, файлы, настройки

ЧтоГде лежитКак меняетсяКто читает
ИсходникCHANGELOG.md в корне репозиторияВручную, в коммитеGradle-задача
Данные для приложенияapp/src/main/assets/changelog.jsonГенерируется при сборкеChangelogRepository
МесяцыR.array.changelog_months_source / …_localizedРесурсыФорматирование дат

6. Backend: REST/роуты

Неприменимо: changelog полностью статичен и читается из assets приложения.

7. Мост и MCP

ЧтоКакПримечание
Открыть экранapp_navigate с screen: "changelog"BridgeScreenCatalog
Прочитать changelogfile_read (профиль /mcp) на CHANGELOG.mdАгенту нужен исходник, а не JSON

8. Настройки, конфиг, квоты и лимиты

ПараметрЗначениеГде задаётся
Формат заголовка## [version] — датаРегулярка в Gradle-задаче
Формат раздела### ТипТо же
Формат пункта- текстТо же
Типов разделов7changelogSectionMarker

9. Ловушки и ограничения

  • Формат CHANGELOG.md жёсткий. Заголовок другого вида (## 0.8.131 — 01.11.2026 без скобок) не распарсится, и релиз просто не появится.
  • Тип раздела должен быть одним словом (### Added, не ### Добавлено), иначе маркер будет [~] по умолчанию.
  • Файл большой (~390 КБ JSON). Он лежит в assets и читается один раз за процесс, но попадает в APK целиком.
  • Кэш живёт только в процессе. После перезапуска приложения файл читается заново.
  • Пометка «установлено» работает только для app-релизов и сравнивает базовую часть версии — сборка с суффиксом даты (0.8.131-261011) считается той же версией, что и 0.8.131.
  • Месяцы переводятся заменой подстрок, поэтому нестандартный формат даты останется как есть.
  • Файл генерируется, поэтому ручные правки changelog.json пропадут при следующей сборке.

10. Источники правды

  • app/src/main/java/com/y83/ws/ui/changelog/ChangelogScreen.kt — экран, фильтры, поиск.
  • app/src/main/java/com/y83/ws/ui/changelog/ChangelogCards.kt — карточки релизов и разделов.
  • app/src/main/java/com/y83/ws/ui/changelog/ChangelogFormat.kt — форматирование, маркеры, даты.
  • app/src/main/java/com/y83/ws/ui/changelog/ChangelogRepository.kt — чтение assets и кэш.
  • app/src/main/java/com/y83/ws/ui/changelog/ChangelogViewModel.kt — состояние.
  • app/build.gradle.kts:200–264 — задача generateChangelogJson и её подключение к preBuild.
  • CHANGELOG.md — источник истины по изменениям.

Источник: docs/project/hub/30-changelog.md · Система · 599 строк в 6 файлах. Страница собирается из документации проекта при сборке сайта.