# Milestone 4 — App Settings + Vault Plugin State + First Run UI **Дата:** 2026-06-17 **Статус:** ✅ Завершён ## Цель Сделать нормальную модель настроек приложения, выбор vault при первом запуске, и enable/disable плагинов через vault plugin state. ## Что сделано ### 1. App Settings Core (`internal/core/appsettings/`) - `manager.go` — Load/Save/Update, recent vaults, defaults, corrupt config recovery - `manager_test.go` — 6 тестов - Хранение: `~/.config/verstak/config.json` - Поля: currentVaultPath, recentVaults, theme, devMode, userPluginsDir, windowState, lastOpenedAt - Правила: defaults при отсутствии, backup+recovery при битом config, без secrets ### 2. Vault Plugin State (`internal/core/pluginstate/`) - `manager.go` — enable/disable, desired plugins, missing-installed tracking - `manager_test.go` — 7 тестов - Хранение: `/.verstak/plugins.json` - Поля: enabledPlugins, disabledPlugins, desiredPlugins, updatedAt - Installed ≠ Enabled ≠ Desired ### 3. Wails API (app.go) - `GetAppSettings()` / `UpdateAppSettings(patch)` / `SetCurrentVault(path)` - `GetVaultPluginState()` / `EnablePlugin(id)` / `DisablePlugin(id)` - `SetCurrentVault` вызывает `OpenVault` + сохраняет в app settings + загружает plugin state ### 4. First Run / Vault Selection UI (VaultSelection.svelte) - Показывается когда currentVaultPath пустой или vault не открывается - Create New Vault → CreateVault → OpenVault → SetCurrentVault - Open Existing Vault → OpenVault → SetCurrentVault - Recent Vaults → OpenVault → SetCurrentVault - Понятные ошибки при неудаче ### 5. Sidebar Navigation (Sidebar.svelte) - Ширина 220px, фиксированная - Навигация: Plugin Manager - Plugin sidebar items (из contributions) - Vault status indicator - Отступы и hover-эффекты ### 6. Plugin Manager Integration - Enable/Disable toggle в PluginCard - Disabled plugin не регистрирует capabilities/contributions - Missing installed plugins — отдельная секция - Vault state загружается при открытии ### 7. Layout Fixes - App.svelte: global reset (margin, padding, box-sizing) - PluginManager: отступы header, border-bottom separator - Content area: padding 1.5rem ## Тесты - `go test ./...` — 52 PASS (6 appsettings + 7 pluginstate + 39 previous) - `./scripts/check.sh` — ✅ - `./scripts/smoke-platform.sh` — ✅ (enable/disable/plugins.json verification) - `./scripts/build.sh` — ✅ ## Структура файлов ``` ~/.config/verstak/config.json ← app settings (local) /.verstak/plugins.json ← vault plugin state /.verstak/plugin-settings// ← per-plugin settings /.verstak/plugin-data// ← per-plugin data /.verstak/plugin-cache// ← per-plugin cache ``` ## Пример plugins.json ```json { "schemaVersion": 1, "enabledPlugins": ["verstak.platform-test"], "disabledPlugins": [], "desiredPlugins": [ { "id": "verstak.platform-test", "version": "0.1.0", "source": "official" } ], "updatedAt": "2026-06-17T..." } ``` ## Исправление отчёта Milestone 3 В отчёте Milestone 3 была арифметическая ошибка: написано "24/24 PASS", реально — **39 PASS** (16 plugin + 8 storage + 7 vault + 8 other). Исправлено в документации. ## Что НЕ сделано (будет в следующих milestone) - Notes/files/editor/sync plugins - Plugin marketplace/distribution - Auto-install plugins - Advanced window state management