Add TimeEntry tracking to task files with `backlog task log` and `backlog task time`
commands. Introduce rTime bridge layer with offline queue for pushing time entries
to rSpace commitment pools. New `backlog rtime` command group for sync, pull,
link, and import operations.
Phase 1: TimeEntry types, parser/serializer, Core.updateTaskFromInput
Phase 2: rTime API (handled in rspace-online repo)
Phase 3: rtime-sync.ts bridge with offline queue
Phase 4: Pull sync (rTime → backlog status updates)
Phase 6: Import rTime tasks as local backlog tasks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Parse due_date/dueDate/deadline from task frontmatter. Sort API
output with due-date tasks first (soonest at top), then group
remaining tasks by project name.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLAUDE.md may contain project context with credentials and is now
covered by global gitignore to prevent accidental secret commits.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Projects now appear as a dropdown with checkboxes instead of
horizontal buttons. Supports All Projects, Clear All, and
individual project toggle filtering.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
- 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>
- 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>
- 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>