Описание задачи
Сейчас расширения ставятся только через Marketplace (скачивание по URL). Нужна ручная установка из локального файла — по аналогии с импортом тем в Preferences → Appearance (openFile + VS Code JSON).
Пользователь должен иметь возможность выбрать .zip / .qext пакет с диска и установить его в ~/.querya/extensions/ без обращения к market.queryahub.com.
Зачем
- Разработка и отладка собственных расширений до публикации в маркетплейс
- Офлайн / air-gapped окружения
- Установка приватных / внутренних драйверов и скриптов
Предлагаемое UX
- Preferences (Settings) — новая секция Extensions (или блок в существующем диалоге):
- кнопка Install from file… →
file_selector с XTypeGroup(extensions: ['zip', 'qext'])
- опционально: Open extensions folder (как «Open themes folder»)
- краткий статус последней установки / ошибка
- Дополнительно (желательно): та же кнопка на вкладке Installed в
Extension Manager (extension_manager_dialog.dart)
Технические требования
Место в коде (ориентир)
- UI:
lib/features/settings/preferences_dialog.dart (+ новая секция)
- Core:
lib/core/market/marketplace_repository.dart или новый LocalExtensionInstaller
- Реестр:
lib/core/extensions/local_extension_registry.dart
- Аналог по UX:
PreferencesAppearanceSection._pickAndImportTheme
Acceptance Criteria
Scope
- Scope:
desktop
- Component:
Settings / Marketplace / Extensions
- Kind:
feature_request
Описание задачи
Сейчас расширения ставятся только через Marketplace (скачивание по URL). Нужна ручная установка из локального файла — по аналогии с импортом тем в Preferences → Appearance (
openFile+ VS Code JSON).Пользователь должен иметь возможность выбрать
.zip/.qextпакет с диска и установить его в~/.querya/extensions/без обращения кmarket.queryahub.com.Зачем
Предлагаемое UX
file_selectorсXTypeGroup(extensions: ['zip', 'qext'])Extension Manager(extension_manager_dialog.dart)Технические требования
HttpMarketplaceRepository.install, issue security(extensions): защита от Path Traversal при распаковке архивов тем и плагинов #242)manifest.json(ExtensionManifest)SandboxPolicy/ExtensionSupport(preview-only драйверы без валидногоsandbox.engine: process— отказ с понятным сообщением)database_driver—validateDriverPackage(наличиеmain)ExtensionPaths.extensionsDirectory()/<id>/LocalExtensionRegistry.reload()+ обновление UI.sha256/ пользователь ввёл checksumМесто в коде (ориентир)
lib/features/settings/preferences_dialog.dart(+ новая секция)lib/core/market/marketplace_repository.dartили новыйLocalExtensionInstallerlib/core/extensions/local_extension_registry.dartPreferencesAppearanceSection._pickAndImportThemeAcceptance Criteria
.zip/.qextи успешно установить валидное расширениеLocalExtensionRegistryScope
desktopSettings / Marketplace / Extensionsfeature_request