docs: deduplicate sections, add UI layout and milestone 4b

This commit is contained in:
mirivlad 2026-06-17 07:33:36 +08:00
parent 7530e21dfd
commit ca089a82e9
1 changed files with 33 additions and 83 deletions

View File

@ -342,93 +342,43 @@ Vault plugin state хранится **внутри vault** в `.verstak/plugins.
- Auto-install пока НЕ делается - Auto-install пока НЕ делается
- Показывается подсказка: "Install official plugin package" - Показывается подсказка: "Install official plugin package"
## App Settings
App settings хранятся локально (НЕ внутри vault): `~/.config/verstak/config.json` ## UI Layout
Поля: ```
- `currentVaultPath` — путь к текущему vault ┌─────────────────────────────────────────────────────┐
- `recentVaults` — список недавних vault (max 10, без дублей) │ App.svelte │
- `theme` — тема (dark/light) │ ┌──────────┬──────────────────────────────────────┐ │
- `devMode` — режим разработки │ │ Sidebar │ Content area │ │
- `userPluginsDir` — директория пользовательских плагинов │ │ │ │ │
- `windowState` — состояние окна │ │ Verstak │ PluginManager | ViewContainer │ │
- `lastOpenedAt` — время последнего открытия │ │ │ │ │
│ │ 🧩 Plugin│ (padding: 1.5rem) │ │
API: │ │ Manager│ │ │
- `LoadAppSettings()` / `SaveAppSettings()` / `GetAppSettings()` │ │ │ │ │
- `UpdateAppSettings(patch)` — частичное обновление │ │ Plugins │ │ │
- `SetCurrentVault(path)` — установить текущий vault + открыть + сохранить │ │ 📌 item1 │ │ │
│ │ 📌 item2 │ │ │
Правила: │ │ │ │ │
- Если config отсутствует — создать defaults │ │ ● Vault │ │ │
- Если config битый — backup + создать defaults + вернуть ошибку │ └──────────┴──────────────────────────────────────┘ │
- `currentVaultPath` не обязан существовать, но при запуске проверяется └─────────────────────────────────────────────────────┘
- Secrets НЕ хранятся в app settings
## Vault Plugin State
Vault plugin state хранится внутри vault: `<vault>/.verstak/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"
}
``` ```
API: - **Sidebar** (220px): навигация (Plugin Manager), plugin sidebar items, vault status
- `LoadVaultPluginState()` / `SaveVaultPluginState()` - **Content**: Plugin Manager или ViewContainer в зависимости от выбранного view
- `IsPluginEnabled(id)` / `IsPluginDisabled(id)` - **Vault Selection**: полноэкранный экран, показывается когда vault не открыт
- `EnablePlugin(id)` / `DisablePlugin(id)`
- `RecordDesiredPlugin(id, version, source)`
- `ListMissingInstalled(installedIDs)`
Правила: ## Milestone 4b — UI Completion (2026-06-17)
- Enabled/disabled состояние относится к конкретному vault
- Если vault закрыт — plugin state недоступен
- Plugin settings остаются в `.verstak/plugin-settings/<id>/settings.json`
- Отсутствие `plugins.json` — создать defaults
- Битый `plugins.json` — backup + создать defaults + ошибка
## First Run / Vault Selection Flow Сделано:
- VaultSelection.svelte: исправлен flow (CreateVault → OpenVault → SetCurrentVault)
- Sidebar.svelte: полная навигация с отступами, plugin sidebar items, vault status
- App.svelte: обработка `verstak:nav` событий, global reset стилей
- PluginManager.svelte: исправлены отступы header
При запуске: Проверки:
1. Загрузить app settings - `go test ./...` — 52 PASS
2. Если `currentVaultPath` пустой или vault не открывается → показать Vault Selection UI - `./scripts/check.sh` — ✅
3. Если `currentVaultPath` валиден → открыть vault автоматически - `./scripts/smoke-platform.sh` — ✅ (enable/disable/plugins.json)
- `./scripts/build.sh` — ✅
Vault Selection UI:
- Create new vault → `CreateVault(path)``SetCurrentVault(path)`
- Open existing vault → `SetCurrentVault(path)`
- Recent vaults → `SetCurrentVault(path)`
- Ошибка открытия → показать понятный текст
После успешного открытия:
- `currentVaultPath` сохранён в app settings
- Путь добавлен в `recentVaults`
- Переход в основной UI
## Enable/Disable Lifecycle
1. Пользователь нажимает Enable/Disable в Plugin Manager
2. Фронт вызывает `EnablePlugin(id)` / `DisablePlugin(id)` на бэкенде
3. Бэкенд пишет в `<vault>/.verstak/plugins.json`
4. Фронт вызывает `ReloadPlugins()` для пересчёта lifecycle
5. Disabled plugin не регистрирует capabilities/contributions
6. После enable — capabilities/contributions возвращаются
Важно:
- Installed plugin package ≠ enabled plugin
- Disabled plugin виден как installed/disabled
- Missing desired plugin показывается как "missing"