Fix table alignment issue on landing page by rendering simple table
rows instead of collapsible project sections inside the tbody.
Changes:
- Simplify renderSessionsGroupedByProject() to render table rows directly
- Add table-layout: fixed to .projects-table for proper column widths
- Sort sessions by last activity (newest first)
The previous implementation was rendering div elements (project sections)
inside the table tbody, which broke the table layout. Table elements
only accept tr elements as direct children.
Resolves "things don't align" issue on projects table.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add Express trust proxy setting and improve session cookie configuration
to work properly behind nginx reverse proxy.
Changes:
- Add app.set('trust proxy', 1) before session middleware
- Update session cookie with sameSite: 'lax' and httpOnly: true
- Add explicit cookie name: 'connect.sid'
This works together with nginx location blocks to route /api/projects
and /api/recycle-bin requests to the Obsidian Web Interface (port 3010)
instead of the generic Next.js backend (port 8080).
Fixes "Failed to load on projects" error on production domain.
See AUTHENTICATION_FIX_REPORT.md for full details.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fix "Failed to load on projects" error by including credentials in all
fetch calls to /api/* endpoints. The session cookie must be sent with
requests for requireAuth middleware to authenticate users.
Changes:
- projects.js: Add credentials: 'include' to all 6 API fetch calls
(loadProjects, saveProject, deleteProject, loadDeletedProjects,
restoreProject, permanentDeleteProject)
- sessions-landing.js: Add credentials to 3 API fetch calls
(loadSessionsAndProjects, moveSessionToProject, context menu
suggestions)
Resolves issue where projects page showed "Failed to load projects"
error on https://www.rommark.dev/claude
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Modified session creation endpoint to accept and store projectId:
- Accept optional projectId parameter in POST /claude/api/claude/sessions
- Validate projectId exists and is not deleted before assignment
- Store projectId in both session metadata and database
- Update project's lastActivity timestamp when session is created
- Also updated duplicate endpoint to preserve projectId from source session
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add GET /projects route in server.js with authentication check
- Serve projects.html when authenticated, redirect to login otherwise
- Add navigation header to both landing page and projects page
- Include Sessions, Projects navigation links with active state styling
- Add logout button to navigation header
- Style navigation with dark theme matching existing design
- Make navigation responsive for mobile devices
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add migration script to backfill existing sessions into projects:
- Scans session files from Claude Sessions directory
- Extracts unique project names from metadata.project field
- Creates projects with random icons and colors
- Links sessions to their respective projects in database
- Provides detailed progress reporting and summary
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implemented smart suggestions UI with visual indicators for moving sessions between projects.
Features:
- Right-click context menu on session rows
- Fetches smart project suggestions from API
- Displays top 3 suggestions with match scores and reasons
- Visual indicators: 🎯 (90+), 📂 (50-89), 💡 (10-49)
- "Open in IDE" option for quick navigation
- "Show All Projects" modal for full project list
- "Move to Unassigned" to remove project association
- Smooth animations and hover effects
- Click outside to close menu
- Responsive design for mobile devices
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add loadSessionsAndProjects() to fetch sessions and projects in parallel
- Store projects in window.projectsMap for quick lookup
- Group sessions by projectId, separating assigned and unassigned
- Render collapsible project sections with icon, name, and session count
- Add toggleProjectSection() to collapse/expand sections (▼/▶)
- Display project badges on sessions when assigned to a project
- Unassigned sessions shown in separate section at bottom
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implement complete JavaScript functionality for the projects management page:
- State management for projects array and current editing project
- loadProjects() - Fetch projects from /api/projects
- renderProjects(filter) - Render project cards with search/filter support
- setupEventListeners() - Wire up all interactive elements
- openProject(projectId) - Navigate to sessions page for selected project
- openProjectModal(project) - Open modal for create/edit operations
- closeProjectModal() - Close modal and reset form
- handleProjectSubmit(e) - Validate and save project data
- showProjectMenu(projectId, event) - Display context menu
- deleteProject(projectId) - Soft delete with confirmation
- openRecycleBinModal() - Display deleted projects
- restoreProject(projectId) - Restore from recycle bin
- permanentDeleteProject(projectId) - Delete forever with confirmation
- escapeHtml(text) - XSS prevention for user-generated content
- formatDate(dateString) - Human-readable relative timestamps
- showToast(message, type) - Toast notifications with animations
Features:
- Async/await for all API calls
- Comprehensive error handling
- Real-time search filtering
- Context menu for project actions
- Responsive modal system
- Toast notifications for user feedback
- Keyboard shortcuts (Escape to close)
- Click outside to close menus/modals
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add comprehensive CSS styles for the projects management page including:
- Page layout with responsive header
- Projects grid with auto-fill layout (300px min cards)
- Project cards with hover effects and stats
- Modal styles for create/edit and recycle bin
- Form elements with proper styling
- Button styles (primary/secondary)
- Context menu for card actions
- Recycle bin items with restore/delete actions
- Empty state styling
- Responsive design for mobile devices
- Scrollbar styling
Uses CSS variables from existing style.css for consistency.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added GET /api/projects/suggestions endpoint that provides intelligent
project suggestions based on session context. The endpoint:
- Takes sessionId as a required query parameter
- Retrieves session from in-memory or historical sessions
- Calculates scores for each project using multiple criteria:
* Directory match (90 points): session workingDir === project path
* Subdirectory match (50 points): session workingDir starts with project path
* Used today (20 points): project lastActivity < 1 day ago
* Used this week (10 points): project lastActivity < 7 days ago
* Name similarity (15 points): overlap between session dir name and project name
- Returns top 3 scored suggestions with reasons
- Also returns all projects sorted alphabetically
- Filters out projects with zero scores from suggestions
- Handles missing sessions with appropriate error responses
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Fix route path from /api/sessions/:id/move to /claude/api/claude/sessions/:id/move
- Fix race condition by fetching session once and storing isActiveSession flag
- Add database persistence for active session metadata changes
- Ensures consistency between in-memory and database state
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add sessions table to database with projectId and deletedAt columns
- Create POST /api/sessions/:id/move endpoint to reassign sessions
- Update DELETE /api/projects/:id to cascade soft-delete to sessions
- Support moving sessions between projects or to unassigned state
- Handle both active (in-memory) and historical sessions
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed code quality issues from Task 2 review:
1. Added ID validation in PUT endpoint:
- Validates req.params.id is a valid positive integer
- Returns 400 for invalid IDs (non-numeric, negative, zero, decimals)
- Prevents SQL injection attempts
2. Added path validation in POST and PUT endpoints:
- Validates projectPath is absolute path
- Normalizes and resolves paths
- Detects and blocks path traversal attempts (e.g., ../../../etc)
- Returns 400 for invalid paths
3. Fixed UNIQUE constraint in database schema:
- Removed UNIQUE constraint from name column
- Allows creating projects with same name as deleted projects
- Application-level duplicate checking remains for active projects
- Added table migration to drop and recreate schema
Files modified:
- server.js: Added validateProjectId() and validateProjectPath() helpers
- services/database.js: Removed UNIQUE constraint, added migration
All validation tested and working correctly.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added three new API endpoints for managing projects using SQLite:
- GET /api/projects - Lists all active projects (deletedAt IS NULL)
* Sorts by lastActivity DESC
* Returns id, name, description, icon, color, path, sessionCount, createdAt, lastActivity
- POST /api/projects - Creates new project
* Required fields: name, path
* Optional fields: description, icon (default '📁'), color (default '#4a9eff')
* Validates required fields and checks for duplicate names
* Returns 201 status on success
- PUT /api/projects/:id - Updates existing project
* Allows updating: name, description, icon, color, path
* Only updates projects where deletedAt IS NULL
* Returns 404 if project not found
* Validates duplicate names on name change
All endpoints use synchronous better-sqlite3 API with parameterized queries.
SessionCount set to 0 for now (will be implemented in Task 3).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Install better-sqlite3 package for persistent storage
- Create database service with projects table schema
- Add indexes on deletedAt and name for efficient queries
- Support soft-delete with deletedAt timestamp
- Export database instance for use in server.js
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Full IDE with terminal integration using xterm.js
- Session management with local and web sessions
- HTML preview functionality
- Multi-terminal support with session picker
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>