verstak-docs/docs/MILESTONE_PLATFORM_RUNTIME_...

123 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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