| Age | Commit message (Collapse) | Author |
|
- 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 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>
|
|
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>
|
|
- 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>
|
|
#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>
|
|
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>
|
|
- 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>
|
|
- 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>
|
|
Log API responses and errors to diagnose empty boards issue.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
GOOGLE_CALENDAR_ID now accepts comma-separated calendar IDs:
GOOGLE_CALENDAR_ID=cal1@group.calendar.google.com,cal2@gmail.com
Events from all calendars are merged and sorted by start time.
If one calendar fails to fetch, others still load.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add GoogleCalendarClient for fetching upcoming events
- Add GoogleCalendarAPI interface and CalendarEvent model
- Add config for GOOGLE_CREDENTIALS_FILE and GOOGLE_CALENDAR_ID
- Display events in Planning tab with date/time formatting
- Update handlers and tests to support optional calendar client
Config env vars:
- GOOGLE_CREDENTIALS_FILE: Path to service account JSON
- GOOGLE_CALENDAR_ID: Calendar ID (defaults to "primary")
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Fix outdated Todoist task URL format (showTask -> app/task)
- Fix quick-add date defaulting to tomorrow in evening (client-side JS)
- Add tap-to-expand for task descriptions with checkbox completion
- Add visual differentiation: overdue (red), future (gray), today (normal)
- Sort tasks by urgency: overdue > today-timed > today-allday > future
- Keep completed tasks visible with strikethrough until refresh
- Add random Unsplash landscape background with content overlay
- Hide future tasks behind collapsible fold with count badge
- Unified modal menu for Quick Add + Bug Report (Ctrl+K shortcut)
- Click task title to edit description in modal
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Include tests exploring Todoist Sync API and Trello field
filtering for efficient incremental data fetching.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Obsidian relied on local filesystem access which is incompatible with
public server deployment. This removes all Obsidian-related code including:
- API client and interface
- Store layer methods (SaveNotes, GetNotes, SearchNotes)
- Handler methods and routes
- UI tab and templates
- Configuration fields
- Related tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
- Add Todoist Sync API v9 support with incremental sync tokens
- Store sync tokens in SQLite for persistence across restarts
- Add field filtering to Trello API calls to reduce payload size
- Update handlers to use incremental sync (merge changes vs full replace)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Replace manual string concatenation with url.Values for cleaner,
safer query parameter construction in GetBoards, GetCards, and getLists.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Closed boards were appearing because:
1. API fetched all boards including closed ones
2. Cache used upsert logic that never removed old data
Fixes:
- Add filter=open to GetBoards API call
- Add filter=visible to GetCards API call
- Clear boards/cards tables before inserting fresh data in SaveBoards
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Add filtering logic to show Trello cards as actionable tasks when they
have due dates OR are in lists named like "todo", "doing", "in progress",
"tasks", "next", or "today". This makes the Tasks tab more useful by
surfacing cards that represent work items even without explicit due dates.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Add CreateTask and CompleteTask methods to Todoist API client:
Models:
- Add Project struct (ID, Name) to types.go
- Add Projects []Project field to DashboardData
API Interface:
- Change GetProjects signature to return []models.Project
- Ensure CreateTask and CompleteTask are defined
Todoist Client:
- Add baseURL field for testability
- Refactor GetProjects to return []models.Project
- Update GetTasks to build project map from new GetProjects
- Implement CreateTask with JSON payload support
- Implement CompleteTask using POST to /tasks/{id}/close
Tests:
- Create comprehensive todoist_test.go
- Test CreateTask, CreateTask with due date, CompleteTask
- Test error handling and GetProjects
- Update mock client in handlers tests
All tests pass. Ready for handlers and UI integration.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Expose Trello Lists in Board model to enable card creation UI:
- Add List model struct (ID, Name) to types.go
- Add Lists []List field to Board model
- Add GetLists method to TrelloAPI interface
- Refactor private getLists to return []models.List
- Update GetCards to build list map from slice
- Add public GetLists method wrapping private implementation
- Update GetBoardsWithCards to populate Lists field concurrently
- Update mock Trello client in tests to implement GetLists
All tests pass. Boards now include their lists for UI rendering.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add CreateCard and UpdateCard methods to Trello API client with
full testability support:
- Refactor TrelloClient with configurable baseURL for testing
- Replace hardcoded trelloBaseURL constant with c.baseURL
- Implement CreateCard with support for description and due date
- Implement UpdateCard with flexible field updates
- Add comprehensive test suite using httptest.NewServer
- Tests cover success cases, error handling, and edge cases
All tests pass. Write operations ready for Phase 3 UI integration.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Update GetBoards SQL query with LEFT JOIN and GROUP BY
- Sort by: 1) Has cards, 2) Newest card (MAX ID), 3) Board name
- Update GetBoardsWithCards to match SQL sorting behavior
- Leverage Trello ID chronological sortability (newer > older)
- Active boards with recent activity appear first
- All tests passing
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Improves UX by prioritizing boards with cards over empty boards.
Both API and cached results now sort consistently: non-empty boards
appear first, then empty boards, with alphabetical ordering within
each group.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Created comprehensive test coverage for security fixes:
- internal/api/obsidian_test.go:
* TestGetNotes_SymlinkSecurity: Verifies symlinks are not followed
* TestGetNotes_BasicFunctionality: Tests basic limit and ordering
* Uses t.TempDir() for isolated test environments
- internal/store/sqlite_test.go:
* TestGetNotes_LimitClause: Validates LIMIT parameter handling
* TestGetNotes_EmptyDatabase: Tests empty state
* TestSaveNotes_Upsert: Verifies INSERT OR REPLACE behavior
* TestGetNotes_SQLInjectionAttempt: Confirms parameterized queries
* All tests use temporary SQLite databases for isolation
All tests passing (7 new test cases). Security fixes from commits
325811c and 4c03e9c now have full test coverage.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Replaced sequential card fetching in GetBoardsWithCards with concurrent
goroutines limited by a semaphore (max 5 concurrent requests). This
significantly reduces load times for users with multiple boards.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Skip symbolic links during vault traversal to prevent reading files outside the configured vault directory. This prevents potential path traversal attacks via malicious symlinks.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Implemented a unified web dashboard aggregating tasks, notes, and meal planning:
Core Features:
- Trello integration (PRIMARY feature - boards, cards, lists)
- Todoist integration (tasks and projects)
- Obsidian integration (20 most recent notes)
- PlanToEat integration (optional - 7-day meal planning)
- Mobile-responsive web UI with auto-refresh (5 min)
- SQLite caching with 5-minute TTL
- AI agent endpoint with Bearer token authentication
Technical Implementation:
- Go 1.21+ backend with chi router
- Interface-based API client design for testability
- Parallel data fetching with goroutines
- Graceful degradation (partial data on API failures)
- .env file loading with godotenv
- Comprehensive test coverage (9/9 tests passing)
Bug Fixes:
- Fixed .env file not being loaded at startup
- Fixed nil pointer dereference with optional API clients (typed nil interface gotcha)
Documentation:
- START_HERE.md - Quick 5-minute setup guide
- QUICKSTART.md - Fast track setup
- SETUP_GUIDE.md - Detailed step-by-step instructions
- PROJECT_SUMMARY.md - Complete project overview
- CLAUDE.md - Guide for Claude Code instances
- AI_AGENT_ACCESS.md - AI agent design document
- AI_AGENT_SETUP.md - Claude.ai integration guide
- TRELLO_AUTH_UPDATE.md - New Power-Up auth process
Statistics:
- Binary: 17MB
- Code: 2,667 lines
- Tests: 5 unit + 4 acceptance tests (all passing)
- Dependencies: chi, sqlite3, godotenv
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|