Это потрясающая новость! Разработка собственного маркетплейса параллельно с клиентом — это переход от создания просто "инструмента" к созданию полноценной экосистемы (как у VS Code или Obsidian). Это невероятно мощный драйвер для роста сообщества и получения звезд на GitHub.
Чтобы Querya Desktop оставалась легковесной, функционал маркетплейса должен быть реализован архитектурно грамотно: ядро ничего не знает о логике плагинов, оно лишь предоставляет интерфейс (API) для их загрузки и применения.
Вот подробное техническое задание (ТЗ) на создание менеджера расширений и задел для интеграции с твоим будущим маркетом. ТЗ 3: Встроенный Менеджер Расширений и Интеграция с Маркетплейсом
Цель: Создать в интерфейсе Querya Desktop выделенный раздел для управления дополнениями (темами, UI-твиками, коннекторами) и заложить сетевую/файловую архитектуру для связи с внешним API маркетплейса.
- UI/UX: Раздел «Extensions» (В стиле VS Code)
В интерфейсе приложения (например, в левом боковом меню) появляется новая иконка (🧩 Пазл).
Структура раздела:
Левая панель (Навигация и Поиск):
Строка поиска (с debounce-задержкой, чтобы не спамить API твоего маркета).
Вкладки-фильтры: Installed (Установленные), Explore (Поиск по маркету), Updates (Доступные обновления).
Центральная панель (Список):
Карточки расширений с использованием компонентов shadcn_flutter.
На карточке: Иконка, Название, Автор, Рейтинг (⭐), Бейдж типа (Theme, Plugin, Driver) и кнопка Install / Uninstall.
Правая панель (Детали - Markdown View):
При клике на карточку справа открывается подробное описание (парсится из README расширения), скриншоты и Changelog.
- Архитектура: Задел под Маркетплейс (Сетевой слой)
В директории lib/core/ необходимо создать новый модуль market/, который будет отвечать за связь с твоим бэкендом.
Ожидаемые контракты (Интерфейсы для будущего API): Мобильный/десктопный клиент должен общаться с маркетом через четкие модели данных. Тебе нужно заложить класс ExtensionManifest, который клиент будет ожидать от бэкенда: Dart
class ExtensionManifest { final String id; // e.g., 'reei.cyberpunk-theme' final String name; // 'Cyberpunk 2077 Theme' final String type; // 'theme', 'sql-formatter', 'visualizer' final String version; // '1.0.2' final String downloadUrl; // Ссылка на .zip или .json в твоем хранилище final String sha256Checksum; // КРИТИЧНО: Хэш для проверки целостности }
Абстракция клиента (MarketplaceClient): Сделай интерфейс, чтобы сейчас его можно было замокать (Mock), а потом просто подставить реальный HTTP-клиент:
Future<List<ExtensionManifest>> fetchTrending()
Future<List<ExtensionManifest>> search(String query)
Future<File> downloadExtension(String downloadUrl)
- Файловая система и Безопасность (Локальный слой)
Querya Desktop — это клиент базы данных, поэтому безопасность (особенно при скачивании сторонних файлов) — приоритет №1.
Директории: При старте приложение должно проверять и создавать папки в домашней директории пользователя:
Linux/macOS: ~/.querya/extensions/themes/ и ~/.querya/extensions/plugins/
Windows: %APPDATA%\Querya\extensions\
Процесс установки (Флоу):
Пользователь жмет Install.
Приложение скачивает файл во временную папку.
Сверяет sha256 скачанного файла с тем, что отдал API маркета.
Распаковывает в нужную папку внутри ~/.querya/extensions/.
Обновляет локальную базу данных SQLite (таблица installed_extensions).
Изоляция (Sandboxing): На первом этапе (для тем) это просто JSON файлы, они безопасны. Но в ТЗ нужно указать, что исполняемые плагины в будущем должны загружаться как изолированные модули (например, через Dart Isolates или WASM), чтобы плагин не мог украсть креды от БД из ОС.
- Стейт-менеджмент (Управление состояниями)
Для бесшовного опыта нужно создать ExtensionProvider (или использовать Bloc/Riverpod — в зависимости от того, что у вас в lib/core/).
Отслеживаемые состояния:
isMarketReachable: Проверка, доступен ли сервер маркета (если нет — показываем только вкладку Installed с заглушкой "Marketplace offline").
downloadProgress: Мапа Map<String, double> для отображения прогресс-баров загрузки на кнопках Install.
requireRestart: Флаг. Некоторым темам (или сложным плагинам) может потребоваться перезапуск приложения или сброс кэша редактора. Если флаг true, показываем всплывающий Toast (через shadcn_flutter).
Маркетинговый совет для GitHub (Как использовать маркетплейс для звезд):
Когда ты сделаешь этот раздел, добавь в README.md красивый бейдж: [🔌 Querya Extension Market: Live]
И напиши блок:
Build your own tools for Querya
Querya Desktop features a built-in Marketplace. Don't like our UI? Download a new theme. Need a specific data visualizer? Write a plugin and publish it to the Querya Market in 5 minutes.
Как тебе такой план? Если концепция ясна, мы можем углубиться в то, как именно ThemeParser (из предыдущего ТЗ) будет автоматически подхватывать свежескачанные JSON-файлы из папки ~/.querya/extensions/themes/ без перезагрузки приложения!