| Age | Commit message (Collapse) | Author |
|
import in tests
|
|
SettingsActivity
|
|
|
|
|
|
|
|
|
|
|
|
Add widget API routes for Android widget integration. Routes use bearer token
authentication and are placed outside session-protected groups. GET
/api/widget returns today's timeline items; POST /api/widget/complete
completes Todoist tasks. Routes only register if WIDGET_TOKEN env var is set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Implements WidgetAuthMiddleware (static bearer token), TimelineItemToWidgetItem
(conversion helper), HandleWidgetGet (today's items as JSON), and
HandleWidgetComplete (proxies task completion to Todoist).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Add WidgetToken field to Config struct to store bearer token for /api/widget endpoint
- Load WidgetToken from WIDGET_TOKEN environment variable (optional)
- Create WidgetItem and WidgetResponse models for widget API responses
- Widget token authentication is optional; endpoint won't authenticate if token is empty
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Wires scout listing feed (SCOUT_URL env var) into the service gateway
loop. Set SCOUT_URL=http://127.0.0.1:8081 to expose it at /scout/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Stdlib Python status page on port 9090 referenced in the service gateway
commit but not included. Serves system info at / and a JSON health check
at /health.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Formalizes doot as an authenticated reverse proxy for arbitrary upstream
services. Any local HTTP service can now be registered behind doot's
existing auth + SSL layer with 3 lines of config.
- Rename NewClaudomatorProxy → NewServiceProxy (generic)
- Replace hard-coded claudomator proxy block with serviceMount slice loop
- Add PlaygroundURL config (PLAYGROUND_URL env var)
- Add playground/web/server.py: stdlib Python status page on port 9090
- Document pattern in .agent/design.md; update .env.example
To add a new service: set its URL env var, add a config field, append
one mount entry in main.go. Claudomator's GitHub webhook bypass is
expressed as webhookPaths on its mount.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Token-based CSRF is impractical for a reverse proxy whose UI doesn't
know Doot's session tokens, so state-changing requests to /claudomator/*
are now validated against the configured WebAuthn origin via Origin/Referer
header. WebSocket upgrades reject mismatched or missing Origin headers
before hijacking the connection. Both checks are no-ops when WebAuthnOrigin
is unset (local dev).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
V1cam and V2cam embed IDs updated to current live streams. Thumbnail
links now point to YouTube live pages instead of USGS static webcam pages.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Server seeds bg URL from a 5-minute time bucket so all open sessions
show the same image simultaneously. Client-side JS rotates in sync and
prefetches the next image on the same interval.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Captures: auth gating, WS proxy, visual unification, and the Seam 1
(HTMX partials) → Seam 2 (single binary) architectural migration path.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Apache's catch-all ProxyPass / uses plain HTTP — mod_proxy_wstunnel
only activates on explicit ws:// rules. Without this, the Upgrade
header was dropped for Claudomator WebSocket connections.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- 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
|
|
|
|
- Implement SQLite caching layer for Google Tasks
- Integrate Google Tasks into unified Atoms loop (showing in Tasks tab)
- Update Planning tab to include cached Google Tasks
- Enhance Quick Add form with Todoist project selector
- Remove orphaned HandleTasksTab/HandleRefreshTab methods
- Update tests to reflect new BuildTimeline signature and data structures
|
|
- Implement write operations (complete, uncomplete, update due date, update task)
- Implement create operations (create task, add shopping item)
- Add Trusted Agents management UI in Settings with revocation support
- Fix SQLite timestamp scanning bug for completed tasks
- Add comprehensive unit tests for all new agent endpoints
- Update worklog and feature documentation
|
|
Replace z-index:-1 overlay div (hidden behind body background) with a
CSS custom property --bg-url set inline on body, consumed by .bg-body
as a layered background-image with a dark gradient overlay.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
tasks to timeline
- 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 <noreply@anthropic.com>
|
|
|
|
|
|
Embeds the build version as a data attribute on #last-updated and
derives an HSL hue from the first 6 hex chars, matching the
claudomator logo color technique.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Script uses relative paths (npm, go build, rsync) so it must run from
the repo root regardless of the caller's working directory.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- 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 <noreply@anthropic.com>
|
|
RF-04: Already complete in codebase (handlers use HTMLResponse + partials).
RF-08: Migrate single-required-field handlers from Pattern A/B to Pattern C
(requireFormValue). Affected: HandleCompleteTask, HandleCompleteCard,
HandleReportBug, HandleCreateTask in handlers.go; HandleToggleFeature,
HandleCreateFeature in settings.go. Reduces 6-8 lines of boilerplate to 2.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
completed task parsing
- 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 <noreply@anthropic.com>
|
|
convertSyncItemToTask wrapper
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 <noreply@anthropic.com>
|
|
|
|
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 <noreply@anthropic.com>
|
|
implementation roadmap
|
|
Replace SSH-based deploy.sh with scripts/deploy that runs locally on the
server. Update scripts/bugs, scripts/logs, and scripts/resolve-bug to drop
SSH wrappers. Update CLAUDE.md and DESIGN.md to reflect new local workflow.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
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 <noreply@anthropic.com>
|
|
- 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 <noreply@anthropic.com>
|
|
Role prompts extracted to ~/.claude/roles/ (project-agnostic).
CLAUDE.md slimmed from 87→72 lines, references global methodology.
DESIGN.md trimmed ~200 lines of duplicated workflow content.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Google Calendar events now cached via CacheFetcher pattern with
stale-cache fallback on API errors (new migration 015, store methods,
fetchCalendarEvents handler, BuildTimeline reads from store)
- Todoist incremental sync path covered by 5 new tests
- Task completion tests assert response body, headers, and template data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Each role now has a structured post-task cycle: reflect on specific
questions, perform 1-3 concrete improvements (test helpers, scripts,
checklists, docs, role definitions), and record changes in SESSION_STATE.
Updated CLAUDE.md and DESIGN.md to reference the cycle in the
multi-agent workflow documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
- CLAUDE.md: fix data sources, add debugging/deploy sections, test checklist
- DESIGN.md: update directory tree, fix h.templates→h.renderer, add endpoints/env vars
- Role files: fix Go version to 1.24, update tool names to Edit/Read/Glob
- scripts/logs: fix CRLF line endings for WSL compatibility
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
- Added TestHTMLResponse_SetsNoCacheHeaders and TestJSONResponse_SetsNoCacheHeaders
- Rewrote SESSION_STATE.md with verified test coverage per completed item
- Documented known gaps (Google API client unit tests, WebAuthn env vars)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|