mirivlad
e5860ca076
feat: styled registration/confirm pages with login link, consistent theme
2026-06-02 00:31:53 +08:00
mirivlad
daed8e0aba
feat: SMTP security selector (none/STARTTLS/TLS) instead of port-based detection
2026-06-02 00:18:04 +08:00
mirivlad
fa6f988368
fix: SMTP test send JSON instead of multipart FormData (ParseForm can't read multipart)
2026-06-02 00:14:52 +08:00
mirivlad
c8cdb089a6
feat: SMTP test button in admin modal — sends real test email, shows result
2026-06-02 00:12:41 +08:00
mirivlad
4afcc0e135
feat: add SMTP/logging — log.Printf for smtpSend errors, fix confirm URL logic
2026-06-02 00:10:04 +08:00
mirivlad
61928cf28e
fix: restore side-by-side layout for stat counters
2026-06-02 00:04:56 +08:00
mirivlad
04af88940b
refactor: SMTP form and health check into modals with toolbar buttons
2026-06-02 00:03:35 +08:00
mirivlad
015c8fdec7
docs: update sync server guide with user registration flow and full API
2026-06-02 00:00:53 +08:00
mirivlad
0f5c584c50
fix: admin dashboard format errors — use JS for stats, string concat for SMTP values, fix layout overlap
2026-06-01 23:59:15 +08:00
mirivlad
99e47fcb17
feat: add user registration web form at /register
2026-06-01 23:46:25 +08:00
mirivlad
0ef54c31f8
feat: user web GUI — login, dashboard with devices/keys, logout
2026-06-01 23:40:48 +08:00
mirivlad
b3662d4876
test: update smoke test for user auth flow
2026-06-01 23:36:38 +08:00
mirivlad
f8dc436709
feat: client auth — login/password flow, auto device reg, sync interval + improved sync UI
2026-06-01 23:36:19 +08:00
mirivlad
241a9d8c06
feat: user registration, email confirmation, login, device management + SMTP config UI in admin panel
2026-06-01 23:33:58 +08:00
mirivlad
5db3da3618
fix: protect device register with admin auth; improve admin UI (full API key, copy button, styling)
2026-06-01 23:22:19 +08:00
mirivlad
e828ebd44e
docs: add sync server installation and usage guide
2026-06-01 23:13:59 +08:00
mirivlad
84c0bcbcab
test: add E2E smoke test for sync
2026-06-01 23:07:24 +08:00
mirivlad
a1a50863c5
gui: add sync settings panel in Svelte
2026-06-01 22:58:12 +08:00
mirivlad
1abe8c4fa0
cli: add sync push/pull/status commands
2026-06-01 22:56:05 +08:00
mirivlad
5b2cec5bcc
sync: fix SyncStatus binding — remove invalid type assertion, use config for device ID
2026-06-01 22:55:50 +08:00
mirivlad
1a20edac44
feat: sync — client ops recording in core services
...
- internal/core/sync/: Service, Client, Blob packages
- RecordOp creates sync_ops entries for all mutations
- Client for push/pull/blob HTTP to server
- Blob SHA-256 hashing and local storage
- Wired into app.go alongside activity recording
- Device ID from config or fallback
2026-06-01 22:54:23 +08:00
mirivlad
ad684eb118
feat: sync — push/pull API endpoints
...
- POST /api/v1/sync/push — accepts ops, assigns revisions, returns accepted list
- POST /api/v1/sync/pull — returns ops since given revision with server_revision
2026-06-01 22:51:30 +08:00
mirivlad
10c6d06e38
feat: sync — blob upload/download with SHA-256 storage
...
- POST /api/v1/blobs/ — multipart upload, stored as blobs/ab/cd/sha256
- GET /api/v1/blobs/{sha256} — download by hash
- server_blobs table for tracking stored blobs
2026-06-01 22:50:38 +08:00
mirivlad
ec928e3be6
feat: sync — systemd unit and install.sh for server deployment
...
- verstak-server.service — systemd unit with sandboxing, configurable port via env
- install.sh — creates user, installs binary, sets up admin, enables service
Usage: sudo ./install.sh --admin-user admin --admin-pass secret [--port 47732]
2026-06-01 22:49:40 +08:00
mirivlad
c5e0060fee
chore: add verstak-server to gitignore
2026-06-01 22:49:10 +08:00
mirivlad
834b5ef0d4
feat: sync — server skeleton with health, admin login/dashboard, device registration
...
- cmd/verstak-server/main.go — flags: --port, --data, --admin-user, --admin-pass
- Server DB schema: server_devices, server_revisions, server_ops
- Health endpoint GET /api/v1/health
- Admin login page + session cookie auth
- Admin dashboard with device stats and API key management
- Device registration POST /api/v1/device/register
- Stub push/pull/blob endpoints
2026-06-01 22:49:02 +08:00
mirivlad
4145b4d74a
feat: sync — migration 010 for sync_ops and sync_state tables
2026-06-01 22:45:12 +08:00
mirivlad
edc708a106
chore: add spaces/ to gitignore (vault data)
2026-06-01 22:17:39 +08:00
mirivlad
ee708d30bb
docs: sync documentation with current codebase state
...
- Architecture: Wails v3→v2, removed TUI/sync/security from diagram
- UI/UX: layout updated to sidebar+header, sync marked future
- Roadmap: Wails v3→v2 migration note, milestones 10+ PAUSED
- MVP Checklist: mark implemented features as done
- PLAN.md: bindings list synced, repo structure fixed, progress updated
- Medium-term steps documented (sync, scanner, TUI, Lua, etc.)
2026-06-01 22:17:29 +08:00
mirivlad
305158ecc6
test: MVP smoke test for core workflow
...
Covers: vault init, node tree, notes CRUD, file import, actions CRUD, worklog, search (FTS5 optional), reopen persistence, soft delete, worklog report
2026-06-01 22:17:25 +08:00
mirivlad
996322f3a9
gui: actions CRUD + FromTemplate bindings + UI
...
- CreateAction / DeleteAction Wails bindings
- FromTemplate / ListTemplates bindings with recursive tree creation
- Plugin manager stored in App struct for template access
- Action creation modal (title, kind, data) in Overview and Actions tabs
- Delete action button on action cards
- Template selector in new-node dialog
2026-06-01 22:17:18 +08:00
mirivlad
a098cf721c
add missing Wails bindings for ListActivityFeed, ListActivityByNode, CountActivityByNode
2026-06-01 22:00:58 +08:00
mirivlad
3672e3133b
activity: global feed, per-case log, sidebar section, today UX
...
- migration 009: target_type, target_id, target_path columns
- new Event fields: TargetType, TargetID, TargetPath
- ListActivityFeed (paginated global), ListActivityByNode (per-case)
- all Record() callsites pass target info
- frontend: Активность sidebar section with chronological feed
- per-case Активность tab with real data (was placeholder)
- today events: clickable, target-type badges, event counts
2026-06-01 02:53:56 +08:00
mirivlad
5a1c4c6d7f
simplify ListTodayView: remove fallback table queries, pure activity_events + ListTodayNodes
...
TodayView now uses only activity_events (source of truth) + ListTodayNodes (ensure changed cases appear). Removed direct queries to nodes (notes) and files tables — those will come from activity_events going forward.
2026-06-01 02:45:55 +08:00
mirivlad
08c9d5dbea
gitignore: fix verstak-gui pattern to root-only, add .verstak/
2026-06-01 02:16:25 +08:00
mirivlad
c74fa3ad43
today dashboard: activity_events, ListTodayView with events timeline, frontend TodayDashboard separated from sidebar
2026-06-01 02:16:13 +08:00
mirivlad
69891e395c
Today view and Inbox section: dynamic query, not stored sections
...
- ListTodayView() on backend: queries nodes created or updated today
using local timezone day boundaries
- todayBoundaries() helper returns start/end of current day in RFC3339
- Section validation: Create() rejects today and inbox as node sections
- validSections moved from repository.go to types.go with IsValidSection
and IsServiceSection helpers
- Frontend selectSection('today') calls ListTodayView instead of
ListNodesBySection('today')
- FAB (create node) hidden in today and inbox sections
- CreateNode in app.go guarded against today/inbox sections
- types.go: today/inbox defined as service sections (sidebar only)
2026-06-01 01:39:02 +08:00
mirivlad
a4ae22c445
File manager: selection, keyboard shortcuts, rename modal, security, localization
...
- Selection model: click=select, dblclick=open, Ctrl+click toggle,
Shift+click range select, Ctrl+A, Esc to clear
- Keyboard shortcuts: Enter, Ctrl+Enter, F2, Backspace (navigate up),
Delete/Backspace (delete with confirm)
- Rename modal replaces prompt() with validation via backend ValidateName
- Context menu: Open, Open External, Show in Folder, Rename, Duplicate,
Copy, Cut, Delete — all with SVG icons and Russian labels
- Backend security: vaultPath/absPathSafe helpers prevent path traversal,
validateName rejects .. / \ null bytes empty overlong names
- MoveNode auto-renames on name conflict (copy style)
- Duplicate uses (copy) (copy 2) suffix pattern
- Russian localization: all file type labels, preview messages, tooltips
- FilePreviewModal: fixed broken {/if} tag
2026-06-01 01:35:45 +08:00
mirivlad
2487d3bbaa
Files tab: multi-selection, drag-and-drop, keyboard shortcuts, custom confirm modal, SVG icons
2026-06-01 01:16:51 +08:00
mirivlad
645d8878cc
gui: complete Wails v2 vertical MVP — fixes, search, polished UI
...
Backend fixes:
- Wire search service in App struct, implement Search() bindings
- Fix OpenFile to use files.Service.Open() instead of stub
- Fix OpenFolder to open spaces/<slug>/ instead of vault root
- Remove unused imports and dead code in app.go
Frontend fixes:
- Add missing Svelte plugin to vite.config.js (blocking build error)
- Fix optional catch binding for compatibility
- Fix select dropdown rendering on Linux (appearance: none + custom arrow)
- Switch api/verstak.js to use generated Wails v2 bindings
- Include hand-written wailsjs bindings in repository
- Add build.sh to repository
Build:
cd frontend && npm run build
rm -rf cmd/verstak-gui/frontend-dist && cp -r frontend/dist cmd/verstak-gui/frontend-dist
go build -tags 'gui production webkit2_41' -o verstak-gui ./cmd/verstak-gui
2026-05-31 23:48:38 +08:00
mirivlad
b4010a5a24
gui: Wails v2 vertical MVP — bindings + UI
...
Go bindings (cmd/verstak-gui/app.go):
- Wire notes.Service, files.Service, actions.Service, worklog.Service
- CreateNote, ListNotes, ReadNote, SaveNote
- ListFiles, ListActions, RunAction
- ListWorklog, CreateWorklog
- Fix DTO mappings for core types
Frontend (frontend/src/):
- api/verstak.js: Wails v2 API wrapper (window.go.main.App)
- App.svelte: full rewrite with sidebar + 6 tabs + notes editor
- Section filtering → nodes by section
- Notes: create, open textarea editor, save, dirty tracking
- Quick actions, worklog entries, empty states
- Node creation modal with section select
Build:
cd frontend && npm run build
rm -rf cmd/verstak-gui/frontend-dist && cp -r frontend/dist cmd/verstak-gui/frontend-dist
go build -tags 'gui production webkit2_41' -o verstak-gui ./cmd/verstak-gui
./verstak-gui
2026-05-31 20:37:46 +08:00
mirivlad
4a8f4e3319
docs: mark Wails vertical MVP as current stage
2026-05-31 20:15:45 +08:00
mirivlad
ee503c338f
gui: fix layout — full viewport, dark theme, sidebar+main
...
Problem: UI appeared as narrow dark panel on white background with scrollbar.
Root causes:
- html/body had no reset — default browser margin/padding = white borders
- index.html referenced non-existent /style.css
- .app used height:100vh but no width:100vw or overflow:hidden
- sidebar used fixed width instead of flexbox
Fixed:
- index.html: added critical CSS reset (html/body/#app = 100%, margin:0, overflow:hidden, dark bg)
- index.html: removed /style.css ref, changed lang to ru, title to Верстак
- App.svelte: complete layout rewrite
- .app = flex, 100vw x 100vh, overflow:hidden
- sidebar = 260px width, full height, flex column
- main = flex:1, full height, flex column (header + content)
- sidebar nav with sections + nodes using <button> elements
- content area fills remaining space
- proper dark theme colors throughout
- Rebuilt frontend/dist and cmd/verstak-gui/frontend-dist
2026-05-31 19:54:07 +08:00
mirivlad
3e07e611dd
docs: update PLAN.md with Wails v2 build instructions
2026-05-31 19:42:43 +08:00
mirivlad
77a7918569
gui: port frontend to Wails v2
...
Frontend build failure root cause:
- Vite 8 uses rolldown with Wails v3 typed-events plugin
- @wailsio/runtime (Wails v3) in frontend dependencies
- vite.config.js had wails('./bindings') plugin from Wails v3 template
- main.js used Svelte 5 mount() API but Svelte 4 required
Fixes:
- Remove @wailsio/runtime dependency
- Remove wails('./bindings') plugin from vite.config.js
- Replace Vite 8 with Vite 5.4.21 + Rollup (stable)
- Downgrade Svelte 5 to Svelte 4.2.19
- Downgrade @sveltejs/vite-plugin-svelte to v3.1.2
- Fix main.js: mount() -> new App({ target })
- Rewrite App.svelte with Wails v2 binding calls (window.go.main.App.*)
- UI: sidebar with sections, nodes, basic navigation
Build: cd frontend && npm run build -> dist/ (476ms)
Build GUI: go build -tags 'gui production webkit2_41' -o verstak-gui ./cmd/verstak-gui
Run: ./verstak-gui (window opens, no SIGSEGV)
2026-05-31 19:39:49 +08:00
mirivlad
c65187f656
gui: add Wails v2 app skeleton
...
- Install Wails v2.12.0 CLI (go install github.com/wailsapp/wails/v2/cmd/wails@latest)
- Add go.mod require: github.com/wailsapp/wails/v2 v2.12.0
- Create cmd/verstak-gui/main.go: Wails v2 entry point (go:build gui)
- Uses wails.Run() with AssetServer + Bind
- embed frontend-dist (copy of frontend/dist for build)
- Init core services: nodes, files, notes, actions, worklog, search, plugins
- Create cmd/verstak-gui/app.go: App struct with Wails v2 bindings
- ListSections, ListRootNodes, ListChildren, ListNodesBySection
- GetNodeDetail, CreateNode, DeleteNode
- PickFile, PickFiles, PickDirectory (runtime dialogs)
- Stubs for: Notes, Files, Actions, Worklog, Search
- Legacy HTTP GUI preserved in internal/gui/
- Build: go build -tags "gui production webkit2_41" -o verstak-gui ./cmd/verstak-gui
- Wails v2 window opens on Linux desktop (no SIGSEGV!)
- Core tests pass: go test ./...
2026-05-31 19:11:20 +08:00
mirivlad
2e50e95b68
docs: update PLAN.md — Wails v3→v2 migration note, PAUSED status
2026-05-31 18:46:24 +08:00
mirivlad
ae970e5bca
gui: remove Wails v3 dependencies and v3-specific files
...
- Remove guimain.go (Wails v3 entry point with //go:build gui)
- Remove wails_service.go (Wails v3 binding stubs)
- Remove go.mod requires for wails/v3, webview2, and all v3 indirect deps
- Remove vendor/ directory (leftover from Wails v3 init)
- Clean go.mod to only core dependencies: sqlite3, uuid, yaml.v3
- Core tests still pass: go test ./...
2026-05-31 18:44:04 +08:00
mirivlad
600b67bc1e
gui: add Wails v3 desktop app skeleton
...
- Go upgraded to 1.25.10 (required by Wails v3)
- Wails v3 installed (alpha.96)
- Frontend: Svelte+Vite scaffold in frontend/
- guimain.go: Wails GUI entry point (compiled with -tags gui)
- wails_service.go: stub service for Wails bindings
- Verstak desktop binary builds: go build -tags gui -o verstak-gui .
- CLI (./cmd/verstak/) unaffected
- Legacy HTTP GUI (internal/gui/) preserved as prototype
- Build: 24MB ELF binary with GTK4/WebKit2GTK-6
Build commands:
CLI: go build -o verstak ./cmd/verstak/
GUI: cd frontend && npm run build && go build -tags gui -o verstak-gui .
2026-05-31 15:45:52 +08:00
mirivlad
537e8a126e
plan: rewrite for Wails GUI + full file/folder workflow
...
- Archive browser prototype as legacy (step 6)
- New steps 11-14: Wails GUI, Files/Folders, D&D, stabilization
- Steps 15+ paused until step 14 complete
- DokuWiki moved to contrib/plugins/ (optional)
- Full architecture: Wails bindings → Go core → vault+SQLite
- Detailed acceptance criteria for each step
2026-05-31 12:10:58 +08:00