<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/internal/store/sqlite_test.go, branch master</title>
<subtitle>doot — personal productivity web app
</subtitle>
<id>https://git.terst.org/doot.git/atom?h=master</id>
<link rel='self' href='https://git.terst.org/doot.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/'/>
<updated>2026-07-06T00:00:59+00:00</updated>
<entry>
<title>feat: remove Todoist integration entirely</title>
<updated>2026-07-06T00:00:59+00:00</updated>
<author>
<name>Doot Agent</name>
<email>agent@doot.local</email>
</author>
<published>2026-07-06T00:00:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=945c34590677e161a711ccaff0e1077197b1b178'/>
<id>urn:sha1:945c34590677e161a711ccaff0e1077197b1b178</id>
<content type='text'>
Native tasks (native_tasks table) fully replace Todoist. All Todoist
API code, store functions, handlers, routes, templates, and tests have
been removed. Migration 021 drops the now-unused tasks cache table.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</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>Fix missing settings button, disappeared events, and tab refresh bug</title>
<updated>2026-02-07T00:53:47+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-02-07T00:53:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=27ee1a271248e9f1de8ecb981a6cabfa8e498b1b'/>
<id>urn:sha1:27ee1a271248e9f1de8ecb981a6cabfa8e498b1b</id>
<content type='text'>
- Add settings gear icon link to dashboard header
- Fix GetTasksByDateRange/GetCardsByDateRange to include overdue items
  (changed from BETWEEN to &lt;= end, filter completed tasks)
- Fix refresh replacing active tab with tasks tab by using
  htmx.trigger(body, 'refresh-tasks') instead of innerHTML+htmx.process
- Add refresh-tasks hx-trigger to meals, shopping, conditions tabs
- Add tests for overdue inclusion/exclusion, settings link, template data

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add comprehensive test coverage across packages</title>
<updated>2026-02-04T01:16:35+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-02-04T01:16:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=25a5b7ecf9ddd31da54e91f87988b77aea857571'/>
<id>urn:sha1:25a5b7ecf9ddd31da54e91f87988b77aea857571</id>
<content type='text'>
New test files:
- api/http_test.go: HTTP client and error handling tests
- config/config_test.go: Configuration loading and validation tests
- middleware/security_test.go: Security middleware tests
- models/atom_test.go: Atom model and conversion tests

Expanded test coverage:
- api/todoist_test.go: Todoist API client tests
- api/trello_test.go: Trello API client tests
- auth/auth_test.go: Authentication and CSRF tests
- handlers/timeline_logic_test.go: Timeline building logic tests
- store/sqlite_test.go: SQLite store operations tests

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix all static analysis errors (golangci-lint)</title>
<updated>2026-01-26T06:55:58+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-26T06:55:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=f5b997bfc4c77ef262726d14b30d387eb7acd1c6'/>
<id>urn:sha1:f5b997bfc4c77ef262726d14b30d387eb7acd1c6</id>
<content type='text'>
- 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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Implement architectural refactors for feature requests #28, #30, #31, #33-38</title>
<updated>2026-01-26T03:09:41+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-26T03:05:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=dedda31d064ddcb4f857f2db851c5a8c1e19deba'/>
<id>urn:sha1:dedda31d064ddcb4f857f2db851c5a8c1e19deba</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix uncomplete: add HX-Reswap header to prevent empty swap</title>
<updated>2026-01-24T07:42:51+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-24T07:42:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=b69d2d5fc8779f43b1ac789605318488efc91361'/>
<id>urn:sha1:b69d2d5fc8779f43b1ac789605318488efc91361</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Refactor: reduce code duplication with shared abstractions</title>
<updated>2026-01-24T07:37:18+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-24T07:37:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=465093343ddd398ce5f6377fc9c472d8251c618b'/>
<id>urn:sha1:465093343ddd398ce5f6377fc9c472d8251c618b</id>
<content type='text'>
- 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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix slice reallocation bug in GetBoards</title>
<updated>2026-01-23T06:49:06+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-23T06:49:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=bedcd8a185e4197d087b2166afa79ff4dce25f7c'/>
<id>urn:sha1:bedcd8a185e4197d087b2166afa79ff4dce25f7c</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
