Go to file
mirivlad 077d25a269 fix: keyboard layout map, picker type tabs as filters, add unit tests
1. Fix RU_TO_EN keyboard map in keyboardLayout.ts:
   - ч was mapped to 'c' (wrong), now correctly 'x'
   - с was mapped to 'v' (wrong), now correctly 'c'
   - ю was mapped to '.' (wrong), now correctly ','
   - Full rewrite with standard QWERTY/ЙЦУКЕН positional mapping
   - Examples: dthcnfr→верстак, руддщ→hello, цщкдв→world all correct now

2. Root cause of search breaking after 3-4 chars:
   Old map had ч:'c', с:'v' swapped. So dthcnfr → 'верчиак' (wrong).
   Each character was mapped to wrong Cyrillic equivalent.

3. Add unit tests: keyboardLayout.test.js (39 tests, node-runner):
   - EN→RU: dthcnfr, ghbdtn, ntcn
   - RU→EN: руддщ, цщкдв, ышеш
   - Unicode safety: Latin c (U+0063) ≠ Cyrillic с (U+0441)
   - expandKeyboardVariants for mixed inputs
   - Edge cases: empty, single char, mixed case, numbers

4. InternalLinkPicker type tabs → filters (not search modes):
   - Store rawResults (all) + filtered results by activeType
   - Switching type tab no longer clears query or triggers new search
   - Just filters existing rawResults by selected type
   - Shows 'Нет результатов для этого типа' when filtered empty

5. Both GlobalSearch and InternalLinkPicker use same expandKeyboardVariants()

All tests PASS, full build OK.
2026-06-15 11:37:35 +08:00
.codex feat: ШАГ 1 — Bridge HTTP-сервер для браузерного расширения 2026-06-06 18:23:47 +08:00
build/linux chore: add wails.json, remove wails3 artifacts, rebuild binaries 2026-06-03 01:48:12 +08:00
cmd fix: global search case-insensitive + keyboard layout swap 2026-06-15 10:52:34 +08:00
contrib/plugins feat(calendar): restore full calendar UI in iframe panel 2026-06-08 16:36:53 +08:00
docs security: стабилизационный аудит Lua plugin system 2026-06-07 19:19:44 +08:00
extension feat: плагин-система Lua + Calendar reference plugin 2026-06-07 14:59:46 +08:00
extension-firefox fix(browser-bridge): don't send X-Verstak-Secret when empty/undefined; add integration tests 2026-06-09 01:02:37 +08:00
frontend fix: keyboard layout map, picker type tabs as filters, add unit tests 2026-06-15 11:37:35 +08:00
internal fix: global search case-insensitive + keyboard layout swap 2026-06-15 10:52:34 +08:00
migrations steps 4-6 + doc overhaul: files, notes, GUI, plugins docs 2026-05-30 20:35:04 +08:00
scripts fix: correct frontend deps check in build script 2026-06-15 09:32:01 +08:00
.env.example release infra: build scripts, Firefox signing, plugin fixes 2026-06-08 11:07:29 +08:00
.gitignore release infra: build scripts, Firefox signing, plugin fixes 2026-06-08 11:07:29 +08:00
AGENTS.md fix: stabilize markdown notes — internal link modal, rename UI, trash integration 2026-06-15 09:19:26 +08:00
README.md release infra: build scripts, Firefox signing, plugin fixes 2026-06-08 11:07:29 +08:00
VERSION release infra: build scripts, Firefox signing, plugin fixes 2026-06-08 11:07:29 +08:00
go.mod feat: плагин-система Lua + Calendar reference plugin 2026-06-07 14:59:46 +08:00
go.sum feat: плагин-система Lua + Calendar reference plugin 2026-06-07 14:59:46 +08:00
package-lock.json fix: Firefox extension 1.0.4 — secret handling, force ping, queue flush bugs 2026-06-09 01:15:12 +08:00
package.json fix: Firefox extension 1.0.4 — secret handling, force ping, queue flush bugs 2026-06-09 01:15:12 +08:00
test_smoke_sync.sh test: update smoke test for user auth flow 2026-06-01 23:36:38 +08:00
wails.json chore: add wails.json, remove wails3 artifacts, rebuild binaries 2026-06-03 01:48:12 +08:00

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. При выходе новой версии достаточно:

  1. Подписать новый XPI
  2. Заменить файл на сервере
  3. Обновить 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