Commit Graph

41 Commits

Author SHA1 Message Date
Jeff Emmett 19f669f7d1 Update dependency graph: squares, all tasks, project clusters
- Change nodes from circles to squares (rounded corners)
- Show ALL tasks, not just those with dependencies
- Group tasks by project using cluster force simulation
- Add project name labels hovering above each cluster
- Labels show project name and task count
- Dynamic height based on number of projects
- Legend updated to show square shapes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 13:24:09 +01:00
Jeff Emmett 36b35e3cbe Add Dependencies tab to aggregator static HTML
- Add Kanban/Dependencies tab switcher in header
- Add D3.js force-directed graph visualization
- Show completed toggle filter
- Color-coded nodes by status (green=done, blue=in-progress, gray=todo)
- Project-specific border colors
- Drag nodes, pan/zoom, hover to highlight connections
- Click node for task details

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 13:17:20 +01:00
Jeff Emmett a7ca81e1cd Add Dependencies tab to aggregator UI
- Add D3.js dependency graph visualization to backlog.jeffemmett.com
- Tab switcher between Kanban and Dependencies views
- Show completed toggle filter
- Force-directed graph layout with pan/zoom and drag support
- Color-coded nodes by status (green=done, blue=in-progress, gray=todo)
- Project-specific border colors
- Click to edit task, hover to highlight connections

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 12:22:51 +01:00
Jeff Emmett 47b8bdfd93 Add dependency visualization dashboard with D3.js
- Add BoardTabs component for switching between Kanban and Dependencies views
- Add DependencyView (Mermaid-based) and DependencyViewD3 (D3.js force-directed graph)
- Add DependencyFilters for status, priority, and completed task filtering
- Add graph utilities for building dependency graphs and generating visualizations
- Features: drag nodes, pan/zoom, hover highlighting, click-to-edit, sequence badges
- Color coding: green (done), blue (in progress), gray (to do), red border (high priority)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 12:12:05 +01:00
Jeff Emmett 2bb372b806 Update task task-003 2026-01-02 20:25:18 +01:00
Jeff Emmett 19fba96cf2 Create task task-008 2026-01-02 14:53:49 +01:00
Jeff Emmett 80326a7ec6 backlog: Archive task task-008 2025-12-26 23:23:29 -05:00
Jeff Emmett 805e63f01f Create task task-008 2025-12-26 23:20:20 -05:00
Jeff Emmett bf0131f886 Update task task-007 2025-12-26 23:18:35 -05:00
Jeff Emmett 4c255d6440 Update task task-006 2025-12-26 23:18:35 -05:00
Jeff Emmett a65dd62f49 Create task task-007 2025-12-26 23:09:29 -05:00
Jeff Emmett 65e5ba570c Create task task-006 2025-12-26 23:09:22 -05:00
Jeff Emmett a8fd547776 Create task task-005 2025-12-26 22:56:17 -05:00
Jeff Emmett 04771d6a28 Create task task-004 2025-12-26 22:56:17 -05:00
Jeff Emmett 5f0423888b fix: update docker-compose for aggregator mode deployment
- Run aggregator command instead of browser (multi-project mode)
- Mount project directories for scanning (/opt/websites, /opt/apps, /opt/gitea-repos)
- Use writable mounts so task updates work
- Rename container to backlog-aggregator

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 22:32:41 -05:00
Jeff Emmett fb51f12663 feat: add estimatedHours field and fix aggregator project duplication
- Add estimatedHours field to Task type for time tracking/invoicing
- Parse estimated_hours (snake_case) and estimatedHours (camelCase) from frontmatter
- Serialize to snake_case format
- Add --hours flag to CLI create/edit commands
- Add estimatedHours to MCP schema and handlers
- Display estimated hours in TaskCard with clock icon
- Add editable estimatedHours input in TaskDetailsModal
- Fix aggregator showing duplicate projects with different colors
  (now deduplicates by project name)
- Add comprehensive test suite for estimatedHours feature

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 21:27:59 -05:00
Jeff Emmett b9ee50e824 Create task task-003 2025-12-25 20:57:41 -05:00
Jeff Emmett 3c43af697b Create task task-002 2025-12-25 20:50:30 -05:00
Jeff Emmett c695aeecfc feat: add velocity dashboard, Do Today feature, and label toggle filters
- Add real velocity metrics using statusHistory data (cycle time, throughput, weekly bars)
- Add doToday field to tasks with star toggle in TaskCard and TaskList
- Add "Today" filter button to show only starred tasks
- Make label tags clickable toggles for filtering (click to add/remove filters)
- All filters sync with URL parameters for shareable links

Closes task-001

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-06 22:26:45 -08:00
Jeff Emmett 85482d4028 Update task task-001 2025-12-06 22:25:37 -08:00
Jeff Emmett 7e6ad3362c Create task task-001 2025-12-06 22:25:14 -08:00
Jeff Emmett 21b8ef5cdd feat: add drag & drop to React aggregator UI
- Add drag state management for tasks and columns
- Implement column drop handlers with visual feedback
- Add task card drag handlers with data transfer
- Highlight drop targets with dashed border
- Show "Drop here to move task" placeholder in empty columns
- Add optimistic UI updates for archive/delete actions
- Reduce opacity on dragged task for visual feedback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 13:53:30 -08:00
Jeff Emmett 6c3563c7e4 fix: handle CRLF line endings in aggregator task updates
The updateTaskField, addUpdatedDate, and updateTaskDescription functions
only matched Unix line endings (\n), causing task updates to silently
fail when files had Windows line endings (\r\n).

Updated all three functions to:
- Match both \r\n and \n line endings in regexes
- Detect and preserve the original line ending style when writing back

This fixes drag & drop status updates in the aggregator web UI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 12:28:39 -08:00
Jeff Emmett 0368963bff feat: add HTTP fallback when WebSocket unavailable
WebSocket connections may not work through Cloudflare Tunnel.
Added HTTP polling fallback that:
- Loads initial data via /api/projects and /api/tasks
- Falls back to 5-second polling if WebSocket fails
- Shows "Polling" status badge when in fallback mode

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:40:33 -08:00
Jeff Emmett d2a229ade2 fix: handle API POST/PATCH/DELETE in fetch handler
Bun's routes object has issues with non-GET methods not being matched
correctly. Handle these methods explicitly in the fetch handler.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:23:25 -08:00
Jeff Emmett bcd3c30f92 fix: store filePath when loading tasks in aggregator
The aggregated tasks weren't storing the filePath property, which is
needed by the update/archive/delete handlers to find the actual task
file on disk.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:19:47 -08:00
Jeff Emmett 29aafc7e4f fix: use task.filePath in aggregator update/archive/delete handlers
Task files are named 'task-001 - title.md' not 'task-001.md'.
The handlers were constructing incorrect filenames instead of using
the filePath property stored when tasks are loaded.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 05:12:27 -08:00
Jeff Emmett 4ef191327b fix: route ordering in aggregator for /api/tasks/* endpoints
Same fix as server - static routes (/api/tasks/update, /api/tasks/create,
etc.) must be defined before parameterized routes (/api/tasks/:project/:id)
to prevent Bun's router from matching the parameter route first.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 04:55:13 -08:00
Jeff Emmett 4e5257481c fix: route ordering for /api/tasks/reorder endpoint
Static routes (/api/tasks/reorder, /api/tasks/cleanup) must be defined
before parameterized routes (/api/tasks/:id) to prevent Bun's router
from matching the parameter route first. This was causing 404 errors
on drag-and-drop task reordering in the kanban board.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 04:45:36 -08:00
Jeff Emmett a1987d4ed5 feat: add status history tracking for velocity statistics
- Add StatusHistoryEntry type to track status transitions with timestamps
- Update parser to read status_history from task frontmatter
- Update serializer to write status_history to task frontmatter
- Record status changes in backlog.ts for both task creation and updates
- Add velocity statistics panel to aggregator UI with:
  - Tasks completed in last 7 days
  - Average cycle time (To Do -> Done)
  - Average time to start (To Do -> In Progress)
  - Weekly throughput chart with 4-week visualization

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 03:11:47 -08:00
Jeff Emmett 5fdcd5a273 UI improvements: move priority to bottom right, buttons inside card
- Move archive/delete buttons inside task card (top right, smaller)
- Move priority dropdown to bottom right of card
- Remove status dropdown (redundant with drag & drop)
- Cleaner card layout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 02:49:49 -08:00
Jeff Emmett 235fe7c11c Port features from app.tsx to vanilla JS index.html
- Add Won't Do as 4th kanban column
- Add delete (×) and archive (↑) hover buttons on task cards
- Add inline title editing (click to edit, Enter/Escape)
- Add status dropdown for quick status changes
- Add priority dropdown with color-coded display
- Add expandable description editing (Ctrl+Enter to save)

This ports the React features to vanilla JS so the aggregator
actually uses them (server serves index.html, not app.tsx).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 02:41:33 -08:00
Jeff Emmett 5775b0d1e8 Fix symlink for Docker: replace with actual file
The symlink was causing ENOENT errors in Docker because symlinks
pointing outside the build context don't work in containers.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 02:23:26 -08:00
Jeff Emmett 10ee1094c1 Add inline editing, delete/archive buttons, and Won't Do column to aggregator
- Add delete (×) and archive (↑) hover buttons on task cards
- Add Won't Do as fourth kanban column (grid now 4 columns)
- Implement inline title editing (click to edit, Enter/Escape)
- Add status dropdown for quick status changes
- Add priority dropdown with color-coded display
- Make description editable when card is expanded (Ctrl+Enter to save)
- Add POST /api/tasks/archive endpoint (moves to archive folder)
- Add DELETE /api/tasks/delete endpoint (permanent deletion)
- Enhance PATCH /api/tasks/update to support all fields

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 01:44:40 -08:00
Jeff Emmett 6421377c86 Fix double-submit bug in task creation form
- Add isSubmitting flag to prevent duplicate submissions
- Disable submit button and show "Creating..." text while processing
- Re-enable button after completion or error

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 21:36:44 -08:00
Jeff Emmett 261c2695ae Add interactive drag-and-drop task management to aggregator
- Add drag-and-drop to move tasks between kanban columns (To Do, In Progress, Done)
- Add "New Task" button with modal form to create tasks
- Add /api/tasks/update PATCH endpoint for status changes
- Add /api/tasks/create POST endpoint for new tasks
- Write changes directly to task markdown files on disk
- Enable read-write mounts in docker-compose for task editing
- Add toast notifications for user feedback
- Optimistic UI updates with error handling

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 21:26:29 -08:00
Jeff Emmett 3230156ada Fix WebSocket upgrade by moving / route to fetch handler
Routes in Bun.serve() take precedence over WebSocket upgrade checks.
Move the root path handler to the fetch() function so WebSocket
upgrade requests are processed first.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 21:09:20 -08:00
Jeff Emmett a3ad292b81 Use vanilla JS for aggregator frontend (no React bundling needed)
The HTML import with React/TSX doesn't work well in Docker production
builds. Replace with a self-contained HTML file with vanilla JS that
works reliably across all environments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 21:01:56 -08:00
Jeff Emmett 24757f5031 Add polling fallback for Docker file watcher reliability
File watchers (inotify) don't work reliably with Docker bind mounts,
so add 5-second polling as a fallback to ensure task updates are
detected in containerized environments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:52:01 -08:00
Jeff Emmett b3e055217d Add multi-project backlog aggregator with real-time updates
- Create BacklogAggregator server that scans directories for backlog projects
- Add WebSocket support for real-time task updates across all projects
- Implement project color-coding for visual distinction in unified view
- Add React frontend with Kanban board showing aggregated tasks
- Add 'aggregator' CLI command to start the multi-project server
- Create Docker configuration for deployment at backlog.jeffemmett.com

The aggregator watches multiple backlog directories and broadcasts updates
via WebSocket when any task changes, enabling Claude agents to update tasks
and have changes reflect immediately in the unified dashboard.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:35:43 -08:00
Jeff Emmett 3e87147f63 Initial commit - fork of Backlog.md with Docker deployment for backlog.jeffemmett.com
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 17:57:16 -08:00