| Age | Commit message (Collapse) | Author |
|
- Add feature_toggles table (migration 012)
- Add source_config table for future source selection (migration 013)
- Create settings page at /settings with:
- Feature toggle management (enable/disable/create/delete)
- Data source configuration (sync and toggle boards/calendars)
- Add store methods for feature toggles and source config
- Add GetCalendarList and GetTaskLists to Google API clients
- Document feature toggle workflow in DESIGN.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add completed_tasks table to log task completions with title, due date,
and completion timestamp
- Extend agent context date range: 7 days back to 14 days forward
- Add completed_log to API response (last 50 completed tasks)
- Add day_section field to timeline items (overdue/today/tomorrow/later)
- Add calendar-style view for today's schedule (6am-10pm hourly grid)
- Add tabbed interface for Timeline vs Completed Log in HTML view
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Phase 1: Authentication and read-only context
- POST /agent/auth/request - request access with name + agent_id
- GET /agent/auth/poll - poll for approval status
- POST /agent/auth/approve|deny - user approval (browser auth required)
- GET /agent/context - 7-day timeline context (agent session required)
Phase 1.5: Browser-only agent endpoints (HTML pages)
- GET /agent/web/request - request page with token
- GET /agent/web/status - status page with polling
- GET /agent/web/context - context page with timeline data
WebSocket notifications:
- GET /ws/notifications - push agent requests to browsers
- Approval modal with trust indicators and countdown timer
Database:
- agents table for registered agent tracking
- agent_sessions table for pending/active sessions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Reuse BuildTimeline() from timeline_logic.go instead of duplicating
fetch logic (~60 lines removed)
- Add section headers for code organization
- Extract isSessionExpired() and renderAgentTemplate() helpers
- Move AgentRequestPayload from websocket.go to agent.go
- Use config.Now() and config.Today() for consistent timezone handling
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Allow external resources in Content-Security-Policy:
- frame-src: youtube.com, embed.windy.com (for webcams/weather)
- style-src: fonts.googleapis.com (for Inter font)
- font-src: fonts.gstatic.com (for font files)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Document clean history principles:
- Never amend, rebase, or force push
- Use merge to integrate changes
- Keep commits focused and atomic
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
|
|
Bug fixes:
- #62: Increase FAB button z-index from z-40 to z-50
- #63: Combine multiple meals per date+mealType in Meals tab
- #64: Make /conditions route public (no auth required)
Changes:
- FAB button now z-50 (same as modals, appears on top when scrolling)
- Meals tab groups meals by date+mealType, joins recipe names with " + "
- Conditions page moved outside protected routes group
DESIGN.md updates:
- Updated z-index hierarchy table
- Added Meals View section
- Noted conditions page is public
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Convert Today section from static div to collapsible details element
- Add item count to Today header for consistency
- Expand both Today and Tomorrow sections by default
- Later section remains collapsed
- Update DESIGN.md with new timeline organization
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Convert Today section from static div to collapsible details element
- Add item count to Today header for consistency
- Expand both Today and Tomorrow sections by default
- Later section remains collapsed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add z-40 to FAB button so it floats above scrolling content
- Increase details dropdown from z-20 to z-30
Z-index hierarchy:
- Content: default
- Sticky headers: z-10
- Details dropdown: z-30
- FAB button: z-40
- Modals: z-50
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Document the expected development workflow including:
- Bug tracking with scripts/bugs and scripts/resolve-bug
- Test-driven development requirements and patterns
- When to update DESIGN.md vs create Architecture Decision Records
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
The template was being called with define name "shopping-mode" but
standalone page templates should be called by filename "shopping-mode.html".
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- New GoogleTasksClient for fetching and managing Google Tasks
- Tasks appear in Timeline view with yellow indicator dot
- Tap checkbox to complete/uncomplete tasks via Google API
- Shares credentials file with Google Calendar (GOOGLE_CREDENTIALS_FILE)
- Configure task list via GOOGLE_TASKS_LIST_ID env var (default: @default)
- Supports comma-separated list IDs for multiple lists
New files:
- internal/api/google_tasks.go - Google Tasks API client
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Full-screen view for one store at a time
- Tap items to toggle completion
- Completed items greyed and sorted to bottom
- Quick-add form at bottom of screen
- Store switcher pills for easy navigation
- "Shop" button on each store in shopping tab
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- #54: Fix shopping item completion - now works for all sources
(trello, plantoeat, user) with state stored in local DB
- #48: Hide 12:00am times in timeline (all-day items)
- #49: Remove "Task" type label from timeline items for cleaner UI
- #51: Combine multiple PlanToEat meals for same date+mealType
- #52: Change Conditions tab to standard link to standalone page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Section headings now show the day of week for better orientation:
- "Today - Monday"
- "Tomorrow - Tuesday"
- "Wednesday, Jan 29+" (for later items)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add config/timezone.go with timezone utilities:
- SetDisplayTimezone(), GetDisplayTimezone()
- Now(), Today() - current time/date in display TZ
- ParseDateInDisplayTZ(), ToDisplayTZ() - parsing helpers
- Initialize timezone at startup in main.go
- Update all datetime logic to use configured timezone:
- handlers/handlers.go - all time.Now() calls
- handlers/timeline.go - date parsing
- handlers/timeline_logic.go - now calculation
- models/atom.go - ComputeUIFields()
- models/timeline.go - ComputeDaySection()
- api/plantoeat.go - meal date parsing
- api/todoist.go - due date parsing
- api/trello.go - due date parsing
This ensures all dates/times display correctly regardless
of server timezone setting.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add TIMEZONE config option (defaults to Pacific/Honolulu)
- Store display timezone in GoogleCalendarClient
- Convert all event times to configured display timezone
- Parse events in their native timezone then convert for display
This fixes the issue where events were showing 10 hours off
due to server running in UTC while user is in Hawaii.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Use event's TimeZone field when parsing DateTime
- Handle cases where DateTime has no timezone offset
- Parse in event timezone then convert to local for display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Use option.WithCredentialsFile instead of non-existent
option.WithAuthCredentialsFile function.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Create atoms.go with BuildUnifiedAtomList, SortAtomsByUrgency, PartitionAtomsByTime
- Create helpers.go with parseFormOr400, requireFormValue
- Refactor HandleTabTasks from 95 lines to 25 lines using extracted functions
- Remove duplicate atomUrgencyTier function
- Update handlers to use parseFormOr400 helper
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Create config/constants.go with centralized configuration values:
- Concurrency limits (MaxConcurrentTrelloRequests)
- Timeouts (HTTP, Google Calendar, graceful shutdown, request)
- Meal times (breakfast, lunch, dinner hours)
- Database pool settings (connections, lifetime)
- Session and rate limiting settings
Update all files to use these constants instead of hardcoded values.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Handle JSON marshal errors in sqlite.go (log + fallback to empty array)
- Add 30s timeout to Google Calendar client initialization
- Fix CSRF timing attack by using subtle.ConstantTimeCompare
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Add mutex synchronization for writes to board slice elements
(Cards and Lists fields) from concurrent goroutines.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Remove default password fallback - require DEFAULT_PASS in all environments
- Fix XSS vulnerabilities in HTML generation (handlers.go:795,920)
- Add security headers middleware (X-Frame-Options, CSP, HSTS, etc.)
- Add rate limiting on login endpoint (5 req/15min per IP)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Fix errcheck: handle all error return values in production code
- Fix errcheck: handle all error return values in test files
- Fix staticcheck: replace deprecated WithCredentialsFile with WithAuthCredentialsFile
- Remove unused code: authHeaders, planToEatPlannerItem, planToEatResponse
- Use defer func() { _ = x.Close() }() pattern for ignored close errors
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Extract parseEventTime() and deduplicateEvents() in google_calendar.go
- Add scanTask() and scanTasks() SQL helpers in sqlite.go
- Move completed-atom HTML to partial template
- Add loadTestTemplates() test helper for template-dependent tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Use solid dark background (black/90) instead of transparent panel
- Add border and shadow for better visibility
- Replace tab-button class with explicit styling for dropdown items
- Improve hover states for menu items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
#40, #41: Fix calendar event timezone handling
- Parse all-day events in local timezone using ParseInLocation
- Convert timed events to local time after parsing RFC3339
- Update ComputeDaySection to normalize both now and item time to local
before comparison, ensuring consistent today/tomorrow classification
#42: Mobile conditions page now uses 2 columns
- Changed 600px breakpoint from 1 column to 2 columns
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- #44: Replace oversized SVG arrow with simple ▾ character for Details dropdown
- #45: Change Conditions from external link to normal tab button (fixes back button)
- #46: Use dark medium-opacity background (black/50%) for atoms instead of white/5%
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Phase 1: Bugs as First-Class Atoms (#28)
- Add resolved_at column to bugs table (migration 007)
- Add GetUnresolvedBugs(), ResolveBug(), UnresolveBug() store methods
- Include bugs in Tasks tab via BugToAtom() with completion toggle
- Add unit tests for bug resolution
Phase 2: Timeline as Default + Enhancements (#35, #37)
- Change default tab from tasks to timeline
- Add IsCompleted, DaySection, Source fields to TimelineItem
- Group timeline items by today/tomorrow/later sections
- Add completion checkboxes for tasks/cards, grey completed items
- Collapse tomorrow/later sections by default
Phase 3: Shopping Quick-Add (#33)
- Add user_shopping_items table (migration 008)
- Add SaveUserShoppingItem(), GetUserShoppingItems(), ToggleUserShoppingItem()
- Add HandleShoppingQuickAdd() and HandleShoppingToggle() handlers
- Add quick-add form to shopping tab
Phase 4: Mobile Swipe Navigation (#38)
- Add touch event handlers for swipe left/right tab switching
- 50px threshold triggers tab change
Phase 5: Consistent Background Opacity (#30)
- Add CSS variables for panel/card/input/modal backgrounds
- Update templates to use consistent opacity classes
Phase 6: Tab Reorganization (#37)
- Reorganize tabs: Timeline, Shopping, Conditions as main tabs
- Move Tasks, Planning, Meals under Details dropdown
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Bug fixes:
- #36: Hide recurring tasks until due day (add IsRecurring to Task/Atom)
- Trello cards missing: change filter=visible to filter=open
- Build fix: add missing fmt import in atom.go
Infrastructure:
- Add scripts/bugs and scripts/resolve-bug for DB bug tracking
- Remove issues/ directory (bugs now tracked in DB)
- Add timeline_logic_test.go
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add V3cam (South Rim) alongside V1cam (West) and V2cam (East)
- Add two Hawaii maps: wind overlay and waves overlay
- Zoom out US map for broader national view
- Full-screen 3x2 grid layout with responsive breakpoints
- Enable YouTube controls for better video interaction
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Standalone full-screen page at /conditions
- Tiled grid layout with autoplaying video feeds
- USGS Kilauea webcams (V1cam, V2cam) via YouTube embeds
- Windy weather maps (local Hawaii + national US)
- Opens in new tab from dashboard nav
Closes #29
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Bug fixes:
- #25: Replace 📅 with 🗓️ to avoid misleading date display
- #30: Standardize background opacity (shopping items now use bg-white/5)
New feature:
- #11: Add Timeline view showing chronological events/tasks/meals
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- New Shopping tab aggregates items from Trello Shopping board and PlanToEat
- Items grouped by store, then by category (for PlanToEat)
- Trello list names treated as store names
- Replace PlanToEat meals API with web scraping (uses session cookie)
- Add error logging for PlanToEat fetch operations
- Recipe links now point to cooking view (/recipes/{id}/cook/{event_id})
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
The uncomplete response was returning an empty body, causing HTMX to
swap the element with nothing before the refresh-tasks trigger fired.
Added HX-Reswap: none header to preserve the element while the refresh
event propagates.
Also fixed TestGetCardsByDateRange test data to include all required
columns (list_id, list_name, url).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add BaseClient HTTP abstraction (internal/api/http.go) to eliminate
duplicated HTTP boilerplate across Todoist, Trello, and PlanToEat clients
- Add response helpers (internal/handlers/response.go) for JSON/HTML responses
- Add generic cache wrapper (internal/handlers/cache.go) using Go generics
- Consolidate HandleCompleteAtom/HandleUncompleteAtom into handleAtomToggle
- Merge TabsHandler into Handler, delete tabs.go
- Extract sortTasksByUrgency and filterAndSortTrelloTasks helpers
- Update tests to work with new BaseClient structure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Events copied across calendars may have different timezone representations
in their RFC3339 strings. Using Unix timestamps ensures the same moment
in time produces the same dedup key.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Bug fixes:
- #24: Deduplicate calendar events across multiple calendars using
summary + start time as key
- #25: Change event icon from calendar to clock to avoid confusion
with date display
- #26: Add task uncomplete functionality via ReopenTask API for
Todoist and closed=false for Trello
- #27: Restructure planning view with sections for Scheduled (timed
events/tasks), Today (unscheduled), Quick Add, and Upcoming (3 days)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Default password: Fatal error in production if DEFAULT_PASS not set
- API timeouts: Reduce from 30s to 15s (4 APIs × 15s < 60s global)
- Trello lists: Log warning when list fetch fails instead of silent ignore
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- DB connection pool: Allow 5 connections instead of 1 for better concurrency
- JSON unmarshal: Add error handling to prevent nil slice issues
- Context cancellation: Check ctx.Done() in aggregateData goroutines
- Migration path: Make configurable via MIGRATION_DIR env var
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Prefill first store in shopping quick-add
- Tone down overdue/priority styling (red -> amber)
- Remove quick-add panel from tasks tab (use modal instead)
- Increase card opacity for better readability
- Swap task/event formatting (tasks get cards, events get border-l-4)
- Add grid layout for tasks (2-3 columns on wider screens)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add Shopping tab to action modal (Ctrl+K)
- Add /partials/shopping-lists endpoint to fetch lists from Shopping board
- Store dropdown populated dynamically from Trello
- Items added via existing unified-add endpoint
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
The boardMap was storing pointers to Board structs in the boards slice.
When the slice grew and reallocated, those pointers became stale, causing
cards to be added to old memory locations instead of the current slice.
Fixed by storing indices instead of pointers in boardMap.
Added tests to verify multiple boards with varying card counts are
correctly saved and retrieved.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
|
|
|
|
|
|
Log API responses and errors to diagnose empty boards issue.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|