Skip to content

enhancement(settings): allow manual install of extensions from local .zip/.qext files #316

Description

@ZhuchkaTriplesix

Описание задачи

Сейчас расширения ставятся только через Marketplace (скачивание по URL). Нужна ручная установка из локального файла — по аналогии с импортом тем в Preferences → Appearance (openFile + VS Code JSON).

Пользователь должен иметь возможность выбрать .zip / .qext пакет с диска и установить его в ~/.querya/extensions/ без обращения к market.queryahub.com.

Зачем

  • Разработка и отладка собственных расширений до публикации в маркетплейс
  • Офлайн / air-gapped окружения
  • Установка приватных / внутренних драйверов и скриптов

Предлагаемое UX

  1. Preferences (Settings) — новая секция Extensions (или блок в существующем диалоге):
    • кнопка Install from file…file_selector с XTypeGroup(extensions: ['zip', 'qext'])
    • опционально: Open extensions folder (как «Open themes folder»)
    • краткий статус последней установки / ошибка
  2. Дополнительно (желательно): та же кнопка на вкладке 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_drivervalidateDriverPackage (наличие 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

Metadata

Metadata

Labels

enhancementNew feature or requestmarketplaceExtensions marketplace, ExtensionManifestsettingsTheme parser epic label: settingsuiUser interface components and widgets

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions