step 1: skeleton - go module, CLI stub with --version, structure

This commit is contained in:
mirivlad 2026-05-30 18:42:19 +08:00
commit 982f3064ac
17 changed files with 3531 additions and 0 deletions

34
.gitignore vendored Normal file
View File

@ -0,0 +1,34 @@
# Binaries
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary
*.test
# Output of go build
*.out
*.o
# Dependency directories
vendor/
# Go workspace
go.work
# Wails
frontend/dist/
frontend/node_modules/
# VS Code
.vscode/
.idea/
# OS
.DS_Store
Thumbs.db
# Vault test data
test-vault/

27
README.md Normal file
View File

@ -0,0 +1,27 @@
# Верстак
**Верстак** — local-first рабочий vault для дел, клиентов, проектов,
документов, заметок, файлов, действий запуска, журнала работ
и синхронизации между машинами.
Это не просто заметочник и не CRM. Главная сущность — **дело**.
Дело может быть: клиентом, сайтом клиента, личным проектом,
Godot-проектом, набором документов, рецептом/инструкцией,
архивом, разовой помощью человеку, рабочей областью.
Стек: Go + SQLite + Wails + Bubble Tea.
Документация: [docs/](docs/)
План разработки: [docs/PLAN.md](docs/PLAN.md)
## Сборка
```bash
go build ./cmd/verstak
```
## Разработка
Разработка ведётся пошагово. Каждый шаг — отдельный commit.
Подробнее в [docs/PLAN.md](docs/PLAN.md).

34
cmd/verstak/main.go Normal file
View File

@ -0,0 +1,34 @@
package main
import (
"fmt"
"os"
)
const version = "0.1.0-dev"
func main() {
if len(os.Args) < 2 {
fmt.Println("Verstak", version)
os.Exit(0)
}
switch os.Args[1] {
case "--version", "-v":
fmt.Println("Verstak", version)
case "--help", "-h":
fmt.Println("Verstak — local-first working vault")
fmt.Println()
fmt.Println("Usage: verstak <command> [flags]")
fmt.Println()
fmt.Println("Commands:")
fmt.Println(" init Initialize a new vault")
fmt.Println(" --version Show version")
fmt.Println(" --help Show this help")
case "init":
fmt.Println("TODO: init command (step 2)")
default:
fmt.Fprintf(os.Stderr, "Unknown command: %s\n", os.Args[1])
os.Exit(1)
}
}

69
docs/00_README.md Normal file
View File

@ -0,0 +1,69 @@
# Верстак — индекс документации
**Верстак** — local-first рабочий vault для дел, клиентов, проектов, документов, заметок, файлов, скриптов, действий запуска, журнала работ и синхронизации между машинами.
Это не просто заметочник и не CRM. Главная сущность — **дело**.
Дело может быть:
- клиентом;
- сайтом клиента;
- личным проектом;
- Godot-проектом;
- набором документов;
- рецептом/инструкцией;
- архивом;
- разовой помощью человеку;
- рабочей областью вроде `Рецепты / MySQL / Backup сайта`.
Внутри дела живут:
- вложенные папки;
- Markdown-заметки;
- документы `docx/pdf/xlsx/odt`;
- скриншоты;
- архивы;
- исходники;
- скрипты;
- SQL-фрагменты;
- ссылки;
- запускаемые действия;
- журнал работ;
- примерное время;
- история активности;
- связанные дела.
## Файлы пакета
1. [[01_Product_Spec]] — полное описание продукта и сценариев.
2. [[02_Architecture]] — архитектура core/GUI/TUI/CLI/server.
3. [[03_Data_Model_Storage]] — модель данных, SQLite, vault, files, notes, actions.
4. [[04_Sync_Backup_Activity]] — синхронизация, восстановление, backup, activity/time tracking.
5. [[05_UI_UX]] — экраны GUI/TUI, дерево, дело, поиск, документы, действия.
6. [[06_Roadmap]] — план разработки по этапам.
7. [[07_AI_Coder_Prompts]] — промпты для ИИ-кодера.
8. [[08_MVP_Checklist]] — чеклист первого MVP.
## Главные принципы
1. **Local-first.**
Рабочая копия всегда локальная. Сервер нужен для sync/backup/restore, но программа не должна зависеть от сервера каждый день.
2. **Данные принадлежат пользователю.**
Заметки и файлы физически лежат обычными файлами в vault. SQLite хранит индекс, связи, метаданные, FTS и sync state.
3. **Дерево дел важнее тегов.**
Теги полезны, но основная навигация — вложенное дерево: `Клиенты / Ромашка / Сайт / Документы`.
4. **Не таймтрекер, а восстановитель следов.**
Верстак не требует постоянно нажимать Start/Stop. Он собирает следы работы и предлагает записать их в журнал.
5. **GUI основной, TUI быстрый, CLI служебный.**
GUI — основная рабочая среда. TUI — быстрый доступ из терминала. CLI — sync, import, scripts, rescue mode.
6. **Sync не должен уничтожать данные.**
Нужны trash, conflict copies, versions, snapshots и retention.
## Короткая формула
> Верстак — это локальный рабочий кабинет для людей, у которых жизнь состоит из проектов, клиентов, документов, заметок, скриптов, файлов, репозиториев и вечного “где я это сохранил?”.

243
docs/01_Product_Spec.md Normal file
View File

@ -0,0 +1,243 @@
# Верстак — описание продукта
## 1. Проблема
У пользователя есть много разнородной рабочей информации:
- папка `work` и подпапки;
- архивы нужных файлов;
- служебки;
- договоры;
- письма;
- скриншоты;
- файлы с серийными номерами;
- инструкции;
- статьи по установке;
- скрипты;
- SQL-фрагменты;
- заметки в DokuWiki;
- доступы к серверам и сервисам клиентов;
- записи о нестандартных действиях;
- репозитории личных проектов;
- Godot-проекты;
- локальные утилиты вроде sshkeeper.
Проблема не только в хранении. Проблема в **контексте**:
- что к чему относится;
- где лежит актуальная версия;
- где заметка по клиенту;
- где договор;
- где скрипт;
- что было сделано в прошлый раз;
- сколько примерно времени ушло;
- что можно сказать человеку, когда он спрашивает “сколько должен?”.
Обычные инструменты закрывают только кусок:
- Obsidian — заметки, но не рабочий кабинет с документами, действиями и журналом работ;
- DokuWiki — заметки, но не локальная рабочая оболочка над файлами и программами;
- CRM — клиенты и продажи, но не личная техническая память;
- файловый менеджер — файлы, но без смысла;
- таймтрекер — время, но требует дисциплины;
- лаунчер — запуск, но не память;
- Nextcloud — файлы, но не дела.
## 2. Что такое Верстак
**Верстак** — local-first рабочий vault, где всё организовано вокруг “дел”.
Дело — это контекст, в который складываются заметки, документы, файлы, действия и история работы.
Примеры дерева:
```text
Клиенты
ООО Ромашка
Сайт
Обзор.md
Документы
Скрипты
Скриншоты
Журнал работ
Почта
Договоры
Личные проекты
sshkeeper
Roadmap.md
Releases
dist
Действия
Tyaplyapiya
Godot project
Design notes
Assets
Рецепты
MySQL
Очистка таблиц
Backup dump
Сайты
Backup сайта одной строкой
Очистка кеша WordPress
Документы
Служебки
Договоры
Серийники
```
## 3. Основные сущности
### Дело
Главный рабочий контекст.
Поля:
- название;
- тип: клиент / проект / рецепт / документальная область / архив / личное;
- родитель;
- описание;
- статус: active / sleeping / archived;
- теги;
- связанные ссылки;
- связанные actions;
- журнал работ.
### Заметка
Обычный Markdown-файл внутри vault.
Примеры:
- `overview.md`;
- `nginx.md`;
- `mysql-cleanup.md`;
- `roadmap.md`;
- `access.secret.md`.
### Документ
Файл внутри дела:
- `docx`;
- `xlsx`;
- `pdf`;
- `odt`;
- `png/jpg`;
- `zip`;
- любые другие файлы.
В MVP документы открываются системным приложением. Встроенный preview можно добавить позже.
### Действие
Кнопка, которую можно запустить из дела:
- открыть URL;
- открыть папку;
- открыть файл;
- запустить Godot;
- открыть IDE;
- запустить sshkeeper;
- выполнить скрипт;
- открыть терминал;
- собрать проект.
### Журнал работ
Записи вида:
```text
2026-05-30
Дело: ООО Ромашка / Сайт
Время: примерно 3ч
Описание: обновил витрину сайта, товары, баннеры, проверил отображение.
```
### Активность
Сырые следы:
- открыто дело;
- открыта заметка;
- изменён файл;
- запущено действие;
- открыта папка;
- later: активное окно;
- later: browser URL;
- later: sshkeeper session.
## 4. Основные сценарии
### Клиентская работа
1. Открыть дело клиента.
2. Посмотреть заметки и документы.
3. Открыть админку сайта.
4. Запустить sshkeeper или скрипт.
5. Добавить скриншоты.
6. Записать работу.
7. Сформировать текст отчёта.
### Личный проект
1. Открыть проект `sshkeeper`.
2. Нажать “Открыть IDE”.
3. Нажать “Собрать”.
4. Посмотреть roadmap.
5. Добавить заметку “на чём остановился”.
### Импорт DokuWiki
1. Выбрать `data/pages`.
2. Выбрать `data/media`.
3. Импортировать namespaces как дерево.
4. Сохранить оригиналы.
5. Постепенно разобрать по делам.
### Восстановление времени
Пользователь не нажимал таймер, но вечером видит:
```text
Похоже, ты работал по делу “ООО Ромашка / Сайт”:
14:0517:12, примерно 3ч.
Основания:
- открывалась админка сайта;
- менялся catalog.xlsx;
- запускался sshkeeper profile;
- создавались скриншоты.
[Записать 3ч] [Исправить] [Игнорировать]
```
## 5. Что точно не делать в начале
- не делать SaaS;
- не делать multi-user CRM;
- не делать встроенный офисный пакет;
- не делать полноценный password manager;
- не делать ИИ;
- не делать мобильное приложение;
- не делать сложные права пользователей;
- не делать бухгалтерию;
- не пытаться автоматически понимать всё.
## 6. Уникальность
Верстак отличается тем, что объединяет:
- заметочник;
- файловый кабинет;
- project launcher;
- журнал работ;
- рабочий контекст;
- sync/backup;
- TUI/GUI;
- миграцию из DokuWiki.
Но всё это не как отдельные модули, а вокруг одного понятия: **дело**.

333
docs/02_Architecture.md Normal file
View File

@ -0,0 +1,333 @@
# Верстак — архитектура
## 1. Архитектурная схема
```text
┌────────────────────┐
│ GUI/Wails │
└─────────┬──────────┘
┌─────────────┐ ┌───────▼────────┐ ┌─────────────┐
│ TUI/Bubble │───▶│ Core Library │◀───│ CLI Commands │
└─────────────┘ └───────┬────────┘ └─────────────┘
┌─────────▼──────────┐
│ Local Vault+SQLite │
└─────────┬──────────┘
┌─────────▼──────────┐
│ Sync Client │
└─────────┬──────────┘
┌─────────▼──────────┐
│ Sync Server │
└────────────────────┘
```
## 2. Компоненты
### Core Library
Общее ядро, которое не зависит от GUI/TUI.
Отвечает за:
- nodes tree;
- vault;
- notes;
- files;
- documents;
- actions;
- worklog;
- activity;
- search;
- import;
- sync client;
- security;
- config.
### GUI
Основной интерфейс.
Рекомендуемый стек:
- Go backend;
- Wails;
- Svelte или Vue;
- TypeScript;
- CSS без перегруза.
Функции GUI:
- дерево дел;
- экран “Сегодня”;
- карточка дела;
- Markdown editor;
- файловый список;
- actions buttons;
- worklog;
- поиск;
- sync status;
- импорт DokuWiki;
- разбор конфликтов.
### TUI
Быстрый интерфейс из терминала.
Рекомендуемый стек:
- Bubble Tea;
- Bubbles;
- Lip Gloss.
TUI не обязан повторять весь GUI.
Функции:
- найти дело;
- открыть заметку;
- добавить worklog;
- запустить action;
- запустить sync;
- посмотреть “Сегодня”.
### CLI
CLI нужен не как главный интерфейс, а как служебный вход.
Команды:
```bash
verstak init --vault ~/VerstakVault
verstak sync
verstak index rebuild
verstak import-dokuwiki --pages /path/data/pages
verstak log "Клиенты/Ромашка" --time 3h --text "Обновил витрину"
verstak open "Личные проекты/sshkeeper"
verstak vault check
```
CLI нужен для:
- автоматизации;
- интеграции с sshkeeper;
- shell scripts;
- импорта;
- восстановления;
- диагностики;
- rescue mode.
### Sync Server
Отдельный Go HTTP server.
Функции:
- API key auth;
- push/pull operations;
- upload/download blobs;
- restore manifest;
- snapshots;
- retention deleted files.
## 3. Структура репозитория
```text
verstak/
go.mod
README.md
cmd/
verstak/
main.go
verstak-gui/
main.go
verstak-tui/
main.go
verstak-server/
main.go
internal/
core/
nodes/
vault/
storage/
notes/
files/
actions/
worklog/
activity/
search/
importers/
sync/
security/
config/
gui/
tui/
server/
frontend/
src/
App.svelte
components/
routes/
stores/
migrations/
001_init.sql
002_fts.sql
003_sync.sql
```
## 4. Core modules
### nodes
Универсальное дерево.
Типы:
```text
space
case
folder
note
document
file
action
recipe
secret
worklog
link
```
### vault
Работа с локальной папкой:
- init;
- safe paths;
- copy/move/link files;
- trash;
- history;
- integrity check.
### storage
SQLite:
- migrations;
- repositories;
- transactions;
- FTS;
- backup db.
### notes
Markdown notes:
- create;
- read;
- save;
- version backup;
- import from DokuWiki.
### files
- add file;
- link external file;
- open system app;
- detect changes;
- hash;
- MIME;
- missing files.
### actions
- open_url;
- open_file;
- open_folder;
- run_command;
- run_script;
- open_terminal;
- launch_app;
- sshkeeper_profile.
### worklog
- manual entries;
- approximate time;
- billable flag;
- report generation.
### activity
- events;
- suggestions;
- grouping;
- confidence.
### search
- SQLite FTS5;
- index notes, files, worklog, actions.
### importers
- DokuWiki;
- work folder;
- plain folder;
- maybe Obsidian later.
### sync
- device id;
- operations log;
- push/pull;
- blobs;
- conflicts;
- restore.
## 5. File watching
Не строить систему только на watcher.
Правильно:
```text
snapshot scanner — источник правды
fsnotify watcher — ускоритель
manual scan — fallback
```
Scanner сравнивает реальность с SQLite:
- new file;
- changed file;
- missing file;
- moved file later;
- hash mismatch.
## 6. Внешние приложения
Верстак не пишет свой офисный пакет.
MVP:
- Markdown/txt/sh/sql/json/yml — встроенный редактор;
- docx/xlsx/odt/pdf/images — открыть системным приложением;
- после закрытия/сохранения watcher/scanner видит изменение.
## 7. Безопасность запуска actions
Правила:
- dangerous action требует confirm;
- команды запускать через `exec.Command`, не через shell, если shell не нужен;
- показывать command, args, working_dir;
- логировать запуск;
- не подставлять пользовательский ввод без escaping;
- не хранить секреты в action logs.

View File

@ -0,0 +1,276 @@
# Верстак — модель данных и хранилище
## 1. Vault
Пример структуры:
```text
~/VerstakVault/
.verstak/
index.db
config.yml
device.yml
sync_state.db
trash/
history/
originals/
thumbnails/
spaces/
clients/
romashka/
case.yml
overview.md
notes/
nginx.md
mysql-cleanup.md
access.secret.md.enc
documents/
dogovor-2026.docx
sluzhebka.pdf
screenshots/
error-form.png
scripts/
backup-site.sh
cleanup.sql
actions/
open-admin.yml
worklog/
2026-05.md
```
## 2. SQLite schema MVP
### nodes
```sql
CREATE TABLE nodes (
id TEXT PRIMARY KEY,
parent_id TEXT NULL REFERENCES nodes(id),
type TEXT NOT NULL,
title TEXT NOT NULL,
slug TEXT NOT NULL,
path TEXT NULL,
sort_order INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
deleted_at TEXT NULL,
revision INTEGER NOT NULL DEFAULT 1,
device_id TEXT NULL
);
```
### node_meta
```sql
CREATE TABLE node_meta (
node_id TEXT NOT NULL REFERENCES nodes(id),
key TEXT NOT NULL,
value TEXT NOT NULL,
PRIMARY KEY (node_id, key)
);
```
### files
```sql
CREATE TABLE files (
id TEXT PRIMARY KEY,
node_id TEXT NOT NULL REFERENCES nodes(id),
filename TEXT NOT NULL,
path TEXT NOT NULL,
storage_mode TEXT NOT NULL, -- vault | external
size INTEGER NOT NULL DEFAULT 0,
sha256 TEXT NULL,
mime TEXT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
last_seen_at TEXT NULL,
missing INTEGER NOT NULL DEFAULT 0
);
```
### notes
```sql
CREATE TABLE notes (
node_id TEXT PRIMARY KEY REFERENCES nodes(id),
file_id TEXT NOT NULL REFERENCES files(id),
format TEXT NOT NULL DEFAULT 'markdown',
original_format TEXT NULL,
encrypted INTEGER NOT NULL DEFAULT 0
);
```
### actions
```sql
CREATE TABLE actions (
id TEXT PRIMARY KEY,
node_id TEXT NOT NULL REFERENCES nodes(id),
title TEXT NOT NULL,
kind TEXT NOT NULL,
command TEXT NULL,
args_json TEXT NULL,
working_dir TEXT NULL,
url TEXT NULL,
confirm_required INTEGER NOT NULL DEFAULT 0,
capture_output INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
```
### worklog_entries
```sql
CREATE TABLE worklog_entries (
id TEXT PRIMARY KEY,
node_id TEXT NOT NULL REFERENCES nodes(id),
started_at TEXT NULL,
ended_at TEXT NULL,
date TEXT NOT NULL,
minutes INTEGER NULL,
approximate INTEGER NOT NULL DEFAULT 1,
billable INTEGER NOT NULL DEFAULT 0,
summary TEXT NOT NULL,
details TEXT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
```
### activity_events
```sql
CREATE TABLE activity_events (
id TEXT PRIMARY KEY,
node_id TEXT NULL REFERENCES nodes(id),
source TEXT NOT NULL,
event_type TEXT NOT NULL,
title TEXT NULL,
path TEXT NULL,
url TEXT NULL,
app_name TEXT NULL,
process_name TEXT NULL,
started_at TEXT NOT NULL,
ended_at TEXT NULL,
duration_seconds INTEGER NULL,
metadata_json TEXT NULL,
confidence INTEGER NOT NULL DEFAULT 100,
created_at TEXT NOT NULL
);
```
### worklog_suggestions
```sql
CREATE TABLE worklog_suggestions (
id TEXT PRIMARY KEY,
node_id TEXT NOT NULL REFERENCES nodes(id),
date TEXT NOT NULL,
started_at TEXT NULL,
ended_at TEXT NULL,
suggested_minutes INTEGER NULL,
summary TEXT NOT NULL,
evidence_json TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
```
### search_index
```sql
CREATE VIRTUAL TABLE search_index USING fts5(
node_id UNINDEXED,
title,
content,
path,
tags,
type
);
```
### sync_ops
```sql
CREATE TABLE sync_ops (
id TEXT PRIMARY KEY,
op_id TEXT NOT NULL UNIQUE,
device_id TEXT NOT NULL,
entity_type TEXT NOT NULL,
entity_id TEXT NOT NULL,
op_type TEXT NOT NULL,
payload_json TEXT NOT NULL,
created_at TEXT NOT NULL,
pushed_at TEXT NULL,
applied_at TEXT NULL
);
```
## 3. Правила хранения
### Заметки
- physical `.md` file;
- metadata in SQLite;
- backup old version before overwrite.
### Документы
- physical file;
- open with system app;
- metadata in SQLite.
### Secret notes
- encrypted file, e.g. `access.secret.md.enc`;
- no FTS indexing;
- no logs with plaintext;
- master password later.
### Удаление
- soft delete node;
- file to `.verstak/trash`;
- sync tombstone;
- physical cleanup only after retention.
## 4. Sync operations
Каждое изменение должно создавать operation:
- node_create;
- node_update;
- node_move;
- node_delete;
- file_add;
- file_update;
- file_delete;
- note_update;
- action_update;
- worklog_create;
- worklog_update.
Даже если sync ещё не реализован, operation log лучше заложить рано.
## 5. Индексация
Индексировать:
- node titles;
- note content;
- filenames;
- paths;
- worklog summaries/details;
- action titles;
- links.
Не индексировать:
- secret notes;
- private keys;
- token-like values;
- binary content in MVP.

View File

@ -0,0 +1,242 @@
# Верстак — синхронизация, backup и активность
## 1. Синхронизация
Цель:
- рабочая машина и домашняя машина имеют один vault;
- обе работают offline;
- сервер используется для обмена и восстановления;
- при потере локальных файлов можно восстановиться с сервера.
## 2. Sync server
`verstak-server` — простой Go HTTP server.
Функции:
- API key auth;
- device registry;
- operation log;
- blob storage by sha256;
- snapshots;
- restore manifest;
- deleted item retention.
Пример server storage:
```text
server-data/
db.sqlite
blobs/
ab/
cd/
abcdef...blob
snapshots/
```
## 3. API MVP
```http
GET /api/v1/health
POST /api/v1/device/register
POST /api/v1/sync/push
POST /api/v1/sync/pull
POST /api/v1/blobs/upload
GET /api/v1/blobs/{sha256}
GET /api/v1/restore/manifest
```
Auth:
```http
Authorization: Bearer <api_key>
```
## 4. Push/pull
Client push:
```json
{
"device_id": "device-uuid",
"ops": [],
"blobs": ["sha256..."]
}
```
Server response:
```json
{
"accepted": true,
"missing_blobs": ["sha256..."]
}
```
Client pull:
```json
{
"device_id": "device-uuid",
"since_revision": 42
}
```
Response:
```json
{
"server_revision": 50,
"ops": []
}
```
## 5. Восстановление
Сценарий:
1. Установить Верстак.
2. Ввести server URL.
3. Ввести API key/recovery key.
4. Нажать Restore.
5. Скачать manifest.
6. Скачать blobs.
7. Применить ops.
8. Пересобрать SQLite/FTS.
9. Проверить целостность.
## 6. Конфликты
Не пытаться магически мержить всё.
Если заметка изменилась на двух устройствах:
```text
nginx.md
nginx.conflict-home-2026-05-30.md
```
Если docx изменился на двух устройствах:
```text
dogovor.docx
dogovor.conflict-work-2026-05-30.docx
```
UI:
```text
Конфликт: nginx.md
[Открыть обе версии] [Оставить локальную] [Оставить серверную] [Склеить вручную]
```
## 7. Sync не равен backup
Если удалить файл на одной машине, sync может удалить везде.
Поэтому сервер должен иметь:
- tombstones;
- trash retention;
- note versions;
- daily snapshots;
- integrity check;
- manual export.
Retention example:
```yaml
retention:
deleted_items_days: 90
note_versions_days: 180
daily_snapshots_days: 30
```
## 8. Activity tracking
Верстак не должен быть шпионской программой. Activity tracking должен быть явным и настраиваемым.
### Источники MVP
- opened node;
- edited note;
- added file;
- changed file through app;
- launched action.
### Источники later
- file watcher/scanner;
- active window title;
- browser URL extension;
- sshkeeper integration;
- idle detection.
## 9. Как понять, что пользователь работал 3 часа
Верстак не “знает точно”. Он предлагает версию.
Пример:
```text
Похоже, ты работал по делу “ООО Ромашка / Сайт”:
14:0517:12, примерно 3ч.
Основания:
- открывалась админка сайта;
- изменялся catalog.xlsx;
- запускался sshkeeper profile romashka-vps;
- создавался screenshot-result.png;
- открывалась заметка “Витрина”.
[Записать 3ч] [Исправить] [Игнорировать]
```
## 10. Группировка активности
Правило MVP:
- события одного дела;
- разрыв меньше 20 минут — один интервал;
- разрыв больше 20 минут — новый интервал;
- итог округлить до 5/10/15 минут;
- показать evidence.
## 11. Privacy modes
### Minimal
- only inside Verstak;
- actions;
- manual worklog.
### Work
- + file scanner/watcher;
- + files opened from Verstak;
- + sshkeeper events.
### Full
- + active windows;
- + browser URLs;
- + idle detection.
По умолчанию не включать Full.
## 12. Client report
Из журнала работ можно собрать отчёт:
```text
По сайту ООО “Ромашка” было сделано:
- обновлена витрина сайта;
- внесены изменения в каталог товаров;
- обновлены баннеры;
- проверено отображение результата.
Ориентировочное время: 3 часа.
```
MVP — шаблонный отчёт без ИИ.

245
docs/05_UI_UX.md Normal file
View File

@ -0,0 +1,245 @@
# Верстак — UI/UX
## 1. Главный экран — Сегодня
```text
Сегодня
──────────────────────────────
Активные дела:
[ООО Ромашка / Сайт] примерно 3ч 12 следов [подтвердить]
[sshkeeper] 42м 5 следов [открыть]
[Документы / Договоры] 3 новых файла разобрать [разобрать]
Неразобранное:
- screenshot_2026-05-30.png
- dogovor-final2.docx
- backup-site-old.zip
- import/dokuwiki/mysql-cleanup.txt
Быстрые действия:
[Новое дело] [Быстрая заметка] [Добавить файл] [Импорт DokuWiki] [Sync]
```
## 2. Общий layout
```text
┌────────────────────────────────────────────────────┐
│ Search | Quick Add | Sync Status | Settings │
├───────────────┬────────────────────────────────────┤
│ Tree sidebar │ Main content │
│ │ │
│ Сегодня │ Case / Note / File / Search │
│ Клиенты │ │
│ Проекты │ │
│ Рецепты │ │
│ Документы │ │
└───────────────┴────────────────────────────────────┘
```
## 3. Sidebar tree
```text
Сегодня
Неразобранное
Клиенты
ООО Ромашка
Сайт
Почта
Договоры
Личные проекты
sshkeeper
Tyaplyapiya
Рецепты
MySQL
Сайты
Документы
Служебки
Договоры
Серийники
Архив
```
## 4. Экран дела
```text
ООО Ромашка / Сайт
──────────────────────────────
Описание:
Сайт клиента. WordPress/nginx. Иногда обновление витрины, формы, почта.
Быстрые действия:
[Открыть сайт] [Открыть админку] [Открыть sshkeeper] [Открыть папку] [Добавить работу]
Последнее:
2026-05-30 — обновление витрины, баннеры, проверка — примерно 3ч
2026-05-12 — чистка кеша и проверка формы — 40м
Вкладки:
Обзор | Заметки | Файлы | Документы | Скрипты | Действия | Журнал | Активность
```
## 5. Заметки
- список заметок;
- Markdown editor;
- preview;
- save;
- move;
- rename;
- search within note later.
## 6. Файлы и документы
Actions:
- add file;
- drag & drop;
- copy into vault;
- link external;
- open with system app;
- show in folder;
- delete to trash;
- rename;
- move.
MVP:
- preview только для markdown;
- системное открытие для office/pdf/images.
Later:
- image preview;
- PDF preview;
- thumbnails;
- document metadata.
## 7. Действия
Вкладка Actions:
```text
Открыть сайт open_url
Открыть админку open_url
Открыть sshkeeper run_command
Открыть папку open_folder
Backup сайта run_script, confirm required
```
При опасном action:
```text
Команда:
./backup-site.sh
Рабочая папка:
.../clients/romashka/scripts
[Запустить] [Отмена]
```
## 8. Журнал работ
```text
2026-05-30
3ч, примерно
Обновил витрину сайта, товары, баннеры, проверил отображение.
2026-05-12
40м
Почистил кеш и проверил форму обратной связи.
```
Кнопки:
- add entry;
- edit;
- copy report;
- mark billable;
- approximate/exact.
## 9. Активность
```text
14:05 opened admin.romashka.ru
14:18 opened catalog.xlsx
14:44 changed price-list.csv
15:58 sshkeeper profile romashka-vps
16:40 opened romashka.ru/catalog
```
Suggestion:
```text
Похоже, работа по Ромашка / Сайт:
14:0517:12, примерно 3ч.
[Записать] [Изменить] [Игнорировать]
```
## 10. Поиск
Search results:
```text
[Recipe] Рецепты / MySQL / Очистка таблиц
[Note] Клиенты / Ромашка / mysql-cleanup.md
[Script] Клиенты / Петров / scripts/cleanup.sql
[Worklog] 2026-04-28 — удалял старые записи из таблиц
```
## 11. Неразобранное
Туда попадают:
- импортированные DokuWiki pages;
- файлы без дела;
- папки из scan work;
- конфликты sync;
- activity suggestions без уверенного дела.
Actions:
- создать дело;
- привязать к делу;
- переместить;
- архивировать;
- игнорировать;
- удалить в trash.
## 12. TUI UX
TUI нужен для быстрого:
- fuzzy search;
- открыть дело;
- добавить worklog;
- запустить action;
- sync now.
Не нужно делать в TUI:
- импорт DokuWiki;
- сложный conflict resolver;
- preview документов;
- настройки sync.
## 13. CLI UX
CLI команды:
```bash
verstak sync
verstak index rebuild
verstak import-dokuwiki --pages /path/data/pages
verstak log "Ромашка" --time 3h --text "Обновил витрину"
verstak open "sshkeeper"
verstak action run "Ромашка/Открыть сайт"
```

215
docs/06_Roadmap.md Normal file
View File

@ -0,0 +1,215 @@
# Верстак — roadmap
## Milestone 0 — Skeleton
- Go module;
- cmd/verstak;
- cmd/verstak-gui stub;
- cmd/verstak-server stub;
- internal/core;
- SQLite connection;
- migrations;
- config;
- `verstak --version`;
- `verstak init --vault ./test-vault`.
Acceptance:
- `go test ./...` проходит;
- vault создаётся;
- повторный init безопасен.
## Milestone 1 — Nodes
- table nodes;
- node_meta;
- UUID;
- Create/Get/ListChildren/Update/Move/SoftDelete;
- CLI node commands;
- tests.
Acceptance:
- можно создать дерево дел;
- можно переместить узел;
- delete soft.
## Milestone 2 — Vault files
- `.verstak/`;
- config.yml;
- files table;
- copy/link file;
- open file;
- trash.
Acceptance:
- файл добавляется в дело;
- открывается системным приложением;
- delete moves to trash.
## Milestone 3 — Markdown notes
- notes table;
- create/read/save note;
- `.md` files;
- version backup;
- CLI note commands.
Acceptance:
- заметка редактируется;
- файл физически лежит в vault;
- старая версия сохраняется.
## Milestone 4 — GUI MVP
- Wails app;
- sidebar tree;
- create node/note;
- edit note;
- add/open file;
- basic settings.
Acceptance:
- можно пользоваться как маленьким заметочником+файловым кабинетом.
## Milestone 5 — Actions
- actions table;
- open_url;
- open_file;
- open_folder;
- run_command;
- confirmation;
- action log;
- GUI Actions tab.
Acceptance:
- можно запускать Godot/sshkeeper/сайт/папку.
## Milestone 6 — Worklog
- worklog table;
- manual entries;
- minutes;
- approximate;
- billable;
- report copy.
Acceptance:
- можно записать “3ч обновлял витрину”;
- можно скопировать отчёт клиенту.
## Milestone 7 — Search
- FTS5;
- index nodes/notes/files/worklog/actions;
- search UI;
- reindex command.
Acceptance:
- поиск находит старую инструкцию, файл или запись работ.
## Milestone 8 — DokuWiki import
- read `data/pages`;
- read `data/media`;
- namespaces to folders;
- pages to notes;
- originals saved;
- optional conversion to markdown.
Acceptance:
- старые заметки переезжают в Верстак.
## Milestone 9 — Work folder intake
- scan folder;
- show unassigned folders/files;
- create case from folder;
- copy/move/link into vault.
Acceptance:
- можно постепенно разобрать папку `work`.
## Milestone 10 — Sync server MVP
- HTTP server;
- API key;
- server db;
- push/pull ops;
- blob upload/download;
- restore manifest.
Acceptance:
- две машины обмениваются изменениями через сервер.
## Milestone 11 — Conflicts and restore
- conflict copy;
- conflict UI;
- restore from server;
- retention deleted files;
- integrity check.
Acceptance:
- конфликт не теряет данные;
- можно восстановить vault на новой машине.
## Milestone 12 — Activity MVP
- activity events;
- opened nodes;
- launched actions;
- changed files through app;
- suggestions;
- evidence.
Acceptance:
- Верстак предлагает worklog на основе следов.
## Milestone 13 — File scanner/watcher
- snapshot scanner;
- fsnotify watcher;
- manual scan;
- changed/missing files;
- activity events.
Acceptance:
- изменения файлов снаружи приложения обнаруживаются.
## Milestone 14 — TUI MVP
- Bubble Tea;
- tree/search;
- add worklog;
- run action;
- sync.
Acceptance:
- можно из терминала быстро работать с Верстаком.
## Milestone 15 — 1.0 polish
- installers;
- backup export;
- docs;
- keyboard shortcuts;
- UI polish;
- migration safety;
- crash recovery;
- tests.

304
docs/07_AI_Coder_Prompts.md Normal file
View File

@ -0,0 +1,304 @@
# Верстак — промпты для ИИ-кодера
## Постоянный контекст для ИИ-кодера
```markdown
Ты работаешь над проектом “Верстак”.
Верстак — local-first рабочий vault для дел, клиентов, проектов, документов, заметок, файлов, действий запуска, журнала работ и синхронизации.
Главные принципы:
- данные принадлежат пользователю;
- заметки и файлы физически лежат обычными файлами в vault;
- SQLite хранит индекс, связи, метаданные, FTS и sync state;
- основная сущность — вложенное дерево nodes;
- GUI, TUI и CLI должны использовать общий core;
- бизнес-логику нельзя завязывать на UI;
- не делать SaaS;
- не делать ИИ;
- не делать password manager в MVP;
- не удалять файлы физически без trash;
- опасные действия требуют подтверждения;
- изменения делать маленькими проверяемыми шагами.
Стек:
- Go;
- SQLite;
- Wails для GUI;
- Bubble Tea для TUI позже;
- fsnotify + snapshot scanner позже;
- sync server позже.
После каждого шага дай:
1. что изменено;
2. как запустить;
3. как проверить;
4. какие файлы затронуты;
5. какие риски остались.
```
## Prompt 01 — Skeleton
```markdown
Создай skeleton проекта “Верстак”.
Нужно:
- Go module `verstak`;
- структура cmd/internal/migrations;
- CLI `verstak --version`;
- команда `verstak init --vault ./test-vault`;
- SQLite connection;
- migration runner;
- первая миграция.
Acceptance:
- `go test ./...` проходит;
- init создаёт vault и `.verstak/index.db`;
- повторный init безопасен.
```
## Prompt 02 — Nodes
```markdown
Реализуй универсальное дерево nodes.
Нужно:
- tables nodes, node_meta;
- struct Node;
- repository: Create/Get/ListChildren/UpdateTitle/Move/SoftDelete;
- CLI node create/list/move/delete;
- unit tests.
Правила:
- UUID;
- deleted_at вместо физического удаления;
- безопасный slug.
```
## Prompt 03 — Vault files
```markdown
Добавь работу с файлами vault.
Нужно:
- `.verstak/trash`;
- files table;
- VaultService;
- copy file into vault;
- link external file;
- open with system app;
- delete-to-trash;
- CLI file add/list/open.
```
## Prompt 04 — Markdown notes
```markdown
Добавь Markdown-заметки.
Нужно:
- notes table;
- note node type;
- create/read/save note;
- `.md` file inside vault;
- backup previous version before overwrite;
- CLI note create/read/write.
```
## Prompt 05 — Wails GUI MVP
```markdown
Добавь первый Wails GUI.
Нужно:
- sidebar tree;
- main panel;
- create node;
- create note;
- markdown textarea editor;
- save note;
- file list;
- add file;
- open file.
Главный пользовательский поток:
1. создать дело;
2. создать заметку;
3. сохранить заметку;
4. добавить файл;
5. открыть файл системным приложением.
```
## Prompt 06 — Actions
```markdown
Добавь actions-кнопки.
Типы:
- open_url;
- open_file;
- open_folder;
- run_command.
Нужно:
- actions table;
- action runner;
- confirm_required;
- action log;
- GUI вкладка “Действия”.
Команды запускать через exec.Command с аргументами. Опасные действия — только после confirm.
```
## Prompt 07 — Worklog
```markdown
Добавь журнал работ.
Нужно:
- worklog_entries table;
- add/edit/delete entry;
- minutes;
- approximate;
- billable;
- GUI вкладка “Журнал”;
- copy report.
Acceptance:
- можно записать “3ч, обновил витрину”;
- можно скопировать отчёт.
```
## Prompt 08 — Search
```markdown
Добавь SQLite FTS5 поиск.
Индексировать:
- node titles;
- note content;
- filenames;
- worklog summaries;
- action titles.
Нужно:
- `verstak index rebuild`;
- GUI search bar;
- search results with type/path.
```
## Prompt 09 — DokuWiki import
```markdown
Добавь импорт из DokuWiki.
Вход:
- path to `data/pages`;
- optional path to `data/media`;
- target node id.
Нужно:
- namespaces as folders;
- pages as notes;
- originals saved in `.verstak/originals/dokuwiki`;
- basic conversion or raw import.
```
## Prompt 10 — Sync server skeleton
```markdown
Создай `verstak-server`.
Нужно:
- HTTP server;
- API key auth;
- SQLite server db;
- GET /health;
- POST /sync/push;
- POST /sync/pull;
- POST /blobs/upload;
- GET /blobs/{sha256};
- blob storage by sha256.
```
## Prompt 11 — Sync client MVP
```markdown
Добавь sync client.
Нужно:
- sync_ops local table;
- операции при изменениях;
- config server URL + API key;
- command `verstak sync`;
- push local ops;
- pull remote ops;
- upload/download blobs;
- conflict copy if unsure.
```
## Prompt 12 — Activity MVP
```markdown
Добавь минимальный activity tracking.
Источники:
- opened node;
- edited note;
- added file;
- launched action.
Нужно:
- activity_events table;
- экран “Активность”;
- группировка по делу;
- возможность создать worklog из выбранных событий.
```
## Prompt 13 — File scanner/watcher
```markdown
Добавь file scanner и fsnotify watcher.
Важно:
- scanner — источник правды;
- watcher — ускоритель.
Нужно:
- scan vault tree;
- detect new/changed/missing files;
- update index;
- create activity events;
- manual command `verstak scan`.
```
## Prompt 14 — TUI MVP
```markdown
Добавь TUI на Bubble Tea.
Функции:
- tree/search;
- open node;
- add worklog;
- run action;
- sync now.
TUI не должен повторять весь GUI.
```
## Prompt 15 — Integrity/restore
```markdown
Добавь команды:
- `verstak vault check`;
- `verstak vault repair`;
- `verstak restore --server <url> --api-key <key> --target <path>`.
Проверять:
- missing files;
- orphan files;
- SQLite references;
- hash mismatch;
- sync state.
```

73
docs/08_MVP_Checklist.md Normal file
View File

@ -0,0 +1,73 @@
# Верстак — MVP checklist
## MVP цель
Первая версия должна позволять реально начать пользоваться Верстаком как заменой части DokuWiki и папочного хаоса.
## Обязательные функции
- [ ] Создать vault.
- [ ] Создать дерево дел.
- [ ] Создать Markdown-заметку.
- [ ] Редактировать Markdown-заметку.
- [ ] Добавить файл в дело.
- [ ] Открыть файл системным приложением.
- [ ] Создать action “Открыть URL”.
- [ ] Создать action “Открыть папку”.
- [ ] Создать action “Запустить команду”.
- [ ] Добавить запись работы.
- [ ] Скопировать отчёт по работам.
- [ ] Поиск по заметкам.
- [ ] Поиск по именам файлов.
- [ ] Поиск по журналу работ.
- [ ] Базовый импорт DokuWiki.
## Необязательные, но желательные
- [ ] Неразобранное.
- [ ] Скан папки work.
- [ ] Внешние linked files.
- [ ] Action log.
- [ ] Activity events MVP.
- [ ] TUI MVP.
## Не входит в первый MVP
- [ ] Полная синхронизация.
- [ ] Активные окна.
- [ ] Browser tracking.
- [ ] Encrypted secret notes.
- [ ] PDF preview.
- [ ] Office preview.
- [ ] Мобильное приложение.
- [ ] Multi-user.
- [ ] ИИ.
## Проверка MVP руками
1. Создать vault `~/VerstakVault`.
2. Создать `Клиенты / ООО Ромашка / Сайт`.
3. Создать `overview.md`.
4. Добавить `dogovor.docx`.
5. Открыть `dogovor.docx`.
6. Создать action “Открыть сайт”.
7. Создать action “Открыть папку”.
8. Добавить worklog “3ч, обновил витрину”.
9. Найти “витрину” через поиск.
10. Закрыть и открыть приложение.
11. Убедиться, что всё осталось на месте.
## Первый demo-сценарий
```text
Верстак запускается.
Пользователь видит экран “Сегодня”.
Создаёт дело клиента.
Добавляет заметку.
Перетаскивает договор.
Создаёт кнопку открытия сайта.
Записывает работу.
Поиском находит старую заметку.
```
Если это работает — проект уже живой.

387
docs/PLAN.md Normal file
View File

@ -0,0 +1,387 @@
# Верстак — Пошаговый план реализации
## Принципы работы
1. После каждого шага — **СТОП**. Влад проверяет, даёт обратную связь.
2. Следующий шаг начинается **ТОЛЬКО** после одобрения.
3. Каждый шаг — отдельный git commit.
4. Периодически сверяться с этим планом и документацией в docs/.
## Статус шагов
| # | Шаг | Статус |
|---|-----|--------|
| 1 | Git init + Skeleton | ⬜ не начат |
| 2 | Init + SQLite + First Migration | ⬜ не начат |
| 3 | Nodes Repository + CRUD + CLI Node | ⬜ не начат |
| 4 | Vault Files: Trash + File Service + CLI File | ⬜ не начат |
| 5 | Markdown Notes: Create/Read/Save + CLI Note | ⬜ не начат |
| 6 | Wails GUI MVP: Sidebar + Main Panel | ⬜ не начат |
| 7 | Actions: Run URL/File/Command + GUI Tab | ⬜ не начат |
| 8 | Worklog: Entries + Report + GUI Tab | ⬜ не начат |
| 9 | FTS5 Search: Rebuild Index + GUI Search Bar | ⬜ не начат |
| 10 | DokuWiki Importer | ⬜ не начат |
| 11 | Sync Server Skeleton | ⬜ не начат |
| 12 | Sync Client MVP | ⬜ не начат |
| 13 | Activity + File Scanner/Watcher | ⬜ не начат |
| 14 | TUI MVP (Bubble Tea) | ⬜ не начат |
| 15 | Integrity Check + Repair + Vault Restore | ⬜ не начат |
---
## ШАГ 1 — Git Init + Skeleton
**Цель:** репозиторий создан, пустая структура, "hello world" билдится.
**Acceptance:**
- `go build ./...` проходит
- `go test ./...` проходит
- `verstak --version` выводит версию
- Повторный init безопасен
**Действия:**
- git init, .gitignore (Go, Wails)
- `go mod init verstak`
- Структура: `cmd/verstak/`, `internal/core/`, `migrations/`
- `cmd/verstak/main.go`: --version flag
- README.md
**Commit:** `step 1: skeleton`
---
## ШАГ 2 — Init + SQLite + First Migration
**Цель:** `verstak init --vault ./test` создаёт vault с index.db.
**Acceptance:**
- `go test ./...` проходит
- init создаёт `.verstak/index.db`
- повторный init безопасен
**Действия:**
- migration runner (cmd + SQL migrations/)
- миграция 001_init.sql (таблица nodes)
- `_ "github.com/mattn/go-sqlite3"` или modernc driver
- CLI `init`: vault dir + `.verstak/` + `index.db`
**Commit:** `step 2: init + sqlite + first migration`
---
## ШАГ 3 — Nodes Repository + CRUD + CLI Node
**Цель:** можно создать/прочитать/переместить/удалить дело через CLI.
**Acceptance:**
- nodes + node_meta таблицы
- NodeRepository: Create, Get, ListChildren, UpdateTitle, Move, SoftDelete
- CLI: `node create`, `node list`, `node move`, `node delete`
- unit tests проходят
**Действия:**
- Полная схема nodes (id, parent_id, type, title, slug, path, sort_order, created_at, updated_at, deleted_at, revision, device_id)
- node_meta (node_id, key, value)
- Node struct + Repository
- UUID вместо auto-increment
- Soft delete (deleted_at)
- безопасный slug для path
- Tests: in-memory SQLite
**Commit:** `step 3: nodes repository + CRUD`
---
## ШАГ 4 — Vault Files: Trash + File Service + CLI File
**Цель:** можно добавить файл в дело, открыть системным приложением, удалить в trash.
**Acceptance:**
- `.verstak/trash/` создаётся при init
- copy file into vault работает
- open with system app работает
- delete-to-trash работает
- тесты проходят
**Действия:**
- Таблица files (id, node_id, filename, path, storage_mode, size, sha256, mime, ...)
- VaultService: CopyFile, LinkExternal, OpenFile, DeleteToTrash, RestoreFromTrash
- CLI: `file add`, `file list`, `file open`, `file trash`
**Commit:** `step 4: vault files + trash + CLI`
---
## ШАГ 5 — Markdown Notes: Create/Read/Save + CLI Note
**Цель:** можно создать заметку, писать в неё, читать обратно.
**Acceptance:**
- type "note" для nodes
- создать .md файл в vault
- save делает backup старой версии
- тесты проходят
**Действия:**
- Таблица notes (node_id, file_id, format, original_format, encrypted)
- NoteService: CreateNote, ReadNote, SaveNote (с backup)
- CLI: `note create`, `note read`, `note write`
- Backup старой версии перед перезаписью
**Commit:** `step 5: markdown notes`
---
## ШАГ 6 — Wails GUI MVP
**Цель:** GUI запускается, видно дерево дел, можно создать дело и заметку.
**Acceptance:**
- sidebar tree показывает дела
- create node работает
- markdown textarea editor с save
- file list + add file + open file
- главный пользовательский поток работает
**Действия:**
- Wails app init (Go backend + Svelte/Vue)
- Backend bindings: NodeService, VaultService, NoteService
- Frontend: sidebar tree, main panel, modals, markdown editor
- Поток: дело → заметка → файл → открыть файл
**Commit:** `step 6: Wails GUI MVP`
---
## ШАГ 7 — Actions
**Цель:** можно создать кнопку "Открыть сайт", нажать, сайт открылся.
**Acceptance:**
- open_url, open_file, open_folder, run_command
- confirm_required диалог
- action log
- GUI вкладка "Действия"
**Действия:**
- Таблица actions
- ActionService: Run с confirm, exec.Command БЕЗ shell, args массивом
- CLI: `action add`, `action list`, `action run`
- GUI: вкладка с кнопками
**Commit:** `step 7: actions`
---
## ШАГ 8 — Worklog
**Цель:** можно записать "3ч обновил витрину", скопировать отчёт.
**Acceptance:**
- add/edit/delete entry
- approximate minutes + billable flag
- copy report копирует в буфер
- GUI вкладка "Журнал"
**Действия:**
- Таблица worklog_entries
- WorklogService: Add, Edit, Delete, CopyReport
- CLI: `worklog add`, `worklog list`, `worklog report`
- GUI: вкладка журнал + кнопка copy report
**Commit:** `step 8: worklog`
---
## ШАГ 9 — FTS5 Search
**Цель:** можно найти "витрину" по заметкам, файлам, журналу.
**Acceptance:**
- `verstak index rebuild` перестраивает индекс
- поиск по node titles, note content, filenames, worklog summaries
- GUI search bar + результаты с type/path
**Действия:**
- Таблица search_index (FTS5): node_id, title, content, path, tags, type
- Триггеры для автоматического обновления или manual rebuild
- SearchService: RebuildIndex, Search(query)
- CLI: `index rebuild`
- GUI: search bar в header
**Commit:** `step 9: FTS5 search`
---
## ШАГ 10 — DokuWiki Importer
**Цель:** можно импортировать страницы DokuWiki как дерево дел.
**Acceptance:**
- namespaces → folders
- pages → notes
- оригиналы сохранены в `.verstak/originals/dokuwiki/`
**Действия:**
- DokuWiki парсер: namespaces как nodes tree
- страницы как note nodes с .md файлами
- CLI: `import-dokuwiki --pages /path --media /path --target-node ...`
- Originals сохраняются без изменений
**Commit:** `step 10: DokuWiki importer`
---
## ШАГ 11 — Sync Server Skeleton
**Цель:** verstak-server отвечает на /health, /sync/push, /sync/pull, /blobs.
**Acceptance:**
- HTTP server на отдельном порту
- API key auth
- blob storage by sha256
- GET /health, POST /sync/push, POST /sync/pull, POST /blobs/upload, GET /blobs/{sha256}
**Действия:**
- `cmd/verstak-server/main.go`
- SQLite server db
- Push/pull operations endpoints
- Blob upload/download with sha256 naming
**Commit:** `step 11: sync server skeleton`
---
## ШАГ 12 — Sync Client MVP
**Цель:** `verstak sync` отправляет локальные операции на сервер и получает обратно.
**Acceptance:**
- sync_ops таблица
- операции создаются при каждом изменении
- push local ops + pull remote ops
- upload/download blobs
- conflict copy при неуверенности
**Действия:**
- Таблица sync_ops (опционально добавить триггеры в repository)
- SyncClient: Push, Pull, UploadBlob, DownloadBlob
- CLI: `verstak sync`
- Server URL + API key в .verstak/config
**Commit:** `step 12: sync client MVP`
---
## ШАГ 13 — Activity + File Scanner/Watcher
**Цель:** фиксируется открытие/редактирование, scanner видит новые файлы.
**Acceptance:**
- activity_events таблица
- scanner сравнивает реальность с SQLite
- watcher (fsnotify) ускоряет обнаружение
- экран "Активность" с группировкой по делу
- можно создать worklog из events
**Действия:**
- Таблица activity_events
- Запись событий из nodes/notes/files/actions
- Snapshot scanner (источник правды)
- fsnotify watcher (ускоритель)
- CLI: `scan`, `activity list`
- GUI: экран "Активность"
**Commit:** `step 13: activity + scanner/watcher`
---
## ШАГ 14 — TUI MVP (Bubble Tea)
**Цель:** быстрый поиск дела, добавление worklog, запуск action.
**Acceptance:**
- fuzzy search tree
- open node
- add worklog
- run action
- sync now
**Действия:**
- `cmd/verstak-tui/main.go` с Bubble Tea
- Модели: search, node view, worklog form, action runner
- Не повторяет весь GUI — только быстрые действия
**Commit:** `step 14: TUI MVP`
---
## ШАГ 15 — Integrity Check + Repair + Vault Restore
**Цель:** `verstak vault check` находит проблемы, repair чинит, restore восстанавливает.
**Acceptance:**
- check: missing files, orphan files, SQLite references, hash mismatch
- repair: устраняет найденные проблемы
- restore с сервера восстанавливает vault
**Действия:**
- CLI: `vault check` — сканирует и отчитывается
- CLI: `vault repair` — чинит найденное
- CLI: `restore --server <url> --api-key <key> --target <path>`
**Commit:** `step 15: integrity + restore`
---
## Сводка структуры репозитория
```
verstak/
go.mod
README.md
PLAN.md
cmd/
verstak/ # CLI
verstak-gui/ # Wails GUI
verstak-tui/ # Bubble Tea TUI
verstak-server/ # Sync server
internal/
core/
nodes/
vault/
storage/
notes/
files/
actions/
worklog/
activity/
search/
importers/
sync/
security/
config/
frontend/ # Wails frontend (Svelte/Vue)
migrations/
001_init.sql
002_add_meta.sql
003_add_files.sql
004_add_notes.sql
005_add_actions.sql
006_add_worklog.sql
007_add_activity.sql
008_add_fts.sql
009_add_sync.sql
```
## RAID (Risks, Assumptions, Issues, Dependencies)
- **Критично:** Wails v3 может быть нестабилен — проверить перед шагом 6
- **Критично:** go-sqlite3 нужен cgo; modernc — чистый Go, выбрать до шага 2
- **Зависимость:** Шаги 12 (sync client) зависят от 11 (server)
- **Зависимость:** Шаг 6 (GUI) лучше откладывать до стабильности core
- **Риск:** Svelte/Vue фронтенд потребует node/npm — подготовить

File diff suppressed because it is too large Load Diff

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module verstak
go 1.22

1
internal/core/doc.go Normal file
View File

@ -0,0 +1 @@
package core

0
migrations/.gitkeep Normal file
View File