Описание задачи
Сейчас расширения ставятся только через 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)
Технические требования
- Распаковка архива с защитой от path traversal (как в 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
- Опционально: проверка SHA-256, если рядом лежит .sha256 / пользователь ввёл checksum
- Юнит-тесты на happy path + path traversal + невалидный manifest
Место в коде (ориентир)
- 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
- Из Preferences можно выбрать локальный .zip/.qext и успешно установить валидное расширение
- Невалидный пакет / path traversal / preview-only без sandbox — понятная ошибка, файлы не остаются в half-installed состоянии
- После установки расширение видно во вкладке Installed Extension Manager и в LocalExtensionRegistry
- Есть тесты на установку из локального архива
Scope
- Scope: desktop
- Component: Settings / Marketplace / Extensions
- Kind: feature_request
Reactions are currently unavailable
Описание задачи
Сейчас расширения ставятся только через Marketplace (скачивание по URL). Нужна ручная установка из локального файла — по аналогии с импортом тем в Preferences → Appearance (openFile + VS Code JSON).
Пользователь должен иметь возможность выбрать .zip / .qext пакет с диска и установить его в ~/.querya/extensions/ без обращения к market.queryahub.com.
Зачем
Предлагаемое UX
Технические требования
Место в коде (ориентир)
Acceptance Criteria
Scope