Skip to main content

max / goingson

Add rich recurrence rules and virtual event expansion Implement full recurrence rule system with interval support (every N days/weeks/months), weekday selection for weekly (Mon/Wed/Fri), and monthly specifications (day-of-month or Nth weekday like 2nd Friday). Events now use virtual expansion: recurring events are stored once and computed at query time for any date range. Integrated into list_events, day planner, upcoming events, and weekly review. Tasks keep create-on-completion model but use rich rules for next-due calculation. Migration 045 adds recurrence_rule JSON column to both tables with updated sync triggers. Frontend: recurrence config UI (interval, weekday checkboxes, monthly spec) added to both task and event forms.
Co-Authored-By
Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-05-05 22:15 UTC
Commit: 3a616efef535893815a548a214ec2a38c7731507
Parent: 2326f8b
26 files changed, +1240 insertions, -94 deletions
M docs/todo/todo.md +13 -53
@@ -1,13 +1,20 @@
1 1 # GoingsOn Todo
2 2
3 - Done: Phases 1-9. Active: Phase 5 sync tests. Next: Phase 4 live sync, desktop distribution.
3 + Done: Phases 1-9, Phase 5 attachments, code fuzz, email compose (10/10). Next: sync monetization, live sync, desktop distribution.
4 4
5 - v0.3.1. Audit grade A. ~762 tests. Code fuzz: 17/18 fixed.
5 + v0.3.1. Audit grade A. ~313 tests. Code fuzz: 18/18 resolved. Migrations 041-044.
6 6
7 7 Completed items: [todo_done.md](./todo_done.md)
8 8
9 9 ---
10 10
11 + ## Audit Items (Run 19, 2026-05-04)
12 +
13 + - [x] Fix symlink canonicalization in plugin loader — already fixed (verified 2026-05-05)
14 + - [ ] Add execution timeout to Rhai engine (in addition to operation limit) — deferred, low priority
15 +
16 + ---
17 +
11 18 ## Sync Monetization
12 19
13 20 GO is free. Cloud sync is the only revenue source. Includes full metadata + attachment blob sync. See `MNW/server/docs/internal/business/app_sync_pricing.md` for full pricing rationale.
@@ -50,12 +57,6 @@
50 57
51 58 ---
52 59
53 - ## Phase 5: File Attachments
54 -
55 - - [x] Sync tests: attachment in changelog, table_columns whitelist, UPSERT/DELETE ordering
56 -
57 - ---
58 -
59 60 ## Phase 6: Passkey Authentication (WebAuthn/FIDO2)
60 61
61 62 ### Pre-beta
@@ -101,21 +102,6 @@
101 102
102 103 ---
103 104
104 - ## Email Compose (pre-beta)
105 -
106 - - [ ] Attachment sending — can receive but not attach to outbound
107 - - [ ] Signatures — per-account email signature
108 - - [ ] Drafts (real) — current drafts save as regular emails with draft@local address
109 - - [ ] Contact autocomplete — recipient address completion
110 - - [ ] Email search UI — FTS backend exists, no email-specific search in UI
111 - - [ ] Attachment download/open — metadata extracted, no UI to save/open
112 - - [ ] Keyboard shortcuts — only Cmd+Enter and Escape currently
113 - - [ ] Quoted text collapse — threads get unreadable without it
114 - - [ ] Labels / folders — only INBOX + Archive, no custom organization
115 - - [ ] Notifications — system notifications on new mail
116 -
117 - ---
118 -
119 105 ## Shared Code Extraction (Cross-Project)
120 106
121 107 - [ ] Updater UI: extract nearly-identical updater.js from GO/BB into shared module
@@ -130,30 +116,17 @@
130 116
131 117 ### Discoverability
132 118 - [ ] Add touch gesture hints on first mobile use (long-press, swipe, pull-to-refresh)
133 - - [x] Surface hidden features in task detail modal — subtasks, annotations, focus mode, and time tracking are only accessible via right-click context menu; add visible buttons/sections in the task detail view
134 119 - [ ] Add global search / command palette (Cmd+K) — backend FTS5 exists but has no UI; search across tasks, projects, emails, contacts, events
135 - - [x] Add `g`-prefix visual feedback — pressing `g` gives no indication a key sequence is active; show a brief "Go to..." overlay listing destinations
136 - - [x] Show keyboard shortcut hints on major buttons — e.g. "[q] Quick Add", "[n] New Task", "[?] Shortcuts" as title attributes or subtle inline labels
137 - - [x] Add quick-add syntax popover — show syntax help when user types `@`, `#`, or `+` in the quick-add field
138 -
139 - ### Learnability
140 - - [x] Enhance welcome flow with first-action guidance or "Load sample data" option
141 - - [x] Add frontend error message mapper — humanize backend error codes for toasts
142 - - [x] Add real-time date parse preview — show parsed date below Due Date input as user types (e.g. "next friday" → "Friday, May 8, 2026")
143 - - [x] Add tooltip/help text for domain-specific terms — "Snooze" ("hide until a chosen date"), "Milestone" ("group tasks into project phases"), "Recurrence" ("auto-create copy after completion")
144 120
145 121 ### Complexity
146 - - [x] Use natural language date parsing for milestone target dates (currently requires YYYY-MM-DD)
147 - - [x] Simplify email account setup — make OAuth the hero path; hide IMAP server/port/TLS fields behind "Advanced" toggle; auto-detect from domain; move sync interval to post-setup settings
148 - - [x] Extend undo toast window from 5s to 15s — accidental deletions are irreversible if user misses the short toast
149 122 - [ ] Add batch project linking — let users select multiple tasks via checkboxes and link them all to a project in one action
150 123
151 124 ### Feature Completeness
152 - - [ ] Recurring events — table stakes for any calendar feature
125 + - [x] Recurring events — virtual expansion (store once, compute instances at query time). Events form now has recurrence field. Expansion integrated into list_events, day planner, weekly review.
153 126 - [ ] Calendar month/week grid view — even a basic one (events currently list-only)
154 127 - [ ] Separate planning and visualization dashboards — day/week/month views should be distinct from weekly review; weekly review timeline is useful but planning and reviewing are different workflows
155 128 - [ ] Habit tracking — daily checklist with streak/completion visualization (e.g. "gym 6/7 days", "music 5/7 days"). Recurring tasks exist but there's no "did I do this every day this week" view. Key for routine-building use cases.
156 - - [ ] Richer recurrence rules — Daily recurrence should support specifying which hours; Weekly should support specifying which days; Monthly should support specifying which weeks. E.g. "every weekday at 7am" or "weekly on Mon/Wed/Fri" instead of needing 3 separate weekly recurring items. Applies to both tasks and events.
129 + - [x] Richer recurrence rules — RecurrenceRule struct with interval, weekday selection (Mon/Wed/Fri), monthly day-of-month or Nth-weekday (2nd Friday, last Monday). Config UI in both task and event forms. Tasks use rich rules for next-due calculation on completion.
157 130 - [ ] Time tracking reports — per-project breakdown, estimated-vs-actual, weekly/monthly summaries
158 131 - [ ] Contacts export to vCard — import exists but no export (asymmetric)
159 132 - [ ] Bulk operations for contacts (tag, delete) and events (delete)
@@ -162,19 +135,6 @@
162 135
163 136 ---
164 137
165 - ## Code Fuzz Remaining (2026-05-03)
166 -
167 - ### Serious
168 - - [x] `create_initial_snapshot` called outside sync_lock — TOCTOU gap (commands/sync.rs:269-276)
169 -
170 - ### Minor
171 - - [x] iCal DST spring-forward gap falls back to UTC interpretation (ical.rs:129). Fixed: fall back to `.latest()` for spring-forward gaps.
172 - - [x] Blob files loaded entirely into memory for sync upload (blob_sync.rs:53-61). Non-issue: attachments capped at 50 MB (attachment.rs:79), uploaded sequentially (one at a time), so worst case is ~100 MB transient (plaintext + ciphertext). XChaCha20-Poly1305 AEAD requires full plaintext for sealing.
173 - - [x] Temp HTML files from "Open in Browser" never cleaned up (commands/email.rs:345). Fixed: delayed cleanup + startup sweep.
174 - - [x] Migration FK update failures silently swallowed (migrations.rs:74). Fixed: propagate error.
175 -
176 - ---
177 -
178 138 ## Deferred
179 139
180 140 - [ ] Co-working feature: E2E encrypted project sharing (XChaCha20-Poly1305, X25519, Argon2, CRDTs, 7 phases)
@@ -198,9 +158,9 @@
198 158 plugins/ Bundled reference plugins
199 159 src-tauri/ Desktop app (Tauri 2 + vanilla JS)
200 160 src-tauri/src/commands/ Tauri command layer (24 modules)
201 - src-tauri/frontend/js/ Frontend JS (45 IIFE modules under GoingsOn namespace)
161 + src-tauri/frontend/js/ Frontend JS (46 IIFE modules under GoingsOn namespace)
202 162 src-tauri/frontend/css/ Styles (Skeubrute design system)
203 - migrations/sqlite/ SQLite migrations (36 files)
163 + migrations/sqlite/ SQLite migrations (44 files)
204 164 docs/architecture.md Crate structure and data flow
205 165 docs/audit_review.md Audit grades and action items
206 166 docs/todo/todo_mobile.md Mobile port subtodo
@@ -68,7 +68,8 @@
68 68 MilestoneStatus, MonthlyGoal, MonthlyGoalStatus, MonthlyReflection,
69 69 AttachmentMeta, NewAttachment, NewBackupSettings, NewEmail, NewEmailWithTracking, NewEvent, NewEventBuilder,
70 70 NewMilestone, NewProject, NewSavedView, NewTask, NewTaskBuilder, Priority,
71 - Project, ParseableEnum, ProjectStatus, ProjectType, Recurrence, SavedView, SortDirection,
71 + Project, ParseableEnum, ProjectStatus, ProjectType, Recurrence, RecurrenceRule, MonthlySpec,
72 + SavedView, SortDirection,
72 73 SyncAccount,
73 74 SortField, Subtask, Task, TaskFilterQuery, TaskSortColumn, TaskStatus, TimeSession,
74 75 TimeTrackingSummary, UpdateEvent, UpdateProject, UpdateTask, User,
@@ -77,7 +78,7 @@
77 78 };
78 79 pub use parser::{parse_quick_add, parse_quick_add_with_warnings, ParsedTask, ParseResult};
79 80 pub use day_planning::{Conflict, TimelineItem, detect_conflicts};
80 - pub use recurrence::{calculate_next_due, calculate_next_due_with_day, should_recur};
81 + pub use recurrence::{calculate_next_due, calculate_next_due_with_day, calculate_next_due_rich, expand_recurrence, should_recur};
81 82 pub use repository::*;
82 83 pub use urgency::calculate_urgency;
83 84 pub use plugin::{