Add custom field definitions with entity-backed CustomFieldService
Details
Introduce global workspace-scoped custom fields that can be added to any task.
Field values are stored in the existing TaskItem.CustomFields dictionary using
a "cf_" key prefix to avoid collision with internal keys.
Key additions:
- CustomFieldDefinition model with 13 field types (text, number, date,
single_select, multi_select, checkbox, url, email, phone, currency,
rating, person, formula)
- CustomFieldValue record with type-safe accessors (GetString, GetNumber,
GetBool, GetStringList) and formatted display output
- CustomFieldService with CRUD via SDK (entity type: task_custom_field),
in-memory cache, and field value read/write helpers
- Entity schema for task_custom_field in TasksPlugin
- ViewModel exposes CustomFieldDefinitions and SelectedTaskCustomFields
- Version bump to 1.22.0
Add custom status definitions with entity-backed StatusService
Details
Replace hardcoded task status strings with dynamic StatusDefinition entities
managed by a StatusService CRUD layer. Status definitions are stored via SDK
as "task_status" entities with name, key, color, icon, category, and sort order.
Eight default statuses are seeded on first use: todo, in_progress, done, waiting,
blocked, review, deferred, cancelled — each assigned to a semantic category
(not_started, active, done, cancelled).
Key changes:
- StatusDefinition model with 4 category types and 8 built-in defaults
- StatusService with in-memory cache, CRUD, and EnsureDefaultStatusesAsync
- TaskItem.ResolvedStatus transient property drives StatusColor/DisplayStatus
- Board column assignment uses category-based mapping via GetBoardColumnForStatus
- Status filters and smart filters use category-based matching
- Statistics (todo/active/done/cancelled counts) use StatusService lookups
- Command palette and status display use StatusService.GetDisplayName
- Removed CustomStatus property and CustomStatuses collection (superseded)
- Version bump to 1.21.0
Decompose TasksViewModel god object into partial classes
Details
Extract 4 partial classes from TasksViewModel.cs (5248 → 3277 lines):
- TasksViewModel.Board.cs (326 lines): Kanban columns, drag-drop reordering, status movement
- TasksViewModel.Filters.cs (485 lines): Filter/sort properties, ApplyFiltersAndSort, timeline groups
- TasksViewModel.Timer.cs (947 lines): Multi-timer management, auto-save, crash recovery, ITimerBehavior
- TasksViewModel.Projects.cs (353 lines): Project CRUD, assignment, statistics
Internal refactor only — no behavioral changes, no version bump.
Move test projects to tests/ directory, exclude from deploy pipeline
Details
Finance.Tests and Finance.TestRunner were at the repo root alongside
real plugins, causing the deploy workflow glob (PrivStack.Plugin.*/*)
to pick them up as deployable plugins. Moved both into tests/ and added
a safety guard in the workflow to skip *.Tests and *.TestRunner
directories. Updated ProjectReference and Compile Include paths to
reflect the new location.
Add content and tags slots to notes.create_note intent
Details
The notes.create_note intent previously only accepted a title, creating
empty pages. Duncan would tell users it couldn't add content to notes.
Now accepts:
- content (Text, optional): parsed into paragraph blocks, with support
for # headings and - bullet lists via lightweight markdown parsing
- tags (String, optional): comma-separated tags
After creating the page, if content is provided, it's converted to a
PageDocument via PageContentBuilder and saved with UpdatePageAsync.
This follows the same create-then-update pattern used by templates.
Bumps Notes plugin to 1.62.2.
Get notified about new releases