Root cause: a data-integrity bug, not visual. The month grid is built from
.weekOfMonth (respects Calendar.current.firstWeekday), but the weekday header
was hardcoded Sunday-first ("S M T W T F S") and the week-number label was gated
on isSunday (weekday == 1). On any non-Sunday-first locale (or when the user sets
"Start Week On" = Monday) every column was mislabeled by one and the W-number
landed on the wrong column — e.g. June 1 2026 (a Monday) appearing under "S".
Fix:
- Extract pure, testable date math into CalendarGrid (monthGrid + weekdaySymbols).
- Header now derived from firstWeekday, so it always matches the grid.
- Week-number label gated on isWeekStart (weekday == firstWeekday), not Sunday.
- Document that week numbers are locale weekOfYear (consistent with the layout),
not ISO.
- gridDays() and the year-view mini-month dedupe to CalendarGrid.
Verification:
- New KisaniCalTests target with 9 tests, all passing on simulator: exact
Sunday-first June 2026 grid, header↔grid alignment for firstWeekday 1...7,
cell date identity, month navigation (May/Jul/Feb 2026 + Feb 2028 leap +
Dec 2026→Jan 2027), and event-day bucketing (all-day, late-night, midnight-
crossing) across 4 timezones.
- Verified in the running app: header S M T W T F S, May 31 in the Sunday
column, June 1 under Monday, June 24 (Wednesday) selected.
Adds a DEBUG-only KISANI_INITIAL_TAB launch env (compiled out of Release) used
to screenshot the calendar past the sign-in gate.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Previous logic compared dueDate against startOfDay for all tasks, so a task
due at 2:00 PM stayed in "Today" until midnight even after the time passed.
TickTick rule:
- hasTime=true → overdue the moment dueDate < now (wall clock)
- hasTime=false → overdue at start of next day (dueDate < startOfDay)
overdueTasks: now uses `dueDate < now` for timed tasks, `dueDate < today`
for date-only tasks.
todayTasks: now excludes timed tasks whose time has already passed — those
belong in overdue, not today — while keeping date-only tasks in Today for
the full calendar day.
Co-Authored-By: Kutesir <tqwyy79vzn@privaterelay.appleid.com>
- Remove 🎉 from the My Tasks widget empty state.
- Remove 𝕏 👾📸 from Settings → Follow Us row.
- About row and About sheet now read the version from the bundle
(new Bundle.marketingVersion / buildNumber / versionDisplay helpers)
instead of a hardcoded "v1.0.0", so it always tracks the real build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Calendar timeline views only populated in Month. Fixes:
- Day/3-Day time grid dropped untimed (midnight) tasks and ignored
recurrence. Now uses occurrences(on:) + hasTime, and adds an all-day
band for untimed tasks, all-day events, and the day's workout.
- Week showed abstract color bars; now lists real task/event titles
(up to 4/day + "N more") via a shared cvAgendaItems helper.
- List view and the task-list toggle now use occurrences(on:) so
recurring tasks appear.
TodayView:
- Slimmer task checkbox (18pt open ring vs 22pt filled donut).
- Confirm before completing a future-dated task (Next 7 Days / Later)
to prevent accidental completion; today/overdue still toggle instantly.
Bump build to 2.0 (9). Add App Store support-site one-pager.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Bump LastUpgradeCheck/scheme to Xcode 2620
- Enable DEAD_CODE_STRIPPING, ENABLE_USER_SCRIPT_SANDBOXING, and
STRING_CATALOG_GENERATE_SYMBOLS across targets
- Set CURRENT_PROJECT_VERSION to 8
- Lock iPhone orientation to portrait; normalize iPad orientations
- Use explicitFileType for app/appex product references
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a Customize → "Time Milestones" toggle bound to the App-Group
kisani.periodMilestones flag (so NotificationManager reads the same value).
Flipping it reschedules immediately — off clears the day/week/month/year
notifications, on re-schedules them. Defaults on. Closes the pending #2 from the
KC-31 audit; #6 (configurable thresholds/snooze) remains pending.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Lock-screen Mark Complete / Snooze now push to iCloud (CloudSyncManager) and
reload widget timelines, so background completions reach iCloud/Watch/widgets
immediately instead of waiting for the next app run.
- Notification copy ("Urgent — tap to mark complete" + evening check-in) now uses
the live computed Matrix quadrant: reschedule snapshots urgent task IDs from
displayQuadrant and threads them into scheduleTasks/notifBody, instead of the
stale stored task.quadrant.
- postponeAllOverdue now mirrors single postpone (clears urgencyOverride and
re-syncs the stored quadrant per task).
- ISSUES.md: added KC-31 (audit), corrected KC-30 (midnight day/week/month/year);
left #2 (period-notif Settings toggle) and #6 (configurable thresholds/snooze)
as pending; noted #1 (Move lists 3 quadrants) as intentional KC-25 behavior.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
WenzaWatch (new watchOS target, embed disabled until the watchOS platform is
installed — see project.yml note):
- Today list of actionable tasks (dated today/overdue + recurring occurrences),
tap-to-complete with haptics, and add-via-dictation.
- Reads/writes the same tasks through the shared iCloud KV store that
CloudSyncManager mirrors on the phone; watch entitlement uses the iOS app's
kvstore identifier so they share one store. New tasks include all required
TaskItem keys so the phone decodes them.
- NOTE: not compiled here (watchOS SDK absent on this machine); iOS build
verified green with the embed commented out.
Period notifications: day/week/month/year now all fire at midnight (00:00),
adding the daily "One more day passed." (Pretty Progress style).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Workout window: the header ⋯ menu gains "Mark All Complete" and "Clear All
Sets" (Manage Workouts preserved). New WorkoutViewModel.setAllSetsDone(_:)
ticks every set across all sections/exercises and runs the normal completion/
logging path.
- Recurring tasks: completing an occurrence now posts a quiet "✓ Done. Repeats
<tomorrow / in 1 week / …>" confirmation via NotificationManager
.notifyRecurringCompleted, phrased from the next active occurrence. Hooked
into TaskViewModel.toggleOccurrence; un-completing does nothing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Bars widget: tracked ("Track Countdown") events now also advance — a completed
or past (non-recurring) tracked event falls through to the next-nearest, and the
refresh boundary covers the tracked event's expiry. Recurring tracked events
still roll forward. Completes the KC-26 auto-advance for all paths.
- Progress Dots on the lock screen (accessoryRectangular): show 28 larger dots
instead of 100 tiny ones, render with .primary for the vibrant tint, and use
AccessoryWidgetBackground so it's legible (Home Screen keeps the 100-dot grid).
- Notifications: snooze action labels now read "Snooze 15 min/30 min/1 hour/
2 hours" (lock screen) and "Snooze 15 Minutes…" (in-app Postpone menu).
- New period milestone notifications: recurring "One more week/month/year passed"
at end of week (Sun 20:00), month (1st 09:00), and year (Jan 1 09:00); gated by
a kisani.periodMilestones flag, scheduled via the existing reschedule path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Today ⋯ menu: implemented the placeholder actions.
- Background: 5 selectable themes (Default/Warm/Cool/Mono/Paper), persisted.
- Group & Sort: group by Date (default)/Priority/Category/Quadrant and sort by
Smart/Due/Priority/Title; non-date groupings render via UpcomingSection.
- Select: multi-select sheet with Select All/Deselect All and bulk
Complete/Priority/Move/Delete.
New isolated file TodayMenuFeatures.swift; added TaskViewModel.allActiveRows.
- Matrix "Move" submenu now lists only the other three quadrants (excludes the
current one) using clear matrix labels.
- Event Countdown (Bars) widget auto-advances: each timeline entry re-resolves
"nearest to finish" as of its own time and refreshes at the moment the current
event expires, so it rolls to the next event on expiry/completion.
- Splash wordmark rebranded to "wenza." (regular-weight typewriter + orange dot).
- ISSUES.md: logged KC-23 (Pick Date + time-based reminders), KC-24 (Wenza
rebrand), KC-25 (Move trim), KC-26 (widget auto-advance).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Renames the user-facing app to Wenza without changing identity:
- CFBundleDisplayName → "Wenza" (app) and "Wenza Widgets" (widget extension).
- Calendar/Health permission prompts now reference Wenza.
- In-app copy updated: sidebar title, Auth + Onboarding screens, Settings
about/help rows, feedback email subject, tutorial text, widget description.
Bundle identifier, App Group, UserDefaults storage keys, team ID, and the
internal Xcode target/project names are intentionally unchanged, so this stays
the same App Store app with no user data loss. App Store listing name must be
changed separately in App Store Connect.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Date menu now offers "Pick Date" (and Edit) in the Matrix grid cards and the
Calendar reschedule/move menu, matching the tasks view — both open the shared
TaskEditSheet via a new editingTask sheet.
- Reworked the reminder picker (TaskDatePickerSheet, shared by all entry points)
from day/week offsets to sensible time-based ones relative to the event time:
None, On time, 5 min, 30 min, 1 hour, 1 day, plus a Minutes/Hours/Days custom
wheel. Existing absolute reminderDates migrate to the nearest minute offset.
- Notifications gain Snooze actions (15/30/60/120 min) that reschedule the task
reminder; postpone now clears the Matrix urgency override.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refines the Eisenhower Matrix toward TickTick's "view over attributes" model:
- Split the single quadrant override into two axes: importance is always
Priority (High = top row); urgency is date-derived unless manually pinned
via the new `urgencyOverride` flag. Horizontal drags pin urgency instead of
fabricating/destroying a real due date; vertical drags set Priority directly.
- A drag only flags "Manual" when the target column disagrees with the
date-derived urgency, so dropping into a task's natural column stays on Auto.
- Tiles show a "Manual" badge; the task menu gains "Reset Matrix Urgency".
- Urgency window is now 3 days by default, widened to 14 for prep-heavy event
types (birthday/domain/annual + subscription/renewal/exam/deadline titles).
- New tasks no longer default to today — no date stays no date (not urgent).
- Stored `quadrant` is kept synced to the computed placement so task color and
widget accents follow the Matrix; Settings stats count by displayQuadrant.
- Completed tasks are hidden from the Matrix grid by default (toggle to show).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Priority defaults only fired at creation, so tasks saved before Priority
existed (e.g. birthdays) all had `.none` and fell to the Matrix bottom row
instead of Q2. Added a one-time, flag-guarded migration on load that applies
the KisaniCal category defaults (birthday/domain/annual/exam/subscription →
High, workout → Medium) to existing `.none`-priority tasks.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Matrix (KC-21): the Eisenhower Matrix is now a computed view of tasks.
Importance = Priority (High = top row), urgency = deadline proximity, so
tasks auto-place into Q1–Q4. Added a persisted `matrixOverride` so a manual
drag pins the task and syncs its Priority to that row (top → High, moving
down demotes High → Medium) and never gets forced back; editing Priority,
due date, or the editor clears the override to re-place live. New tasks get
KisaniCal priority defaults (birthday/domain/annual/exam/subscription → High,
workout → Medium). AddTaskSheet drops the manual quadrant picker for a
Priority menu (pick Priority + Date only).
Also includes in-progress Progress Dots widget work (day/week/month/custom
event modes, App-Group anchor, recurrence-aware spans).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The real bug behind "Leona's Birthday, 5 days left" showing 0% filled:
Mode B (recurring span: previous -> next occurrence) only ran for
app-tracked events, while the upcoming-queue / picked-event paths still
anchored from first-seen (so a yearly birthday started at 0%).
- EventEntity now carries isRecurring/recurrenceLabel (populated from the
shared task data) so the auto-select and picker paths know the rule.
- resolveSpan() centralizes the window: recurring -> prev/next occurrence
everywhere; one-off -> explicit start / tracking date / first-seen.
- A yearly birthday 5 days away now reads ~98% (≈360/365 days elapsed).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Task long-press menu gains Track/Stop Tracking Countdown, storing the
tracked event id + tracking date in the App Group (CountdownTracker)
and reloading widget timelines.
- The widget reads the tracked event directly and bypasses its config:
Mode A (one-off) = tracking date -> event date; Mode B (recurring) =
previous occurrence -> next occurrence via the task's recurrence rule.
- WidgetTask decodes isRecurring/recurrenceLabel from the shared JSON.
- With nothing tracked, the configured modes remain the fallback.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
WidgetTheme now uses the true brand colors — accent RGB(232,98,42) on
the logo's dark RGB(26,29,34) — replacing a near-miss orange on slate.
Bars countdown, My Tasks, and Day Progress inherit it; Task Live
Activity drops its hardcoded accent/black tint for the theme; lock
screen rings tint brand orange.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Persist a per-event "first tracked" anchor in the App Group instead of
resetting the progress start to now on every refresh (auto mode), so
the bar actually fills toward the event. Explicit "Counting from" wins
when it's before the event date.
- Make Event date / Counting from optional ("Choose") — the same-second
defaults produced a zero-length span (always 0%) and looked broken.
- Pre-render timeline entries every 30 min (12h horizon) so the bar and
time-left label move between refreshes instead of only at midnight.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Drop the dot-grid EventCountdownWidget and TasksCompleteWidget from the
gallery: widget structs, their views, the todayTaskCompletion() helper
(only consumer), and bundle registrations. Shared event plumbing
(EventConfigIntent/Provider/Entry, CycleCountdownUnitIntent) stays for
the surviving Event Countdown (Bars); DotGrid stays for Day Progress.
Remaining widgets untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Notification actions on workout reminders/check-ins: "Yes, I completed
it", "No, I didn't" (marks the day missed, then asks to compensate on a
rest day), "Remind me in 1 hour" (snooze).
- VM: missedDates + compensations (persisted/synced), per-date
markWorkoutDone/Missed, workoutStatus, upcomingRestDays,
scheduleCompensation, promptCompensation, checkPendingMissed.
program(for:) returns a compensation program on its rest day.
- CompensationSheet: pick a rest day or keep as missed; compensation days
get a one-off "Missed workout recovery" reminder.
- Long-press menus: workout row (Done / Not Done / Compensate) in Today +
Calendar; exercise cards (Mark as Done / Not Done). All actions are
per-date — one occurrence never affects another.
- Workout row shows Pending / Done / Missed + "Compensation" label.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New EventBarsWidget ("Event Countdown (Bars)") using BarGrid + EventBarsView,
with a fine "X hr, Y min left" label; registered in the bundle.
- Re-themed every home-screen widget to the shared WidgetTheme (dark slate
background + brand orange): Day Progress, Tasks Done Today, Event Countdown
(dots), My Tasks. Lock-screen widgets keep .thinMaterial (system-tinted).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Groundwork for the slate-background / brand-orange widget re-theme and the
new bar-style event countdown:
- WidgetTheme (dark slate background, brand orange accent, text tones).
- BarGrid: vertical-bar (comb) progress view.
Re-theming the existing widgets and adding the bars widget follows.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Aggregate the per-day workout logs into performance stats:
- WorkoutDayLog.volume + StatPeriod/WorkoutStat/StatBucket.
- WorkoutViewModel.stat/statInterval/statBuckets (current vs previous).
- WorkoutStatsView: Day/Week/Month selector, Workouts/Sets/Volume cards
with %-delta vs previous period, metric chooser, and a Swift Charts bar
trend. Reached via a chart button in the Workout header.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Quadrant is now computed (importance x urgency) instead of a fixed
assignment. Importance comes from the task's assigned row (Q1/Q2 vs
Q3/Q4); urgency is derived from the (next active) due date being within
urgentWindowDays (7). So important tasks slide Q2->Q1 as they near,
unimportant slide Q4->Q3, and recurring tasks roll forward (a completed
occurrence is replaced by the next, never piling up in a quadrant).
- VM: displayQuadrant/isUrgent/effectiveDue; matrixTasks groups by the
computed quadrant and uses each recurring task's single next occurrence.
- MatrixView grid + drill-down (overdue/later/completed) group by it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Switch lists from calendar-expansion (every occurrence in every section)
to the TickTick model: one task contributes ONE next-active occurrence.
- VM: nextActiveOccurrence + activeRows; replace todayTasks/next3/upcoming
with todayTasks/tomorrowTasks/next7DaysTasks/laterTasks buckets. A
recurring task shows a single row; completing it advances to the next.
- TodayView: sections are now Today / Tomorrow / Next 7 Days / Later
(UpcomingSection gained a title param).
- TaskRowView: add ⏰ (reminder) and 🔁 (recurring) indicators on the right;
fix the hardcoded "Annual" label to show the real frequency.
Calendar grid keeps per-date occurrences (it's a date grid, not a list).
Matrix dynamic promotion (Problem 4) handled separately.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Thread recurrenceEnd through NLParsed, TaskDatePickerSheet, the add/edit
sheets, and addTask/updateTask. The date picker now shows a "Repeat until"
row (graphical picker, default "Forever", with Clear) whenever a
recurrence is set; the engine already honored recurrenceEnd.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recurring tasks only ever showed on their single dueDate. Add a
recurrence engine that expands occurrences per-date with independent
per-occurrence completion.
- TaskItem: recurrenceEnd + completedOccurrences (optional, safe decode).
- TaskViewModel: isOccurrence/occurrenceComplete/toggleOccurrence/
occurrenceCopy/nextOccurrence/occurrences(on:); Daily/Weekly/Monthly/
Yearly/Every-Weekday; respects recurrenceEnd; works across years.
- toggle() routes recurring rows to per-occurrence completion.
- Date filters re-inject per-date occurrence copies; recurring excluded
from overdue. Calendar dots + day detail use occurrences(on:).
Also log KC-11 (year display) + KC-12.
Pending: "repeat until" date UI (engine already honors recurrenceEnd).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Navigation was unbounded, but headers only showed the month name so the
year change was invisible and future months felt unreachable.
- Main calendar header now shows "Month Year".
- Date-picker grid label shows the year.
- Year view gets a chevron year navigator (unbounded) + year label.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The calendar marked every occurrence of a program complete once any one
was finished — including future dates — because DayTimelineView read the
program's live shared doneSets.
- Add WorkoutViewModel.isWorkoutComplete(on:) backed by workoutDates.
- DayTimelineView takes workoutDone and uses it instead of live sets;
Calendar passes the selected date's state, Today passes today's.
- A date now shows complete only if that specific date was finished.
Log KC-10 in ISSUES.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add per-day workout history: WorkoutDayLog/LoggedExercise/LoggedSet
models stored at kisani.workout.history.<uid> (iCloud-synced).
- snapshotDay(_:) captures the active program's completed sets on full
completion and before the daily reset; only days with >=1 done set.
- New WorkoutHistoryView (clock button in the Workout header) lists past
days newest-first with per-exercise breakdown.
- Log KC-8 (auto-switch / Rest Day) and KC-9 (history) in ISSUES.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The existing ignore rules were anchored to repo root, so the nested
*.xcodeproj/project.xcworkspace/xcuserdata/ never matched and kept
showing up as a change on every commit. Add **/xcuserdata/ and
*.xcuserstate and untrack the file.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Workout tab kept showing the last-used program (with its old
completion) regardless of the weekly schedule, so a rest day still
displayed a stale, fully-checked workout.
- On a new day, the active program now follows the weekly schedule
(applyScheduledProgramForToday in resetSetsForNewDayIfNeeded).
- Add isRestDayToday + a Rest Day card shown when today has no scheduled
program, with a "Work out anyway" override. Header reads "Rest Day".
- Daily set reset (KC-1) unchanged — no day starts pre-checked.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The previous App Store upload failed on the iPad launch-screen check
because it was a stale archive built before the LaunchScreen fix
(72f4566). Bump CURRENT_PROJECT_VERSION so a fresh archive uploads
cleanly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Removes the published Proxy Hosts / Services table from the Sanctum
Auto-FailOver + Uptime Kuma runbook.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add "Upcoming queue" toggle to the Event Countdown widget. When on, it
auto-tracks the Nth nearest upcoming event (Nearest / 2nd … 5th, new
AutoSelectRank enum). When off, track a picked or fully custom event.
- parameterSummary now shows only the relevant fields per mode (toggle +
auto-select, or event/name/date), so the date input only appears for
custom events.
- Replace the dense 380-day placeholder with a ~90-day window so the
gallery preview shows a legible dot grid.
(The interactive task-checkbox widget already exists as "My Tasks".)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
App Store upload rejected the bundle: iPad-multitasking apps must declare
a launch screen, but project.yml set an empty UILaunchStoryboardName ("")
and provided no UILaunchScreen.
Add a minimal LaunchScreen.storyboard (blank, systemBackgroundColor) and
point INFOPLIST_KEY_UILaunchStoryboardName at it. Regenerated the project.
Bundle now ships UILaunchStoryboardName=LaunchScreen + compiled
LaunchScreen.storyboardc; builds clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
KC-5: Consolidate calendar access into CalendarStore.shared so Today,
Calendar, Onboarding, and Settings share one permission state and event
cache. requestAccess() debounces and reads authoritative status; turning
on "Show Calendar Events" while unauthorized now prompts. New Settings →
Data → Calendar row shows Connected/Connect/Denied.
KC-6: Add calendar-event notifications. CalendarStore.upcomingEventNotifs
snapshots visible events (next 7 days); NotificationManager schedules at
start time plus each event alarm (all-day at 9am), capped at ~20 to stay
under iOS's 64-notification limit. Wired into reschedule().
Log KC-5 and KC-6 in ISSUES.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Introduce CalendarStore.shared so Today, Calendar, and Onboarding read
the same auth status and event cache instead of each spinning up its own
EKEventStore. Trust the system's authoritative authorization status over
the granted bool, debounce repeat permission requests, route denied users
to Settings, and prompt when enabling local calendars without access.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Omada policy-routing setup that pins each monitoring host to a specific
ISP (Canal+/Airtel) so Uptime Kuma surfaces per-link failures instead of
masking them behind WAN failover.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Task context menu (new shared TaskMenuItems) consistent across Today,
Matrix, and Calendar: Pin · Date · Move · Priority · Tags · Add to Live
Activity · Delete. Adds TaskViewModel.setPriority.
Live Activity (ActivityKit):
- TaskActivityAttributes shared between app and widget targets
- LiveActivityManager (start/update/end/toggle, iOS 16.1+)
- TaskLiveActivity widget: lock-screen banner + Dynamic Island
- NSSupportsLiveActivities via project.yml; project regenerated
Calendar events (non-subscription, writable only):
- Edit via system EKEventEditViewController (EventEditView wrapper)
- Delete via new CalendarStore.deleteEvent
Also sweeps in prior in-progress edits already present in the working
tree (AuthManager, NotificationManager, TaskItem, task views) and the
updated ISSUES.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Move the Overdue card to sit directly below today's active tasks
(above Next 3 Days) so your real tasks stay at the top.
- Filter subscription/RSS calendar feeds (F1, TV shows, etc.) out of the
Today/Tasks timeline; they remain in the Calendar tab. Birthdays and
personal calendars are unaffected.
Note: also carries prior in-progress TodayView edits that were already
in the working tree before this session.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
KC-1: Set completion was stored permanently on the program, so the same
program scheduled on back-to-back days (e.g. Shoulders Mon + Tue) kept
yesterday's checkmarks. Add resetSetsForNewDayIfNeeded() to clear every
set's isDone when the calendar day changes (cold launch, onAppear, and
scenePhase active). Streak history is untouched.
KC-2: Replace all 12 AppIcon sizes with the new KisaniCal mark, alpha
flattened onto RGB(26,29,34) so the 1024 App Store icon is fully opaque.
Add KisaniCal/ISSUES.md tracker (KC-1, KC-2: In Progress).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>