- Sync reminders: new "Sync reminders when mirroring" option (global and per-route) copies source event alarms into mirrored placeholders. CLI flag --sync-reminders. - CLI polish: --help, --list-calendars, --status (all support --json). Scheduled/headless runs record last-run time/result/summary. Failure paths now exit with distinct nonzero codes (2 = no calendar access, 3 = no saved routes) instead of always exiting 0. - Fix settings silently wiped on upgrade: SettingsPayload's auto-synthesized Codable threw on any settings blob missing a field added since (e.g. the new syncReminders key), failing the whole decode and letting the next autosave persist an empty state over real routes/filters. Custom decode now falls back per-field like Route already did, and loadSettingsFromDefaults recovers routes from the legacy routes.v1 key if settings.v2 comes back empty, repairing installs already hit by this. - Roadmap: event-driven background sync (SMAppService + EKEventStoreChanged + wake notification) and an external MCP wrapper around the CLI queued next; decided against direct Google/CalDAV API integration since EventKit already covers it via System Settings accounts. All 47 unit tests pass (45 existing + 2 new SettingsPayloadTests). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 lines
604 B
Swift
24 lines
604 B
Swift
import Foundation
|
|
import EventKit
|
|
|
|
struct MirrorConfig {
|
|
let daysBack: Int
|
|
let daysForward: Int
|
|
let mergeGapMin: Int
|
|
let hideDetails: Bool
|
|
let copyDescription: Bool
|
|
let mirrorAllDay: Bool
|
|
let overlapMode: OverlapMode
|
|
let titlePrefix: String
|
|
let placeholderTitle: String
|
|
let filterByWorkHours: Bool
|
|
let workHoursStart: Int
|
|
let workHoursEnd: Int
|
|
let excludedTitleFilterTerms: [String]
|
|
let excludedOrganizerFilterTerms: [String]
|
|
let mirrorAcceptedOnly: Bool
|
|
let autoDeleteMissing: Bool
|
|
let writeEnabled: Bool
|
|
let syncReminders: Bool
|
|
}
|