step 1: skeleton - go module, CLI stub with --version, structure
This commit is contained in:
commit
982f3064ac
|
|
@ -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/
|
||||
|
|
@ -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).
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
||||
## Короткая формула
|
||||
|
||||
> Верстак — это локальный рабочий кабинет для людей, у которых жизнь состоит из проектов, клиентов, документов, заметок, скриптов, файлов, репозиториев и вечного “где я это сохранил?”.
|
||||
|
|
@ -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:05–17:12, примерно 3ч.
|
||||
|
||||
Основания:
|
||||
- открывалась админка сайта;
|
||||
- менялся catalog.xlsx;
|
||||
- запускался sshkeeper profile;
|
||||
- создавались скриншоты.
|
||||
|
||||
[Записать 3ч] [Исправить] [Игнорировать]
|
||||
```
|
||||
|
||||
## 5. Что точно не делать в начале
|
||||
|
||||
- не делать SaaS;
|
||||
- не делать multi-user CRM;
|
||||
- не делать встроенный офисный пакет;
|
||||
- не делать полноценный password manager;
|
||||
- не делать ИИ;
|
||||
- не делать мобильное приложение;
|
||||
- не делать сложные права пользователей;
|
||||
- не делать бухгалтерию;
|
||||
- не пытаться автоматически понимать всё.
|
||||
|
||||
## 6. Уникальность
|
||||
|
||||
Верстак отличается тем, что объединяет:
|
||||
|
||||
- заметочник;
|
||||
- файловый кабинет;
|
||||
- project launcher;
|
||||
- журнал работ;
|
||||
- рабочий контекст;
|
||||
- sync/backup;
|
||||
- TUI/GUI;
|
||||
- миграцию из DokuWiki.
|
||||
|
||||
Но всё это не как отдельные модули, а вокруг одного понятия: **дело**.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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:05–17: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 — шаблонный отчёт без ИИ.
|
||||
|
|
@ -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:05–17: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 "Ромашка/Открыть сайт"
|
||||
```
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
```
|
||||
|
|
@ -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
|
||||
Верстак запускается.
|
||||
Пользователь видит экран “Сегодня”.
|
||||
Создаёт дело клиента.
|
||||
Добавляет заметку.
|
||||
Перетаскивает договор.
|
||||
Создаёт кнопку открытия сайта.
|
||||
Записывает работу.
|
||||
Поиском находит старую заметку.
|
||||
```
|
||||
|
||||
Если это работает — проект уже живой.
|
||||
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
package core
|
||||
Loading…
Reference in New Issue