docs: add milestone 4b report (app settings + vault plugin state UI)
This commit is contained in:
parent
460ec92f31
commit
816ba5a062
|
|
@ -0,0 +1,122 @@
|
|||
# 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 capability
|
||||
- `RecordDesiredPlugin(id, version, source)` — записывает desired plugin
|
||||
- `ReloadPlugins()` — записывает 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
|
||||
|
||||
```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
|
||||
Loading…
Reference in New Issue