1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# Session State
## Current Focus
Cleaned Backlog
## Recently Completed
- **Post-recurrence fixups: no more overdue-red, Agent API regression fixed, dead code removed** — removed the red text color for overdue widget tasks (plain title color regardless of overdue state). Found and fixed a real regression via systematic debugging: `agent.go`'s four task write/create switches (complete, update due date, update details, create) never got a `"doot"` case when Todoist was removed in favor of native tasks, so every native-task call through the external Agent API 400'd with "Unknown source" — `go test ./internal/...` is now fully green (also removed a stale `TestMealToAtom` test for a function deleted months earlier). Dead-code sweep: removed unused `SourceMeal`/`TypeMeal` atom constants, an orphaned `HandleGetSourceOptions` handler (never routed, rendered a template that no longer exists), and the always-false `IsRecurring` field/branch (never assigned anywhere; the real recurring indicator is `RecurrenceSeriesID`). Deployed server + widget APK.
- **Task recurrence + task-detail popup editing** — doot-native tasks now support server-owned recurrence (daily/weekly/monthly/yearly, optional specific weekdays, custom interval): a new row for the next occurrence is created either when the current one is completed or once its due date passes (a 15-minute background check), whichever comes first — never both, and never blocked by an ignored/overdue task. New endpoints (`GET /api/widget/task`, `POST /api/widget/task/{update,recurrence,next-date}`). The widget's task-detail popup is redesigned: editable title/description (Edit → Cancel/Save), a linkified description (tappable URLs and phone numbers), and independently-tappable date/recurrence/next-date chips with a recurrence-editing dialog. Trello and Google Tasks cards are unaffected — same title + Complete button as before. Deployed both the Go server and `doot-widget.apk`.
- **Widget regressions + multi-day calendar events** — fixed popup-shows-behind-settings (missing `taskAffinity` on popup activities caused `FLAG_ACTIVITY_NEW_TASK` to reuse SettingsActivity's task), floored header text at NORMAL scale even when the Small text-size setting is selected, fixed settings-screen label colors, and replaced the event-detail popup with a direct tap-to-open-source link (removed `EventDetailActivity` and its now-dead recurrence-lookup endpoint). Separately, fixed multi-day calendar events: they previously either only rendered in a single hourly grid slot on their start day (vanishing on later days) or, for genuine all-day events, never had their end date forwarded at all. Now render as an all-day-style row on every day they span (web Today/Tomorrow sections + widget), labeled "starts/ends HH:MM" or plain, correctly accounting for Google Calendar's exclusive all-day end-date convention (caught and fixed during review — a single-day all-day event's raw end date is one calendar day past its own day). Deployed both the Go server and `doot-widget.apk`.
- **Widget tomorrow-section fix + configurable text size** — fixed `calcGridStart`/`calcGridEnd` (`DootWidget.kt`) skewing today's hour-grid bounds off tomorrow's event hours, which manufactured empty rows and pushed the non-scrolling TOMORROW section below the widget's visible area; added `WidgetTextSize` enum (Small/Normal/Large, independent header/content scale+weight, default Normal) wired through widget rendering and a new picker in widget Settings. Deployed to `doot-widget.apk`.
- **Google Tasks Unification & Multi-List Support** — implemented SQLite caching layer for Google Tasks, integrated with unified `Atoms` loop (now showing in Tasks tab), updated Planning tab to include Google Tasks, and enhanced Quick Add form with Todoist project selector. Fixed issue where only the default list was shown; now respects all enabled task lists and calendars from settings.
- **Agent Context API Phase 2 & 3** — Write operations (complete, uncomplete, update due, update task), create operations (task, shopping), and management UI in settings. Fixed SQLite timestamp scanning issue.
- **Sync log + clear cache feedback** — migration `016_sync_log.sql`, store methods `AddSyncLogEntry`/`GetRecentSyncLog`, handler changes, template partial `sync-log.html`
- `HandleClearCache` now renders sync log HTML (replaces `hx-swap="none"`)
- `HandleSyncSources` adds log entry after sync
- `HandleSettingsPage` passes `SyncLog []store.SyncLogEntry` to template
- Tests: `TestStore_AddAndGetSyncLog`, `TestStore_GetRecentSyncLog_LimitsResults`, `TestHandleClearCache_AddsLogEntry`, `TestHandleClearCache_ReturnsHTMLSyncLog`, `TestHandleSettingsPage_IncludesSyncLog`, `TestHandleSyncSources_AddsLogEntry`
- **Bug 1: Todoist incremental sync** — added 5 tests exercising the incremental merge path (upsert, delete completed/deleted, sync token storage/reuse, forceRefresh). Code was already correct, just untested.
- Tests: `TestFetchTasks_IncrementalSync_UpsertsActiveTasks`, `TestFetchTasks_IncrementalSync_DeletesCompletedAndDeletedTasks`, `TestFetchTasks_IncrementalSync_StoresNewSyncToken`, `TestFetchTasks_IncrementalSync_UsesSavedSyncToken`, `TestFetchTasks_ForceRefresh_ClearsSyncToken`
- **Bug 2: Task completion response/headers** — added assertions for response body (`rendered:completed-atom`), Content-Type header, HX-Reswap/HX-Trigger headers, template data verification. Code was correct, assertions were missing.
- Tests updated: `TestHandleCompleteAtom_Todoist`, `TestHandleUncompleteAtom_Todoist`
- New test: `TestHandleCompleteAtom_RendersCorrectTemplateData`
- **Bug 3: Google Calendar cache layer** — calendar events now cached via `CacheFetcher` pattern, surviving API outages.
- New migration: `migrations/015_calendar_events.sql`
- New store methods: `SaveCalendarEvents`, `GetCalendarEvents`, `GetCalendarEventsByDateRange`
- New cache key: `store.CacheKeyGoogleCalendar`
- New handler method: `fetchCalendarEvents` (uses `CacheFetcher` with stale-cache fallback)
- `BuildTimeline` now reads events from store (removed `calendarClient` param)
- Tests: `TestBuildTimeline_ReadsCalendarEventsFromStore`, `TestFetchCalendarEvents_CacheFallbackOnAPIError`, `TestSaveAndGetCalendarEvents`
- All tests pass (`go test ./...`)
## Previously Completed
- Extracted project-agnostic dev methodology to `~/.claude/CLAUDE.md`
- Created `~/.claude/roles/` with architect.md, implementor.md, reviewer.md
- Slimmed task-dashboard `CLAUDE.md` (87→72 lines, references global for methodology)
- Trimmed `DESIGN.md` (removed Development Workflow, Git Practices, TDD methodology, ADR methodology, Config Reference duplication)
- Deleted `ARCHITECT_ROLE.md`, `IMPLEMENTOR_ROLE.md`, `REVIEWER_ROLE.md` from repo
## Previously Completed
- Build version footer with ldflags injection (`deploy.sh`, `index.html`)
- `assertTemplateContains` test helper, refactored existing template tests
- `scripts/logs` for fetching production journalctl
- Fix passkey registration: hide UI when WebAuthn not configured (WebAuthnEnabled flag)
- Added no-cache header tests for #66
## Completed Bugs (All Verified)
- **#74**: Feature toggles — tests: `TestHandleToggleFeature`, `TestHandleCreateFeature`, `TestHandleDeleteFeature`; docs: DESIGN.md §4.3
- **#56**: Box contents overflow — CSS-only fix, documented in DESIGN.md
- **#65**: Google Tasks — timeline tests cover integration; API client lacks dedicated unit tests
- **#66**: No-cache headers — tests: `TestHTMLResponse_SetsNoCacheHeaders`, `TestJSONResponse_SetsNoCacheHeaders`
- **#67**: Z-index — CSS-only fix, documented in DESIGN.md §z-index hierarchy
- **#68**: Track completion — tests: `TestHandleCompleteAtom_Todoist`, `TestHandleCompleteAtom_Trello`
- **#69**: Timeline calendar — tests: `TestCalcCalendarBounds`, `TestBuildTimeline_IncludesOverdueItems`; docs: DESIGN.md §Timeline View
- **#70**: Clear inputs — tests: `TestShoppingQuickAdd_Success`; docs: DESIGN.md §Quick Add UX
- **#71**: Shopping checkmarks — tests: `TestShoppingModeItemsTemplateFiltersChecked`
- **#72**: Inline add per store — tests: `TestShoppingQuickAdd_ShoppingModeReturnsStoreItems`
- **#73**: Store grouping — partial tests, partial docs
## Agent Context API
- Status: [COMPLETED] Phase 1, 2, & 3
- Tests: `internal/handlers/agent_test.go` (comprehensive)
- Docs: ADR-005, DESIGN.md §Agent Context API
- Write operations, Creation, and Management UI all implemented and verified.
## Known Gaps
- Google Tasks API client lacks dedicated unit tests (integration tested via timeline)
- WebAuthn passkeys require `WEBAUTHN_RP_ID` and `WEBAUTHN_ORIGIN` env vars in production
## Remaining Items (Feature Requests)
- #33-38: Shopping/timeline features
## Next Steps
1. Set `WEBAUTHN_RP_ID` and `WEBAUTHN_ORIGIN` in production to enable passkeys
## Process Improvements
- Extracted dev workflow to `~/.claude/CLAUDE.md` — reusable across projects
- Role definitions now in `~/.claude/roles/` — project-agnostic
- CLAUDE.md reduced from 87 to 72 lines — faster to parse
- DESIGN.md trimmed ~200 lines of duplicated methodology
|