- Replace broken ObjectPickerModal with simple inline modal (Label+URL fields) - Insert internal link at cursor position in textarea - Add rename button in note editor header and note cards - Add delete button on note cards with confirm dialog - Integrate DeleteNote with shared trash (.verstak/trash/) via files.TrashFile() - Remove hidden .verstak/trash/notes/ folder — notes use unified trash now - Fix purgeTrashNode to clean file-record-based trash entries (notes/files) - Add activity + sync ops to DeleteNote binding - Add files.TrashFile() public method - Update i18n keys for note.rename, note.deleteConfirm, internal link modal - AssertContained: symlink-aware path containment check - Update tests: shared trash, file record missing flag, collision on rename - All go test ./... pass, frontend build passes, GUI binary built |
||
|---|---|---|
| .codex | ||
| build/linux | ||
| cmd | ||
| contrib/plugins | ||
| docs | ||
| extension | ||
| extension-firefox | ||
| frontend | ||
| internal | ||
| migrations | ||
| scripts | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| README.md | ||
| VERSION | ||
| go.mod | ||
| go.sum | ||
| package-lock.json | ||
| package.json | ||
| test_smoke_sync.sh | ||
| wails.json | ||
README.md
Верстак
Верстак — local-first рабочий vault. Всё организовано вокруг дел, а не задач.
Дело может быть: клиентом, проектом, набором документов, рецептом, архивом, разовой работой. Внутри дела: вложенные папки, Markdown-заметки, файлы, действия (URL/файл/папка/команда), журнал работ, история активности.
Стек
| Слой | Технология |
|---|---|
| GUI | Wails v2 + Svelte 4 |
| CLI | Go |
| Backend | Go |
| Хранилище | SQLite (индекс) + файловая система (vault) |
| Плагины | Lua |
| Синхронизация | HTTP API (опциональный сервер) |
Архитектура
┌────────────────────┐
│ GUI (Wails v2) │
└─────────┬──────────┘
│
┌─────────▼────────┐ ┌─────────────┐
│ Core Library │◄──│ CLI Commands │
└─────────┬────────┘ └─────────────┘
│
┌─────────▼──────────┐
│ Local Vault+SQLite │
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ Sync Client │
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ Sync Server │
└────────────────────┘
Быстрый старт
Требования
- Go 1.25+
- Node.js 20+
- libwebkit2gtk-4.1-dev, libgtk-3-dev и другие Wails-зависимости (см. wails.io/docs/desktop/linux)
- npm
Сборка
# Всё сразу (GUI + сервер)
./scripts/build.sh
# Или по отдельности
./scripts/build.sh gui # только GUI
./scripts/build.sh server # только сервер
Проверка GUI перед коммитом:
./scripts/check-gui.sh
Она проверяет локали, production-сборку фронтенда, актуальность embedded Wails assets и компиляцию GUI-бинаря.
Дополнительно запускается headless Chromium smoke через Wails-mock: проверяются first-run, recovery, основное окно, Settings, workspace, вкладки дела, файлы, журнал, активность и мобильный viewport. Smoke выполняет реальные UI-действия: создание заметки, запись worklog, создание узла, вход в папку и возврат назад, а также Sync Now с предупреждениями о conflicts/applyErrors. Скриншоты пишутся в /tmp/verstak-gui-smoke.
Бинарники попадают в build/:
verstak— GUI-приложениеverstak-server— опциональный сервер синхронизации
Запуск
# GUI (после сборки)
./build/verstak
# Сервер (после сборки)
./build/verstak-server --help
# CLI
go run ./cmd/verstak/ --help
Firefox Extension
Расширение для Firefox — extension-firefox/. Распространяется как signed XPI: Mozilla только подписывает XPI через AMO (unlisted channel), а мы самостоятельно хостим signed XPI и управляем обновлениями через updates.json.
Сборка (unsigned)
./scripts/build.sh firefox
# → build/verstak-bridge-firefox-unsigned.zip
Подпись (требуются AMO-токены)
# 1. Скопировать .env.example → .env и заполнить WEB_EXT_API_KEY / WEB_EXT_API_SECRET
cp .env.example .env
# 2. Установить зависимости
cd extension-firefox && npm install && cd ..
# 3. Подписать XPI
./scripts/sign-firefox-xpi.sh
# → web-ext-artifacts/*.xpi
# 4. Полный релиз: подпись + release/firefox/ + updates.json
./scripts/release-firefox-xpi.sh
# → release/firefox/verstak-firefox-VERSION.xpi
# → release/firefox/updates.json
Firefox Release Artifacts
release/firefox/verstak-firefox-VERSION.xpi
release/firefox/updates.json
Обновления: Firefox проверяет update_url из manifest.json, указывающий на наш updates.json. При выходе новой версии достаточно:
- Подписать новый XPI
- Заменить файл на сервере
- Обновить
updates.json
Release
# Полная сборка с упаковкой в DEB/RPM
./scripts/release.sh # dry-run (без git tag); требует AMO токены
./scripts/release.sh --publish # с git tag + GitHub release
# Без подписи Firefox
./scripts/release.sh --skip-firefox-sign
Артефакты релиза (после ./scripts/release.sh):
release/linux/verstak # GUI binary
release/linux/verstak-server # Server binary
release/linux/verstak.deb # DEB-пакет GUI
release/linux/verstak-server.deb # DEB-пакет сервера
release/linux/verstak.rpm # RPM-пакет GUI
release/linux/verstak-server.rpm # RPM-пакет сервера
release/firefox/verstak-firefox-VERSION.xpi # Signed XPI
release/firefox/updates.json # Firefox update manifest
Структура проекта
.
├── cmd/ # Точки входа
│ ├── verstak/ # CLI
│ ├── verstak-gui/ # Wails GUI
│ └── verstak-server/ # Sync server
├── internal/
│ ├── core/ # Бизнес-логика
│ │ ├── actions/ # Действия (URL, папка, команда)
│ │ ├── config/ # Конфигурация
│ │ ├── files/ # Файлы и импорт
│ │ ├── i18n/ # Интернационализация (Go)
│ │ ├── nodes/ # Дела/узлы дерева
│ │ ├── plugins/ # Lua-плагины
│ │ ├── search/ # Поиск
│ │ ├── storage/ # SQLite + миграции
│ │ ├── sync/ # Синхронизация
│ │ ├── templates/ # Шаблоны дел
│ │ ├── vault/ # Vault layout
│ │ └── worklog/ # Журнал работ
│ └── gui/ # Wails bridge (embedded HTML)
├── frontend/ # Svelte-приложение
│ └── src/
│ ├── lib/
│ │ └── i18n/ # Локали (JS)
│ └── ...svelte # Компоненты
├── migrations/ # SQL-миграции
├── docs/ # Документация
└── scripts/ # Вспомогательные скрипты и сборка
CLI команды
go run ./cmd/verstak/ sync # Синхронизация с сервером
go run ./cmd/verstak/ sync configure # Настройка сервера
go run ./cmd/verstak/ sync status # Статус синхронизации
Vault layout
Данные хранятся в локальной папке (vault). Структура на диске:
vault/
.verstak/ # Служебные данные: index.db, config.yml, trash, blobs
Проекты/ # Пользовательские папки-дела
Клиенты/
Рабочие/
Archive/
Внутри папок-дел: Notes/, Files/, Documents/, Overview.md.
Vault открывается в любом файловом менеджере без специальных инструментов.
Документация
| Раздел | Описание |
|---|---|
| Описание продукта | Аудитория, сценарии, фичи |
| Архитектура | Компоненты, плагины, sync |
| Модель данных | SQLite, vault, файлы |
| Синхронизация | Sync, backup, activity |
| UI/UX | Экраны GUI |
| Плагины | Lua-плагины, шаблоны |
| Сервер синхронизации | Установка и настройка сервера |
| Vault layout | Структура папок на диске |
| План | Дорожная карта |
| Шаблоны | Шаблоны дел |
Лицензия
MIT