diff --git a/docs/PLAN.md b/docs/PLAN.md index 13d6cae..cd7eee3 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -24,64 +24,20 @@ | 11 | **Wails Desktop GUI** | ✅ выполнено (v2, full Svelte UI) | | 12 | **Files/Folders full workflow** | ✅ выполнено (copy/link/import/tree) | | 13 | **Drag-and-drop** | ✅ выполнено (internal + external drops) | -| 14 | **MVP stabilization** | ✅ выполнено — atomicity audit, template children as nodes, fs_path validation, descendant move protection, delete atomicity, sync_apply FS-first rewrite, SafeVaultPath, CreateNodeFromTemplate rollback, 24 integration tests pass. Known gaps: Restore from trash not implemented, applyRemoteNodeUpdate/Move uses FS-first (parent_id + title updates still need full txn), ensureTemplateChildren uses `continue` on errors | -| 15 | Sync Server + Client | 🔒 PAUSED — HTTP API key, push/pull, blob sync | -| 16 | Activity Suggestions | 🔒 PAUSED — worklog suggestions from activity_events | -| 17 | File Scanner/Watcher | 🔒 PAUSED — fsnotify, snapshot scanner, missing file detection | -| 18 | TUI MVP (Bubble Tea) | 🔒 PAUSED — tree/search, add worklog, run action, sync | -| 19 | Plugins: Lua runtime | 🔒 PAUSED — gopher-lua, hooks, sandbox | -| 20 | Browser Extension | 🔒 PAUSED — tracking, capture, evidence | -| 21 | Calendar/Kanban | 🔒 PAUSED — view by date, board view | -| 22 | Integrity Check + Repair | 🔒 PAUSED — checksums, crash recovery | -| 23 | New templates/integrations | 🔒 PAUSED — community plugins | - -> 🔒 = **PAUSED** — не начинать до завершения шага 14 (MVP stabilization). Текущий статус: ✅ **MVP stabilization завершена** — все операции атомарны (DB+FS), template файлы/папки создаются как полноценные ноды с rollback, fs_path валидируется, sync_apply FS-first с SafeVaultPath, delete находит ошибки trash-переноса, 24 integration tests проходят. Известные пробелы: Restore не реализован, ensureTemplateChildren продолжает при ошибках (backward compat), parent_id+title в applyRemoteNodeUpdate без полной транзакции. - -> **Wails v3 → v2 migration:** Wails v3 alpha.96 показал SIGSEGV на Linux desktop (GTK/X11). Wails v2 stable выбран как GUI base для MVP. Миграция в процессе (ветка `gui/migrate-wails-v2`). - -**GUI Build (Wails v2):** -```bash -cd frontend && npm run build && cd .. -rm -rf cmd/verstak-gui/frontend-dist && cp -r frontend/dist cmd/verstak-gui/frontend-dist -go build -tags "gui production webkit2_41" -o verstak-gui ./cmd/verstak-gui -./verstak-gui -``` - -Или для dev режима: `wails dev` (требует Wails v2 CLI) +| 14 | **MVP stabilization** | ✅ выполнено | +| 15 | **Sync Server + Client** | 🔄 в работе — HTTP API, push/pull, blob sync | +| 16 | **Activity Suggestions** | ⏳ ожидает — подсказки из activity_events | +| 17 | **File Scanner/Watcher** | ⏳ ожидает — fsnotify, snapshot scanner | +| 18 | **TUI MVP (Bubble Tea)** | ⏳ ожидает — tree/search, add worklog | +| 19 | **Plugins: Lua runtime** | ⏳ ожидает — gopher-lua, hooks, sandbox | +| 20 | **Browser Extension** | ⏳ ожидает — tracking, capture, evidence | +| 21 | **Calendar/Kanban** | ⏳ ожидает — view by date, board view | +| 22 | **Integrity Check + Repair** | ⏳ ожидает — checksums, crash recovery | +| 23 | **New templates/integrations** | ⏳ ожидает — community plugins | --- -## Текущий этап: MVP Stabilization ✅ - -**Цель:** стабилизация MVP — атомарность операций, template ноды, fs_path инварианты, sync roundtrip тесты. - -**Прогресс Wails v2 Desktop GUI:** -- ✅ Wails v2 shell (window opens, no SIGSEGV) -- ✅ Layout fix (full viewport, dark theme, sidebar+main) -- ✅ Notes bindings + UI (create/read/save/dirty state) -- ✅ Tabs (Overview/Notes/Files/Actions/Worklog/Activity) -- ✅ Node creation + template selection (FromTemplate) -- ✅ Section filtering -- ✅ File tree with breadcrumbs, preview, CRUD (rename/delete/duplicate/cut/copy/paste) -- ✅ Drag-and-drop (internal + external OS file drops) -- ✅ Actions CRUD (create/list/run/delete) -- ✅ Worklog entry form -- ✅ Today dashboard + Activity feed (global + per-case) -- ✅ Search -- ✅ Import dialog with safety checks (PreviewImport) -- ✅ Keyboard shortcuts - -**Среднесрочные шаги (заморожены до стабилизации MVP):** -- Sync server/client -- File Scanner/Watcher -- TUI (Bubble Tea) -- Activity suggestions -- Lua runtime -- Browser extension - ---- - -## Выполненные шаги (1-10) +## Выполненные шаги (1-14) ### ШАГ 1 — Git Init + Skeleton - go module `verstak`, структура cmd/internal/migrations @@ -140,11 +96,24 @@ go build -tags "gui production webkit2_41" -o verstak-gui ./cmd/verstak-gui - CLI: `plugin list/enable/disable/templates` - Lua runtime — stub (placeholder) ---- +### ШАГ 11 — Wails Desktop GUI -## Текущий этап: ШАГ 11 — Wails Desktop GUI - -**Целевой commit:** `gui/wails-file-workflow` +**Прогресс:** +- ✅ Wails v2 shell (window opens, no SIGSEGV) +- ✅ Layout fix (full viewport, dark theme, sidebar+main) +- ✅ Notes bindings + UI (create/read/save/dirty state) +- ✅ Tabs (Overview/Notes/Files/Actions/Worklog/Activity) +- ✅ Node creation + template selection (FromTemplate) +- ✅ Section filtering +- ✅ File tree with breadcrumbs, preview, CRUD (rename/delete/duplicate/cut/copy/paste) +- ✅ Drag-and-drop (internal + external OS file drops) +- ✅ Actions CRUD (create/list/run/delete) +- ✅ Worklog entry form +- ✅ Today dashboard + Activity feed (global + per-case) +- ✅ Search +- ✅ Import dialog with safety checks (PreviewImport) +- ✅ Keyboard shortcuts +- ✅ i18n (ru/en) Архитектура: @@ -153,15 +122,16 @@ go build -tags "gui production webkit2_41" -o verstak-gui ./cmd/verstak-gui │ Frontend (Wails) │ │ frontend/src/ │ │ App.svelte │ -│ components/Sidebar, TopBar, CaseView, ... │ -│ stores/selection, nodes, files, ui │ -│ styles/theme.css │ +│ FileTreeRow, TreeNode │ +│ lib/FileBreadcrumbs, FilePreviewModal, ... │ +│ lib/i18n/ locales (ru, en) │ └──────────────────┬──────────────────────────────┘ │ Wails bindings ┌──────────────────▼──────────────────────────────┐ │ Go Core (internal/core/) │ │ nodes, vault, storage, notes, files, │ -│ actions, worklog, search, plugins │ +│ actions, worklog, search, plugins, sync, │ +│ activity │ └──────────────────┬──────────────────────────────┘ │ ┌──────────────────▼──────────────────────────────┐ @@ -169,164 +139,79 @@ go build -tags "gui production webkit2_41" -o verstak-gui ./cmd/verstak-gui └─────────────────────────────────────────────────┘ ``` -### Действия +### ШАГ 12 — Files/Folders full workflow -1. Создать Wails app skeleton (`wails init`) -2. Структура frontend/ — Svelte/Vue/vanilla TS -3. Backend bindings — методы Wails над core services -4. Перенести текущий UI shell из inline HTML в frontend -5. Оставить текущий `internal/gui/` как legacy (не удалять, но не развивать) +Core service extensions: +- `AddPathCopy` — рекурсивный импорт директорий +- `AddPathLink` — привязка внешних файлов без копирования +- Folder model: node type `folder` +- Name conflict resolution: `name (2)`, `name (3)` +- Safety checks: PreviewImport с summary (count, size, warnings) +- Trash: soft delete → `.verstak/trash` -### Backend bindings (Wails v2 — реализовано) +### ШАГ 13 — Drag-and-drop -```go -// Nodes -ListSections() []SectionDTO -ListNodesBySection(section string) ([]NodeDTO, error) -GetNodeDetail(nodeID string) (*NodeDTO, error) -ListChildren(parentID string) ([]NodeDTO, error) -CreateNode(parentID, typ, title, section string) (*NodeDTO, error) -DeleteNode(id string) error -MoveNode(nodeID, newParentID string) error -RenameNode(nodeID, newTitle string) error +- Internal DnD: перетаскивание узлов в дереве +- External DnD: файлы из ОС → активное дело / вкладка Файлы +- Диалог подтверждения с выбором: копировать / переместить / привязать -// Templates -ListTemplates() []TemplateDTO -FromTemplate(parentID, typ, title, section, template string) (*NodeDTO, error) +### ШАГ 14 — MVP stabilization -// Notes -ListNotes(nodeID string) ([]NodeDTO, error) -CreateNote(parentID, title string) (*NodeDTO, error) -ReadNote(noteID string) (string, error) -SaveNote(noteID, content string) error - -// Files -ListFiles(nodeID string) ([]FileDTO, error) -ListItems(nodeID string) ([]FileTreeItemDTO, error) -AddPathCopy(nodeID, sourcePath string) ([]NodeDTO, error) -AddPathLink(nodeID, sourcePath string) ([]NodeDTO, error) -DeleteFileOrFolder(nodeID string) error -CreateEmptyFile(parentID, filename string) (*NodeDTO, error) -DuplicateNode(nodeID string) (*NodeDTO, error) -OpenFile(fileID string) error -OpenFolder(nodeID string) error -ReadFileText(fileID string) (string, error) -GetFileBase64(fileID string) (string, error) -PreviewImport(sourcePath string) (*ImportSummary, error) -ValidateName(name string) error -PickFile() (string, error) -PickFiles() ([]string, error) -PickDirectory() (string, error) - -// Actions -ListActions(nodeID string) ([]ActionDTO, error) -CreateAction(nodeID, kind, title, data string) (*ActionDTO, error) -DeleteAction(id string) error -RunAction(id string) error - -// Worklog -ListWorklog(nodeID string) ([]WorklogDTO, error) -CreateWorklog(nodeID, summary string, minutes int) (*WorklogDTO, error) - -// Search -Search(query string) ([]SearchResultDTO, error) - -// Activity -ListTodayView() (*TodayDashboardDTO, error) -ListActivityFeed(limit, offset int) ([]EventDTO, error) -ListActivityByNode(nodeID string, limit, offset int) ([]EventDTO, error) -CountActivityByNode(nodeID string) (int, error) -``` +- Все операции атомарны (DB+FS) +- Template файлы/папки создаются как полноценные ноды с rollback +- fs_path валидируется (SafeVaultPath) +- sync_apply FS-first +- Delete находит ошибки trash-переноса +- 24+ integration tests проходят +- **Известные пробелы:** Restore из trash не реализован, ensureTemplateChildren продолжает при ошибках (backward compat), parent_id+title в applyRemoteNodeUpdate без полной транзакции --- -## ШАГ 12 — Files/Folders full workflow +## Текущий этап: ШАГ 15 — Sync Server + Client -### Core service extensions +**Статус:** ✅ Сервер собран и работает. Клиент реализован. Нужна доработка и тестирование. -Расширить `files.Service`: - -```go -AddPathCopy(nodeID string, sourcePath string) ([]Node, error) -AddPathLink(nodeID string, sourcePath string) ([]Node, error) -``` - -Логика: -- `os.Stat(sourcePath)` → если директория → рекурсивный обход -- Каждый файл → File node + file record -- Каждая папка → Folder node -- Структура сохраняется через parent_id - -### Folder model - -Папка = node type `folder` (не file record с mime=directory). - -При импорте `romashka-docs/`: -``` -Folder node: romashka-docs (type=folder) - File node: dogovor.docx (type=file) - Folder node: screenshots (type=folder) - File node: error.png (type=file) -``` - -### Name conflict resolution - -Если в target уже есть `docs`: -``` -docs -docs (2) -docs (3) -``` - -### Safety checks - -При добавлении папки показать summary: -- количество файлов/папок -- общий размер -- предупреждение если > 1000 файлов, > 1 GB, содержит `.git`/`node_modules`/`.cache` - -### Trash - -- Soft delete node + children -- Vault files → `.verstak/trash` -- External files — только удалить связь -- Не `rm -rf` - -### Tests - -1. Copy single file → vault, record created, source intact -2. Link single file → no copy, external path saved -3. Copy folder → tree created, files in vault -4. Link folder → node created, no content copied -5. Delete vault file → soft-deleted, file in trash -6. Delete vault folder → children soft-deleted -7. Name conflict → no overwrite, safe suffix -8. Open file → mocked opener (no real app launch) +Стек синхронизации: +- `cmd/verstak-server/` — HTTP API сервер (порт, API key, push/pull) +- `internal/core/sync/` — клиент синхронизации +- SQLite-based sync state (`migrations/008_sync.sql`) +- FS-first apply: изменения применяются через файловую систему, БД — индекс --- -## ШАГ 13 — Drag-and-drop +## Ожидающие шаги (16-23) -### External D&D +### ШАГ 16 — Activity Suggestions +Подсказки для журнала работ на основе activity_events: +- анализировать события за день +- предлагать записи в worklog -Drop target: активное дело / вкладка Файлы / Неразобранное. +### ШАГ 17 — File Scanner/Watcher +- fsnotify watcher на vault +- snapshot scanner для обнаружения изменений при закрытом приложении +- обнаружение missing файлов -После drop → диалог: -``` -Добавить в "ООО Ромашка / Сайт" -Файлов: 3, Папок: 1, 240 MB -[Скопировать] [Переместить] [Привязать] [Отмена] -``` +### ШАГ 18 — TUI MVP (Bubble Tea) +- Терминальный интерфейс: дерево дел, поиск, добавление worklog, запуск действий, sync ---- +### ШАГ 19 — Plugins: Lua runtime +- gopher-lua runtime +- хуки на события (node created, file added, etc.) +- песочница -## ШАГ 14 — MVP stabilization +### ШАГ 20 — Browser Extension +- Расширение для браузера: трекинг времени, скриншоты, evidence -- Smoke tests базовых сценариев -- Проверка: дело → заметка → файл → папка → trash → перезапуск -- go test ./... pass -- Обновление документации -- Остановка перед следующими фичами +### ШАГ 21 — Calendar/Kanban +- Календарный вид по датам +- Канбан-доска по статусам + +### ШАГ 22 — Integrity Check + Repair +- Проверка целостности vault +- Контрольные суммы, восстановление после сбоев + +### ШАГ 23 — New templates/integrations +- Community-плагины и шаблоны --- @@ -337,17 +222,21 @@ verstak/ go.mod README.md PLAN.md + build.sh # Полная сборка (GUI + сервер) + AGENTS.md # Инструкции для AI-ассистента cmd/ - verstak/ # CLI - verstak-gui/ # Wails v2 GUI main + verstak/ # CLI + verstak-gui/ # Wails v2 GUI main + verstak-server/ # Sync server - frontend/ # Wails v2 Svelte frontend + frontend/ # Wails v2 Svelte frontend package.json vite.config.js src/ App.svelte FileTreeRow.svelte + TreeNode.svelte lib/ FileBreadcrumbs.svelte FilePreviewModal.svelte @@ -355,8 +244,13 @@ verstak/ FileIcon.svelte FileActions.svelte fileUtils.js + i18n/ # Локали (ru, en) api/verstak.js + scripts/ + build.sh # Раздельная сборка (gui/server/all) + check-i18n.sh # Проверка интернационализации + internal/ core/ nodes/ @@ -368,8 +262,11 @@ verstak/ worklog/ activity/ search/ + sync/ config/ - plugins/ # manager, lua (stub), builtin templates + templates/ + plugins/ # manager, lua (stub), builtin templates + i18n/ # Go-локали (ru, en) contrib/ plugins/ @@ -385,26 +282,39 @@ verstak/ 007_search.sql 008_sync.sql 009_section.sql + + docs/ + 00_README.md + 01_Product_Spec.md + 02_Architecture.md + 03_Data_Model_Storage.md + 04_Sync_Backup_Activity.md + 05_UI_UX.md + 06_Roadmap.md + 09_Extensibility.md + 10_Sync_Server_Guide.md + PLAN.md + TEMPLATES.md + VAULT_LAYOUT.md +``` + +## Сборка + +```bash +# Полная сборка +./build.sh + +# По отдельности +./scripts/build.sh gui # Wails v2 GUI +./scripts/build.sh server # Sync server +./scripts/build.sh all # Оба + +# Dev-режим GUI +cd frontend && npm run dev ``` ## RAID - **Критично:** Wails требует Node.js для frontend-сборки - **Критично:** go-sqlite3 + cgo; gcc уже установлен -- **Зависимость:** Steps 15+ ждут завершения step 14 (MVP stabilization) - ---- - -## Phase 4: Template-Driven Architecture - -Implemented in this commit: - -- **Template system** — built-in system templates for folder, project, client, document, and recipe types. - Each template defines default modules, default files (`Overview.md`), and default subfolders. -- **Vault layout** — human-readable folder structure on disk. Every node gets a folder named after its - title (sanitized). Nesting reflects parent-child relationships. UUIDs are never exposed in user paths. -- **`.verstak/` directory** — app-internal data (db, backups, thumbnails, cache, sync, trash, history). -- **i18n keys** — new locale keys for `nav.*`, `template.*`, `common.archive`, and `migrate.*` namespaces - added to both `ru.json` and `en.json`. -- **Documentation** — `docs/VAULT_LAYOUT.md` (vault folder structure, rules, migration) and - `docs/TEMPLATES.md` (system templates, template structure JSON, UI integration). +- **Сборка GUI:** требуется `webkit2_41` tag для WebKitGTK 4.1+