Add collapsible sidebar to Calendar plugin (BUG #68)
Details
Replace static Border sidebar with shared PluginSidebar control from
PrivStack.UI.Adaptive. Sidebar now has collapse/expand toggle with
smooth animation, resizable width, and consistent behavior matching
Contacts, Snippets, and RSS plugins.
- Add IsCalendarSidebarCollapsed property to CalendarViewModel
- Move sidebar content into PluginSidebar.SidebarContent slot
- Move "+ New Event" button into PluginSidebar.FooterContent slot
- Calendar sources, mini calendar, and quick add all inside sidebar
Clean up GitHub project sync data model
Details
- Remove duplicate GitHubProjectItemLabel DTO; reuse GitHubLabel
directly on GitHubProjectItem.ContentLabels to eliminate unnecessary
type conversion in the mapper
- Add typed accessors on TaskItem for project-specific custom fields:
GitHubProjectSourceId, GitHubProjectItemNodeId, GitHubProjectStatus
- Extract GetCustomFieldString helper to DRY the JsonElement unboxing
pattern shared by GitHubUrl and the new accessors
- Simplify HasProjectStatusChanged to use the typed accessor
Architecture split: extract PrivStack.Services and PrivStack.Server
Details
Phase 0 of the headless server architecture split. Extracts ~155 service
files with zero Avalonia dependency into a shared PrivStack.Services
library and creates a standalone PrivStack.Server headless binary.
Architecture changes:
- New PrivStack.Services project: shared core services, models, native
FFI, AI services, API server, biometric, connections, file sync, IPC,
plugin host, update services — all Avalonia-free
- New PrivStack.Server project: headless console binary (privstack-server)
that references Services + Sdk without any Avalonia dependency
- Desktop now references Services and only contains UI-specific code:
views, view models, theme/font/layout services, dialog service,
backup service, whisper/audio, spell check, plugin registry
Key abstractions created:
- INavigationHost: abstracts MainWindowViewModel navigation for Services
- IEmbeddingService: abstracts ONNX embedding (Desktop implements,
Server stubs)
- IWindowSettingsService: Desktop-only Window position/size persistence
- DesktopAppSettingsService: extends base AppSettingsService with
Avalonia Window operations
- Extensible AI provider registration via constructor injection
Breaking changes to models (Avalonia-free):
- SyncModels: DiscoveryBrush (IBrush) → DiscoveryCategory (string)
- CloudSyncModels: SeverityBrush (IBrush) → SeverityLevel (string)
- IAppSettingsService: removed ApplyToWindow/UpdateWindowBounds
- IDialogService: removed SetOwner/Owner
- IPluginRegistry: SetMainViewModel/GetMainViewModel use object?
Dependency graph:
Sdk (no deps)
↑
Services → Sdk
↑ ↑
Desktop → Services + Sdk + UI.Adaptive + Avalonia
Server → Services + Sdk (no Avalonia)
GitHub Projects v2 full sync: create tasks from project items
Details
GitHub Project sync previously only linked already-synced tasks to a
PrivStack project. Adding a project without also adding each repo as an
issue source resulted in zero tasks. This makes GitHub Projects a
self-contained sync source.
Changes:
- Expand GraphQL content fragment to fetch full issue data (body, state,
author, assignees, labels, comments, timestamps) from project items
- Add project status → PrivStack status mapping with fuzzy column name
matching (Todo/In Progress/Done/Review/Blocked/etc.)
- Add MapProjectItemToNewTask and UpdateTaskFromProjectItem factories
that create/update tasks directly from project items, with project
column status taking priority over issue state
- Rewrite GitHubProjectSyncService.SyncAsync to create missing tasks,
update existing tasks when remote is newer or column changed, and
link tasks to the PrivStack project
- Fix issue sync dedup: broaden task lookup to all github_issue tasks
by source_ref (not just tasks from the current source), preventing
duplicates when both project and issue sources cover the same repo
- Add push ownership guard: only push changes to GitHub if the source
that created the task owns it
- Fix orphan detection to only mark tasks owned by the current source
Version bump: Tasks 1.28.0 → 1.29.0
Add right-click context menus to Calendar events and sidebar calendars (BUG #65)
Details
Event context menu (all views: month, week, day, all-day, agenda):
- Edit Event — opens event editor
- Delete Event — triggers delete with recurring event handling
Sidebar calendar source context menu:
- Hide/Show Calendar — toggles calendar visibility
- Manage Calendars... — opens calendar manager overlay
Right-click is intercepted before drag handlers in week/day/month views
so it doesn't conflict with event drag-to-reposition.
Version: 1.14.4 → 1.14.5
Get notified about new releases