sync_apply.go: - applyRemoteNodeCreate: полный payload (template_id/fs_path/sort_order/archived), INSERT сохраняет все поля, для folder-like создаётся физическая папка. - applyRemoteNodeUpdate: принимает fs_path/template_id/archived, физическое переименование папки при изменении title/fs_path. - applyRemoteNodeMove: принимает fs_path, обновляет parent_id+fs_path, физически перемещает папку (folder-like) или file record (note/file). bindings_nodes.go: - MoveNode: node.FsPath = newFsPath после UpdateFsPath; sync.RecordOp отправляет новый fs_path; note/file move to root — файл в vault root. - RenameNode: EntityFile для file, EntityNote для note; коллизия → генерация уникального имени; файл переименовывается только после os.Rename. - DeleteNode: единый вызов a.files.DeleteNodeAndChildren(), дублирование удалено. - Исправлен deadlock с SetMaxOpenConns(1) — Query/Exec больше не конфликтуют. files.Service.vaultPath: filepath.Rel-based проверка, sibling-prefix escape (/tmp/vault vs /tmp/vault_evil) отклоняется. VaultCheck: SQL JOIN с n.deleted_at IS NULL, чтобы удалённые узлы не показывались как missing files. Добавлены тесты: RenameFileNodeUsesEntityFile, MoveNoteToRoot, DeleteFolderLeavesVaultCheckHealthy, SyncNodeCreatePreservesFields, VaultPathSiblingPrefixEscape. |
||
|---|---|---|
| build | ||
| cmd | ||
| contrib/plugins/importer-dokuwiki | ||
| docs | ||
| frontend | ||
| internal | ||
| migrations | ||
| scripts | ||
| .gitignore | ||
| README.md | ||
| build.sh | ||
| go.mod | ||
| go.sum | ||
| test_smoke_sync.sh | ||
README.md
Верстак
Верстак — локальная программа, где по каждому клиенту или проекту лежат все его файлы, заметки, документы, ссылки, действия и история работ.
Это не замечатель, не CRM, не таск-трекер. Нишевая аудитория — люди, у которых работа организована через дела, а не через задачи:
дело → файлы → заметки → документы → действия → история → вернуться через месяц
Для кого
Один продукт — разные входные двери:
| Кто | Как видит Верстак |
|---|---|
| Фрилансер / дизайнер | клиентские проекты, файлы, правки, история работ |
| Мастер по ПК | клиенты, устройства, серийники, фото, журнал |
| Разработчик | локальный workspace: заметки, репы, команды, файлы |
| Писатель / мейкер | мастерская проектов: материалы, заметки, версии, история |
Универсальные сущности
Базовая модель предельно проста — плагины добавляют функционал:
- Дело — контекст для всего остального
- Заметка — Markdown внутри vault
- Файл / Документ — любой файл, привязанный к делу
- Действие — кнопка запуска: URL, файл, папка, команда
- Журнал — записи о затраченном времени
Плагины (шаблоны дел, календарь, канбан, импортёры) расширяют эти сущности без перекомпиляции программы.
Стек
Go + SQLite + Lua (плагины) + Wails + Bubble Tea.
Документация
- Описание продукта: docs/01_Product_Spec.md
- Архитектура: docs/02_Architecture.md
- Плагины: docs/09_Extensibility.md
- План разработки: docs/PLAN.md