Commit Graph
63 Commits
Author SHA1 Message Date
Hermes 4c3c3249d4 fix(p2): Calendar view toggle - restore original T3 fix (view prop controlled) 2026-07-31 02:24:07 +00:00
Hermes d059beb7dc fix(p2): Calendar view toggle - key on BigCalendar dynamic import + defaultView 2026-07-31 02:20:40 +00:00
Hermes de06a9aa21 fix(p2): Calendar view toggle - key prop on DragAndDropCalendar forces remount 2026-07-31 01:47:47 +00:00
Hermes 4bf1c8bf4f fix(p2): Calendar view toggle - force Suspense remount with key prop 2026-07-31 01:37:59 +00:00
Hermes 08841abd68 fix(p2): Calendar view toggle - sync internal view state with parent prop via useEffect 2026-07-31 01:35:02 +00:00
Hermes ca8ff5d13b fix(p2): Calendar view toggle - use defaultView + key on parent dynamic import 2026-07-31 01:31:47 +00:00
Hermes aef02253db fix(p2): remove key prop from parent, keep view prop in wrapper 2026-07-31 01:29:27 +00:00
Hermes ab6344d86d fix(p2): force Calendar remount on view change via key prop on parent 2026-07-31 01:24:08 +00:00
Hermes 78a9c50ef2 fix(p2): Calendar Week/Day views, Quick Capture, Canvas create
Bug #7 (MEDIUM): Calendar week/day view toggle broken. The
BigCalendarWrapper used defaultView (uncontrolled) so when the
parent updated the view state via onView, the calendar continued
to show the original view. Switched to view (controlled) so the
calendar re-renders with the correct view.

Bug #6 (MEDIUM): Dashboard Quick Capture button was dead. The
Add button had no onClick handler and the form was wired to
the wrong endpoint (per-type /api/tasks|habits|notes). Switched
to POST /api/quick-capture with {type, text} (the new endpoint
created by P0). Added Project to the type select. Added toast
feedback on success/error. Made the Add button type=button with
explicit onClick so it bypasses form-submit and the global
shortcut handler.

Bug #2 (MEDIUM): Canvas create -> page crash. Already fixed by
P0 (commit c3bce0b removed the hardcoded 'personal' domain
filter). The orphan modification to canvas/page.tsx is also
included here to keep the diff complete.

Bug #6 + Bug #7 + Bug #2 all fixed in this commit.
2026-07-31 01:06:20 +00:00
Hermes f388f124e8 fix(p1): wire New habit/New project buttons + fix Domain Add
Bug #3 (HIGH): New habit button on /habits did not open the create
dialog. The HabitCreateDialog was mounted but the topbar's
useCreateDialogStore had no consumer on /habits, so topbar clicks
were no-ops.

Bug #4 (HIGH): New project button on /projects had the same issue.

Fix: mount CreateItemDialog (type=habit or type=project) on each
page so the topbar store is consumed. Switch the page-level button
to use the store too. The existing local HabitCreateDialog /
ProjectCreateDialog still work as a fallback.

Bug #5 (HIGH): Domain Add button on /settings/domains opened the
Command Palette instead of creating the domain. Two-part cause:
1. The sticky topbar Quick add button was visually overlapping
   the form Add button (both anchored top-right). On click the
   topbar handleCreate fired and dispatched a synthetic Cmd+K
   opening the palette.
2. /api/domains POST required a slug field that the form did not
   send, returning 400.

Fix: hide the topbar Quick add button on pages without a relevant
quick-create (only show on /projects, /habits, /tasks). Make the
form Add button explicit type=button with stopPropagation as
defense in depth. Auto-generate the domain slug from the name
on the server when not provided.

Bug #3 + Bug #4 + Bug #5 all fixed in this commit.
2026-07-31 01:06:04 +00:00
Hermes 2c0295ad00 fix(p1): wire New habit + New project buttons to useCreateDialogStore
The HabitCreateDialog and ProjectCreateDialog were mounted with local
state but the topbar uses useCreateDialogStore, and the store had no
consumer on /habits or /projects. So topbar clicks did nothing, and the
page-level button may have been dead too due to a stale build.

Mount <CreateItemDialog> in both pages so:
- The topbar New habit / New project button opens the dialog
- The page-level buttons open the same dialog via the store
- A single CreateItemDialog handles task/project/habit creation

Bug #3 (New habit) + Bug #4 (New project) are fixed by this commit.
2026-07-31 00:35:29 +00:00
Hermes c3bce0b9e3 fix(p0): resolve active domain automatically when onboarding skipped
- New resolveActiveDomain() helper in apps/web/lib/auth.ts: returns the
  user's first existing domain (ordered by sort_order then created_at),
  or auto-creates a default 'Personal' domain if they have none.
- 7 affected API routes (agents, canvases, domains, habits, projects,
  search, tasks) now fall back to resolveActiveDomain when the request
  omits a domain param. This eliminates the UNDEFINED_VALUE on domain_id
  and 22P02 invalid uuid errors that broke 6+ UI flows.
- New POST /api/quick-capture route: switches on type=task|habit|note|project
  to create the right entity, after resolving the active domain. This is
  the API the dashboard quick-capture widget calls.
- packages/db/src/schema.ts: added ownerId: uuid('owner_id') to the
  domains table so each user owns their domains.
- drizzle/0004_add_owner_id_to_domains.sql: matching migration with
  column add + index.
- apps/web/__tests__/lib/auth.test.ts: unit tests for both branches of
  resolveActiveDomain (returns existing / creates Personal).
- apps/web/app/(dashboard)/canvas/page.tsx: removed hardcoded
  domain: 'personal' from the quick-create payload so server-side
  resolution can do its job.

This unblocks all of: /tasks, /habits, /projects, /search, /settings/agents,
/settings/domains, /canvas, and dashboard quick-capture.
2026-07-30 23:51:29 +00:00
bot-hermes 8de6849474 merge: fix/ux-leaf-f-polish into integration/ux-28-gaps (resolve OnboardingFlow+DispatchPanel in layout) 2026-07-29 20:34:52 +00:00
bot-hermes 4b0cfb2611 merge: fix/ux-leaf-e-crosscut into integration/ux-28-gaps (resolve conflicts on tasks-kanban-view, tasks-list-view, task-detail-panel) 2026-07-29 20:34:27 +00:00
bot-hermes c448a747a7 merge: fix/ux-leaf-d-new-pages into integration/ux-28-gaps 2026-07-29 20:31:22 +00:00
bot-hermes 6f2acf77b7 merge: fix/ux-leaf-c-settings into integration/ux-28-gaps 2026-07-29 20:31:22 +00:00
bot-hermes 7e2fe93d64 merge: fix/ux-leaf-b-edit-dialogs into integration/ux-28-gaps 2026-07-29 20:31:22 +00:00
bot-hermes 281a20c502 fix: correct agents page JSX structure after adding dispatch panel 2026-07-29 20:28:19 +00:00
bot-hermes efbab9517c 27: onboarding flow - make onComplete optional for server component layout 2026-07-29 20:23:12 +00:00
bot-hermes 9b4c0b77c1 26: domain-specific dashboard - add Suspense wrapper for useSearchParams 2026-07-29 20:23:12 +00:00
bot-hermes 888bd6393e feat(sections): refactor section dialog for edit/delete, add dropdown menu in project detail 2026-07-29 19:39:32 +00:00
bot-hermes 449eade4b6 feat: add AI agent dispatch panel with floating button and new task button on agents page 2026-07-29 19:27:17 +00:00
bot-hermes e0020eac7d 26: domain-specific dashboard - respect ?domain= query param 2026-07-29 19:26:27 +00:00
bot-hermes 0835961bc9 23: note templates - localStorage templates (Meeting notes, Daily journal, Brain dump) 2026-07-29 19:26:13 +00:00
bot-hermes dd431a35d6 22: project timeline / Gantt view - CSS grid horizontal Gantt with sections as rows 2026-07-29 19:26:10 +00:00
bot-hermes f1b38ac497 21: habit analytics - recharts line/bar chart for 30-day completions and top streaks 2026-07-29 19:26:06 +00:00
bot-hermes 7ced6f2bf2 feat: add undo toasts for task and note deletions
- Capture deleted item before DELETE call
- Show sonner toast with Undo action button
- On Undo, POST to recreate the item with original data
- Applied to tasks-list-view, task-detail-panel, and notes page
2026-07-29 19:26:05 +00:00
bot-hermes 1d8f548f4b 19: mobile responsive - reduce main content padding on mobile (p-4 md:p-6) 2026-07-29 19:25:50 +00:00
bot-hermes d951348372 feat: add canvas freeform board page with drag-and-drop cards and sidebar link 2026-07-29 19:25:37 +00:00
bot-hermes b314bda934 feat(tasks): add recurring task support with rrule in create dialog, detail panel, and complete route 2026-07-29 19:25:15 +00:00
bot-hermes 1cb932f0f6 feat(tasks): filter/sort controls and bulk operations in list view 2026-07-29 19:24:18 +00:00
bot-hermes 6cbb3bb544 feat: add daily notes page with date navigation and sidebar link 2026-07-29 19:23:56 +00:00
bot-hermes 77a45715c0 feat(projects): add project edit dialog with dropdown menu and archive confirmation 2026-07-29 19:23:45 +00:00
bot-hermes a6ac7c3fb6 feat(habits): add habit edit dialog with dropdown menu and delete confirmation 2026-07-29 19:22:29 +00:00
bot-hermes 1a0704e0f2 feat(settings): add Tags management tab with create/edit/delete UI 2026-07-29 19:22:27 +00:00
bot-hermes 3708505b00 fix: remove completionMode/color/icon from habits route (not in schema) 2026-07-29 18:50:32 +00:00
bot-hermes f5121f3b8d fix: rewrite /api/tasks, /api/habits, /api/projects to use Drizzle ORM instead of PocketBase stub 2026-07-29 18:48:10 +00:00
bot-hermes 0de8f3837f fix: restore domainId prop to TasksKanbanView and TasksListView 2026-07-29 15:26:02 +00:00
bot-hermes bc27e3e4bc fix: wrap tasks page in RealtimeProvider to prevent useRealtimeContext error 2026-07-29 15:23:54 +00:00
bot-hermes 4089d7464c fix: use whitelist sort columns in domains route to fix TypeScript error 2026-07-29 12:59:20 +00:00
bot-hermes f5463f21b0 fix: rewrite /api/domains route to use Drizzle ORM instead of PocketBase stub 2026-07-29 12:57:06 +00:00
bot-hermes ed3d3ae8d1 fix: rename [id] to [domainId] in domains API route to resolve Next.js param conflict 2026-07-29 12:44:41 +00:00
bot-hermes 326af9fd48 fix: rename [id] to [projectId] in projects API route to resolve Next.js param conflict 2026-07-29 12:39:08 +00:00
Hermes Coding Manager 813c97a016 chore(integration): fix lint warnings (react-hooks/exhaustive-deps, react/no-unescaped-entities, unused-vars)
Leftover lint cleanups to make 'npm run lint' pass on the integrated branch:
- calendar/page.tsx: add eslint-disable for mount-only useEffect blocks
- import/route.ts: replace destructure-and-ignore with renames (_id, _created, _updated)
- settings-agents.tsx: escape apostrophe in JSX text
2026-07-29 08:16:22 -04:00
mbatchelder e5b7d9e2ee feat: Phase 6 - MCP + Webhooks + Worker + Polish
- MCP server: stateless JSON-RPC 2.0 with 18 tools (tasks, habits, projects, notes, domains, search, activity)
- Webhooks API: CRUD routes under /api/domains/[domainId]/webhooks/ with test endpoint and deliveries log
- Webhook delivery: HMAC-SHA256 signed POST with retry (exponential backoff, max 6)
- Worker rewrite: Drizzle ORM instead of PocketBase, polls jobs table, handles webhook_delivery, recurring_spawn, ai_dispatch
- Rate limiting: token bucket per IP/API key (100 req/min REST, 300 req/min MCP)
- Keyboard help overlay: ? opens Radix Dialog with search/filter, Esc closes
- AI @mention stub: @agent in command palette dispatches CustomEvent
- Mobile responsive: bottom nav, single-column kanban, day view calendar, 44px touch targets
- Accessibility: skip-to-content link, focus rings, aria-labels, color contrast
- E2E tests: mcp.spec.ts, webhooks.spec.ts, realtime.spec.ts added
- Schema: api_keys and webhook_deliveries tables with migration
- Removed old PocketBase-style database.ts from worker
2026-07-29 08:03:28 -04:00
mbatchelder eba1d78fb9 feat: Phase 5 - Calendar + Dashboard + Search
Calendar:
- GET /api/domains/[domainId]/calendar/events?from=&to= — returns tasks, habits, projects, milestones
- PATCH /api/domains/[domainId]/tasks/[id]/schedule — drag-to-reschedule with activity feed
- Calendar UI with month/week/day views via react-big-calendar
- Drag-to-reschedule with SSE updates
- Filter by entity type and domain
- Keyboard shortcuts: t=today, m/w/d=view, ←/→=navigate
- Mobile: auto-switches to day view on small screens

Dashboard:
- GET/PUT /api/domains/[domainId]/dashboard — layout stored in domain custom_fields
- 8 per-widget data endpoints (today-tasks, habit-checklist, weekly-stats, project-progress, upcoming-calendar, recent-notes, activity-feed, quick-capture)
- react-grid-layout with responsive breakpoints (12/8/4 cols)
- Drag-to-reorder, resize, add/remove widgets
- Edit mode toggle, per-workspace layout persistence
- Widget error boundary

Search:
- tsvector columns + GIN indexes on tasks, notes, projects, habits, domains
- GET /api/search?q=&types=&domain= — ranked results with ts_headline snippets
- Dedicated search page with grouped results, filters, recent searches (localStorage)
- Empty state with hints

Schema:
- Added custom_fields jsonb column to domains table (migration 0002)
- Removed stale root app/ directory

Build: passes, typecheck: passes, tests: 18/18 wikilink-parser tests pass
2026-07-29 07:32:47 -04:00
mbatchelder 40a26d2672 feat: Phase 4 - Notes + Graph + Wikilinks
- Wikilink parser: [[Title]], [[Title|Display]], [[entity_type:Title]] patterns
- Notes REST API: CRUD under /api/domains/[domainId]/notes/ with wikilink sync
- Note link service: idempotent wikilink resolution, backlinks, outgoing links
- Notes list page: search, filter (all/pinned/archived), domain selector
- Note editor: TipTap with backlinks panel and outgoing links display
- Graph data API: /api/domains/[domainId]/graph and /api/graph
- Graph view page: D3 force-directed graph with entity type filters, search, zoom
- Keyboard shortcuts: g g → graph, c n → new note
- 18 passing wikilink parser tests
- All API routes follow AGENTS.md contract (activity + pg_notify)
2026-07-29 06:56:23 -04:00
mbatchelder 064a46f97d feat: Phase 3 - Habits + Projects CRUD API, frontend, completions, sections
Habits REST API:
- GET/POST /api/domains/[domainId]/habits (list with filters, create)
- GET/PATCH/DELETE /api/domains/[domainId]/habits/[id] (detail, update, soft delete)
- POST /api/domains/[domainId]/habits/[id]/complete (completion + streak calc)
- GET /api/domains/[domainId]/habits/[id]/completions (list with date range)
- POST/DELETE /api/domains/[domainId]/habits/[id]/tags

Projects REST API:
- GET/POST /api/domains/[domainId]/projects (list with task counts, create)
- GET/PATCH/DELETE /api/domains/[domainId]/projects/[id] (detail with sections/tasks, update, soft delete)

Sections REST API:
- GET/POST /api/domains/[domainId]/projects/[projectId]/sections (list, create)
- GET/PATCH/DELETE /api/domains/[domainId]/projects/[projectId]/sections/[id]

Frontend:
- Habits page: checklist view, difficulty badges, streak display, filter
- Habit create dialog: name, description, frequency, difficulty, goal, unit, reminder, mood toggle
- Habit completion dialog: value, mood (1-5 emoji), notes
- Calendar heatmap: 365-day grid, color by value, hover tooltip
- Projects page: grid of cards with progress bars, status badges, tags
- Project detail page: sections board, drag tasks between sections
- Project create dialog: name, description, status, color picker, target date
- Section dialog: name, kind (section/milestone), status, target date

Keyboard shortcuts: c h (new habit), c p (new project), c s (new section)

All write routes follow AGENTS.md contract (Drizzle + recordActivity + pg_notify).
Build, typecheck, and 15 new tests pass.
2026-07-29 06:37:37 -04:00
mbatchelder b6e2ab415e feat: Phase 2 - Tasks CRUD API, kanban/list UI, dialogs, activity feed, keyboard shortcuts
- Tasks REST API under /api/domains/[domainId]/tasks/ with full CRUD, filtering, pagination
- Complete/uncomplete endpoints
- Bulk update endpoint for drag-to-reorder
- Dependencies API with cycle detection
- Tags API for task tagging
- Activity feed API scoped to workspace
- Updated kanban board view with 4 columns (todo/in_progress/done/cancelled)
- Updated list view with status column and workspace-scoped API calls
- Task create dialog with title, description, status, priority, due date, estimate
- Task detail panel (sheet) with full edit capabilities
- Task activity feed widget
- Keyboard shortcuts: c t (new task), e (edit), d (delete), Space (open), Esc (close), 1-4 (filter)
- All routes follow AGENTS.md contract: Drizzle writes + activity feed + pg_notify
2026-07-29 06:12:35 -04:00
mbatchelder b3ff23a5f0 feat: Phase 1 foundation - schema, auth, realtime, shell
- Rewrote Drizzle schema: 20 tables with enums, relations, indexes
- Generated migration with DROP TABLE records (v1 EAV removal)
- Added passkey auth routes (register/login)
- Added requireWorkspaceAccess helper
- Added seedDefaultData for Personal workspace + welcome note
- Updated SSE endpoint for v2 entities + workspace_id filtering
- Created recordActivity helper (insert + pg_notify)
- Updated sidebar: Graph replaces Reports, removed Analytics
- Updated command palette for v2 entities
- Created AGENTS.md with locked contract
- Created llm-wiki scaffold (5 stubs)
- Added inline AGENT INSTRUCTION comments to all 50 API route files
- Fixed globals.css border-border class conflict
- Updated database.ts stub for v1 compatibility
2026-07-29 05:53:13 -04:00