<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/internal/api, branch main</title>
<subtitle>doot — personal productivity web app
</subtitle>
<id>https://git.terst.org/doot.git/atom?h=main</id>
<link rel='self' href='https://git.terst.org/doot.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/'/>
<updated>2026-03-25T05:17:35+00:00</updated>
<entry>
<title>feat: add Claudomator stories as atom source in Doot tasks tab</title>
<updated>2026-03-25T05:17:35+00:00</updated>
<author>
<name>Claude Agent</name>
<email>agent@doot.local</email>
</author>
<published>2026-03-25T05:17:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=b58787cfec0bd07abc316c66dc9be6c10b8113c6'/>
<id>urn:sha1:b58787cfec0bd07abc316c66dc9be6c10b8113c6</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: support multiple enabled Google Task lists and Calendars</title>
<updated>2026-03-23T08:59:35+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-23T08:59:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=23c670442392af1c75b935b3296ae2fc4fd094ba'/>
<id>urn:sha1:23c670442392af1c75b935b3296ae2fc4fd094ba</id>
<content type='text'>
- Update Google API interfaces with setters for list/calendar IDs
- Update fetchCalendarEvents and fetchGoogleTasks to use enabled IDs from source_configs
- Update timeline logic tests to reflect interface changes and seed config data
- Ensure dashboard respects user-selected lists from settings
</content>
</entry>
<entry>
<title>fix: parse Todoist local datetimes, show near-future tasks, add undated tasks to timeline</title>
<updated>2026-03-23T00:42:44+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-23T00:42:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=6c767194d9470b368f8d337e0719795f235f683c'/>
<id>urn:sha1:6c767194d9470b368f8d337e0719795f235f683c</id>
<content type='text'>
- parseDueDate: handle date field containing "YYYY-MM-DDTHH:MM:SS" (local time,
  no tz offset) — Todoist REST API v1 uses this format for recurring tasks with
  a set time, causing due dates to silently parse as nil
- IsFuture threshold: widen from tomorrow to 7 days out so tasks due this week
  show in the main tasks section with dates visible (not collapsed)
- BuildTimeline: include undated Todoist tasks in the Today section (mirrors
  existing Google Tasks behavior)
- GetUndatedTasks: new store method for tasks with due_date IS NULL

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>chore: unify and centralize agent configuration in .agent/</title>
<updated>2026-03-22T23:45:19+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-22T23:45:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=8abc63efdbc0bb96cd6c9aa99d6e9166e0bcabae'/>
<id>urn:sha1:8abc63efdbc0bb96cd6c9aa99d6e9166e0bcabae</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: Phase 1 — remove bug feature and dead code</title>
<updated>2026-03-21T21:24:02+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-21T21:24:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=764d4d2d07449aec72c87afe941b7c63ea05e08c'/>
<id>urn:sha1:764d4d2d07449aec72c87afe941b7c63ea05e08c</id>
<content type='text'>
- Delete Bug struct, BugToAtom, SourceBug, TypeBug, TypeNote
- Remove bug store methods (SaveBug, GetBugs, ResolveBug, etc.)
- Remove HandleGetBugs, HandleReportBug, bug branches in handlers
- Remove bug routes, bugs.html template, bug UI from index.html
- Remove AddMealToPlanner stub + interface method
- Migration 018: DROP TABLE IF EXISTS bugs

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test: add coverage for planning tab, meals, Google Tasks, bug handlers, completed task parsing</title>
<updated>2026-03-19T00:11:16+00:00</updated>
<author>
<name>Agent</name>
<email>agent@workspace.local</email>
</author>
<published>2026-03-18T10:15:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=5723d6635f9462e60960b0f9548273d95a86d8f3'/>
<id>urn:sha1:5723d6635f9462e60960b0f9548273d95a86d8f3</id>
<content type='text'>
- HandleTabPlanning: happy-path test verifying tasks/cards land in correct
  sections (scheduled/unscheduled/upcoming); boundary test confirming a task
  due exactly at midnight of tomorrow lands in Upcoming, not Scheduled
- HandleTabMeals: grouping test verifying two meals sharing date+mealType
  produce one CombinedMeal with both recipe names merged
- Google Tasks GetTasksByDateRange: four boundary tests (start inclusive, end
  exclusive, no-due-date always included, out-of-range excluded) using
  redirectingTransport mock server pattern
- HandleGetBugs: data assertions verifying bug list and empty-list cases
- HandleReportBug: success test verifying bug is saved and bugs template
  is re-rendered
- GetCompletedTasks: timestamp parsing test ensuring CompletedAt is not zero
  when inserted with a known "2006-01-02 15:04:05" string

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>refactor: RF-03/06 extract groupMeals helper, eliminate convertSyncItemToTask wrapper</title>
<updated>2026-03-18T10:04:57+00:00</updated>
<author>
<name>Claude</name>
<email>agent@claude.ai</email>
</author>
<published>2026-03-18T10:04:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=e85b42d373de55781af9d699b246c0d6a492aec1'/>
<id>urn:sha1:e85b42d373de55781af9d699b246c0d6a492aec1</id>
<content type='text'>
RF-03: Extract shared groupMeals helper into internal/handlers/meals.go.
Both HandleTabMeals and BuildTimeline now call groupMeals instead of
duplicating the date+mealType grouping algorithm inline. CombinedMeal
gains ID and Meals fields to carry the first-meal ID and original records
needed by BuildTimeline when constructing TimelineItems.

RF-06: Add api.ConvertSyncItemToTask for single-item conversion.
ConvertSyncItemsToTasks now delegates to it, eliminating duplication.
The Handler.convertSyncItemToTask wrapper (which allocated a one-element
slice just to unwrap it) is deleted; its caller uses api.ConvertSyncItemToTask
directly. Covered by TestConvertSyncItemToTask in internal/api/todoist_test.go.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test: add Google Calendar unit tests for pure functions</title>
<updated>2026-03-17T20:03:54+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-03-17T20:03:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=e72305237e16a8c32fb017261cce129a25d70e65'/>
<id>urn:sha1:e72305237e16a8c32fb017261cce129a25d70e65</id>
<content type='text'>
11 tests covering deduplicateEvents (dedup key, ordering, empty input),
parseEventTime (RFC3339, date-only, empty, no-timezone), and
GetUpcomingEvents (normal, empty, API error fallback) via httptest mock.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: migrate Todoist client from deprecated REST v2 to API v1</title>
<updated>2026-03-04T21:20:05+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-04T21:20:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=2be0b6a90cd83c8052ee13a172217e4a355c7df7'/>
<id>urn:sha1:2be0b6a90cd83c8052ee13a172217e4a355c7df7</id>
<content type='text'>
REST v2 (https://api.todoist.com/rest/v2) is being sunset — the /close
endpoint was returning HTTP 410 in production, breaking task completion.

Update base URL to https://api.todoist.com/api/v1; endpoint paths are
unchanged (/tasks/{id}/close, /tasks/{id}/reopen, etc.).

Test: TestTodoistClient_UsesAPIv1BaseURL asserts the correct base URL.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: sync log, cache clear endpoint, Todoist projects from cached tasks</title>
<updated>2026-03-04T21:12:44+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-04T21:12:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=0fd54eddc40f517cf491310d4f8a60b0d79dc937'/>
<id>urn:sha1:0fd54eddc40f517cf491310d4f8a60b0d79dc937</id>
<content type='text'>
- migration 016: sync_log table
- store: AddSyncLogEntry, GetRecentSyncLog, InvalidateAllCaches, GetProjectsFromTasks
- settings: HandleClearCache (POST /settings/clear-cache), SyncLog in page data
- settings: use GetProjectsFromTasks instead of deprecated Todoist REST /projects
- handlers: populate atom projects from store
- agent: log warning on registration failure instead of silently swallowing
- google_tasks: simplify URL literal
- tests: sync log CRUD, clear cache handler, settings page includes sync log,
  sync sources adds log entry, incremental sync paths, task completion
  response/headers, calendar cache fallback

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
