| Age | Commit message (Collapse) | Author |
|
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>
|
|
Root cause: WEBAUTHN_RP_ID and WEBAUTHN_ORIGIN env vars not set in
production, so WebAuthn is nil and all passkey endpoints return 404.
The settings page was unconditionally showing the passkey registration
card, leading to confusing "Failed to start registration" errors.
Fix: Pass WebAuthnEnabled flag from main.go through Handler to the
settings template, which now conditionally renders the passkey card
only when WebAuthn is properly configured.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|