1. Enabled/Active state separation: - Enable() sets Enabled=true (persisted in config), does NOT create runtime - ActivatePlugin() checks Enabled && !Active, creates VM + scheduler - DeactivatePlugin() stops runtime, keeps Enabled=true - InitRuntimes() iterates Enabled plugins, sets Active=true after creation - SyncConfig() restores Enabled from config, does NOT touch Active 2. ActivatePlugin: добавлен vm.SetServices(m.Services) 3. Discover: атомарная замена списка (newPlugins slice), нет дублирования 4. CallPluginFunction: thread-safe через LuaVM.CallFunction (vm.mu + callWithTimeout) 5. Uninstall активного плагина: полная деактивация (StopScheduler → on_shutdown → CloseVM → Active=false) 6. GetPluginPanelHTML: валидация panel path (no absolute, no .., must be .html, must be within plugin dir) 7. PluginPage: убран hardcoded 'calendar-plugin', используется funcPrefix из pluginName Тесты: - security_test.go: +8 тестов (FullLifecycle, ActivatePlugin_Services, Discover_Idempotent, ReloadPlugins_NoDuplicates, CallPluginFunction_Timeout, Uninstall_ActivePlugin, GetPluginPanelHTML_PathTraversal, FullLifecycle_EndToEnd) - manager_test.go: обновлены тесты под новую семантику Enabled/Active |
||
|---|---|---|
| .codex | ||
| build/linux | ||
| cmd | ||
| contrib/plugins | ||
| docs | ||
| extension | ||
| extension-firefox | ||
| frontend | ||
| internal | ||
| migrations | ||
| scripts | ||
| .gitignore | ||
| AGENTS.md | ||
| README.md | ||
| go.mod | ||
| go.sum | ||
| 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-linux-amd64— GUI-приложениеverstak-server-linux-amd64— опциональный сервер синхронизации
Запуск
# GUI (после сборки)
./build/verstak-gui-linux-amd64
# Сервер (после сборки)
./build/verstak-server-linux-amd64 --help
# CLI
go run ./cmd/verstak/ --help
Структура проекта
.
├── 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