diff --git a/docs/MILESTONE_PLATFORM_RUNTIME_4.md b/docs/MILESTONE_PLATFORM_RUNTIME_4.md new file mode 100644 index 0000000..dc87f22 --- /dev/null +++ b/docs/MILESTONE_PLATFORM_RUNTIME_4.md @@ -0,0 +1,100 @@ +# Milestone 4 — App Settings + Vault Plugin State + +## Что реализовано + +### App Settings Core +- Пакет `internal/core/appsettings/` +- Хранение: `~/.config/verstak/config.json` +- API: Load, Save, Update, SetCurrentVault, ClearCurrentVault +- Поля: currentVaultPath, recentVaults, theme, devMode, userPluginsDir, windowState +- Auto-open vault при запуске если currentVaultPath валиден +- Corrupt config → backup + defaults с понятной ошибкой + +### Vault Plugin State +- Пакет `internal/core/pluginstate/` +- Хранение: `/.verstak/plugins.json` +- API: Load, Save, EnablePlugin, DisablePlugin, IsEnabled, IsDisabled, RecordDesiredPlugin, ListMissingInstalled +- Disabled plugin не регистрирует provides/contributions +- Desired plugins для будущей синхронизации +- Missing installed plugins tracking + +### Wails API +- GetAppSettings, UpdateAppSettings +- GetVaultPluginState, EnablePlugin, DisablePlugin + +### Lifecycle Integration +- main.go: init app settings → auto-open vault → init plugin state → plugin discovery +- Disabled plugins пропускаются в lifecycle (не регистрируют capabilities/contributions) +- ReloadPlugins: проверка disabled state + +## Тесты + +### App Settings (6 тестов) +- TestLoad_DefaultCreation +- TestLoad_CorruptConfig +- TestSetCurrentVault +- TestRecentVaults_NoDuplicates +- TestUpdate_Patch +- TestAppSettings_NotInsideVault + +### Plugin State (7 тестов) +- TestLoad_DefaultCreation +- TestEnableDisable +- TestDisablePlugin_Persists +- TestRecordDesiredPlugin +- TestMissingInstalled +- TestCorruptPluginsJSON +- TestVaultClosed_StateUnavailable + +## Верификация + +| command | result | notes | +|---------|--------|-------| +| `go test ./...` | ✅ | 52 PASS (39 prev + 6 appsettings + 7 pluginstate) | +| `./scripts/check.sh` | ✅ | go vet + gofmt + go mod tidy OK | +| `./scripts/build.sh` | ✅ | wails build OK | + +## Структура файлов + +``` +~/.config/verstak/ + config.json — app settings (local, NOT in vault) + +/ + .verstak/ + vault.json — vault metadata + plugins.json — vault plugin state + plugin-data/ — per-plugin data namespace + plugin-settings/ — per-plugin settings namespace + plugin-cache/ — per-plugin cache namespace +``` + +## Пример 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..." +} +``` + +## Статус platform-test +- DEGRADED — только из-за missing optional `verstak/core/sync/v1` +- Enable/disable работает через vault plugin state +- При disabled: provides не регистрируются, contributions не показываются +- При enabled: всё возвращается + +## Что НЕ сделано +- Notes/files/editor/sync +- Auto-install plugins +- First Run / Vault Selection UI (только backend, UI не готов) +- Plugin Manager enable/disable toggle (только backend API)