4.8 KiB
4.8 KiB
Milestone 4b — App Settings + Vault Plugin State (UI Completion)
Цель
Довести Milestone 4 до пользовательски завершённого состояния:
- При первом запуске можно выбрать/создать vault
- После выбора путь сохраняется в app settings
- При следующем запуске vault открывается автоматически
- Plugin Manager умеет enable/disable plugins через vault plugin state
Что сделано
1. First Run / Vault Selection UI
Новый компонент VaultSelection.svelte:
- Экран показывается если
currentVaultPathпустой или vault не открывается - Create new vault →
CreateVault(path)→SetCurrentVault(path) - Open existing vault →
SetCurrentVault(path) - Recent vaults из app settings
- Понятная ошибка если vault не открылся
- После успеха → событие
verstak:vault-opened→ переход в основной UI
2. App Startup Flow
Обновлён App.svelte:
- При монтировании:
GetAppSettings()+GetVaultStatus() - Если
currentVaultPathпустой или vault не open →needsVaultSelection = true - Показывает
VaultSelectionили основной UI - Слушает
verstak:vault-openedдля перехода - Добавлены отступы:
padding: 1.5remна.content
3. Plugin Manager Enable/Disable
Обновлён PluginCard.svelte:
- Кнопка "▶ Enable" если plugin disabled
- Кнопка "⏸ Disable" если plugin enabled
- Скрыты если vault не открыт (показывается hint)
- Скрыты если plugin failed/incompatible
Обновлён PluginManager.svelte:
enablePlugin(id)→EnablePlugin(id)→reload()disablePlugin(id)→DisablePlugin(id)→reload()- Загрузка
vaultPluginStateпри vault open - Вычисление
missingInstalledиз desired plugins
4. Missing Installed Plugins UI
Новый блок в PluginManager.svelte:
- Показывает desired plugins которых нет локально
- Карточка с красной рамкой и статусом "missing"
- Показывает source если известен
- Auto-install НЕ делается
5. Backend Changes
internal/api/app.go:
SetCurrentVault(path)— открывает vault, сохраняет в app settings, загружает plugin state, регистрирует vault capabilityRecordDesiredPlugin(id, version, source)— записывает desired pluginReloadPlugins()— записывает desired plugins при discovery (только если vault open)
main.go:
- Запись desired plugins при первичной загрузке (только если vault open)
internal/core/appsettings/manager.go:
- Исправлен
addRecent()— убран дублирующий sort
6. Smoke Test
Обновлён scripts/smoke-platform.sh:
- Добавлен
-test-enable-disableфлаг - Создаёт temp vault, открывает, загружает plugin state
- Disable → проверяет IsDisabled/IsEnabled
- Enable → проверяет IsEnabled/IsDisabled
- Проверяет
plugins.jsonна диске
Верификация
| Команда | Результат |
|---|---|
go test ./... |
✅ все тесты проходят |
./scripts/check.sh |
✅ go vet + gofmt + go mod tidy |
./scripts/smoke-platform.sh |
✅ discovery + enable/disable |
./scripts/build.sh |
✅ wails build OK |
Хранение данных
| Что | Где | Назначение |
|---|---|---|
| App settings | ~/.config/verstak/config.json |
Локальные настройки установки |
| Vault plugin state | <vault>/.verstak/plugins.json |
Enabled/disabled/desired plugins |
| Plugin settings | <vault>/.verstak/plugin-settings/<id>/settings.json |
Настройки конкретного плагина |
Пример plugins.json
{
"schemaVersion": 1,
"enabledPlugins": ["verstak.platform-test"],
"disabledPlugins": [],
"desiredPlugins": [
{
"id": "verstak.platform-test",
"version": "0.1.0",
"source": "official"
}
],
"updatedAt": "2026-06-17T04:00:00Z"
}
Статус platform-test
- После enable: DEGRADED (optional sync missing)
- После disable: status = disabled, capabilities/contributions исчезают
- После enable обратно: DEGRADED снова
Что НЕ сделано
- Notes/files/editor/sync
- Auto-install plugins
- Plugin marketplace/distribution
- Sync capability