Commit Graph
42 Commits
Author SHA1 Message Date
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 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 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 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 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
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
bot-hermes 9ddab4e5a5 fix: round 3 UI gaps - habit edit dialog, domain edit, empty states, domain name resolution 2026-07-28 15:02:01 +00:00
bot-hermes b76ba9f5c0 fix: notes page default domain should be empty (fetched from API) 2026-07-28 13:57:20 +00:00
bot-hermes 80834ef121 fix: notes page fetches domains on mount for domain name resolution 2026-07-28 13:54:18 +00:00
bot-hermes 640994c9c1 fix: projects page re-fetches on refreshKey change 2026-07-28 13:45:55 +00:00
bot-hermes af7d05be0f fix: 7 UX bugs across dashboard, tasks, projects, calendar, settings
- Dashboard: fetch project progress from /api/projects/[id]/progress
- Tasks List: add DropdownMenuTrigger to More options button
- Projects: add New project button with CreateItemDialog integration
- Settings: use color picker value when creating domains
- Calendar: use dynamic domain options instead of hardcoded list
- Dashboard: make View all button navigate to /tasks
- Dashboard: domain names already resolved via domainMap (verified working)
2026-07-26 01:22:41 +00:00
bot-hermes 953a947874 fix: resolve 15+ UX issues across the full app
- CreateItemDialog: shared Zustand store for dialog state
- TopBar: use store instead of router.push navigation
- TaskDetailPanel: dynamic domain fetch from /api/domains
- TodayTasksWidget: domain name resolution from UUIDs
- ProjectProgressWidget: fetch real progress, default to 0
- Calendar page: domain filter fetches from API dynamically
- Habits page: edit/delete dropdown with AlertDialog
- Projects page: domain name display + delete button
- Notes page: domain picker on creation, names in list
- Settings domains: add color picker input
- Tasks list view: MoreHorizontal wired to edit/delete
- HabitCard: domain resolution + edit/delete dropdown
- PocketBase compat: add JSDoc migration comment
2026-07-25 02:22:01 +00:00
bot-hermes a21c1606c9 fix: calendar filter, habit service, PB 0.25 field compat
- Calendar: remove unsupported due_date!="" filter (PB 0.25 rejects), fetch all + filter client-side
- habit-service: fix active=true filter to archived!=true (field doesnt exist)
- habit-service: remove references to non-existent fields (completed, skipped, score_config, start_date)
- All PocketBase collections: re-added proper data fields with correct PB IDs for relations

Fixes calendar, analytics, habits heatmap, and habits streaks endpoints.
2026-07-19 23:39:20 +00:00
mbatchelder 4c1cc50231 feat: update ProjectE application 2026-07-18 19:05:52 -04:00
mbatchelder 8f55626e03 refactor: migrate to monorepo structure with Docker, PocketBase, and e2e tests
- Reorganize into apps/, packages/, docs/, e2e/, pocketbase/ directories
- Add Dockerfiles for web, worker, and PocketBase services
- Add docker-compose.yml for local orchestration
- Add turbo.json for monorepo task management
- Add Playwright e2e test infrastructure
- Add PocketBase backend with migrations
- Remove Vite/Next.js/ESLint/PostCSS config files
- Update package.json with workspace dependencies
- Add .env.example and .dockerignore
2026-07-16 06:19:58 -04:00