279 lines
12 KiB
Markdown
279 lines
12 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Project Overview
|
|
|
|
XP Nix is a productivity tracking and gamification system designed for Linux desktop environments, supporting both
|
|
Hyprland and Sway window managers. It transforms daily computer usage into a gamified experience by monitoring
|
|
activity patterns and providing real-time feedback through an XP (experience points) system.
|
|
|
|
### Window Manager Support
|
|
|
|
**Hyprland**: Full feature support including visual desktop enhancements, idle monitoring, and activity detection
|
|
**Sway**: Core functionality with idle monitoring and activity detection (visual enhancements disabled by design)
|
|
**Detection**: Automatic runtime detection via environment variables (`HYPRLAND_INSTANCE_SIGNATURE`, `SWAYSOCK`)
|
|
|
|
## Commands
|
|
|
|
### Development
|
|
- `dart run bin/xp_nix.dart` - Run the main application server
|
|
- `dart run bin/xp_nix.dart --help` - Show command line options
|
|
- `dart run bin/xp_nix.dart --db custom.db --port 8081` - Run with custom database and port
|
|
- `dart test` - Run all tests
|
|
- `dart test test/specific_test.dart` - Run a specific test file
|
|
- `dart analyze` - Run static analysis and linting
|
|
- `dart pub get` - Install dependencies
|
|
|
|
### Interactive Commands (while running)
|
|
Once the server is running, these commands are available in the terminal:
|
|
- `stats` - Show current productivity stats
|
|
- `test [level]` - Test theme for specific level
|
|
- `restore` - Restore desktop backup
|
|
- `refresh` - Refresh base config from current system config
|
|
- `build` - Build Flutter dashboard and copy to static files
|
|
- `help` - Show available commands
|
|
|
|
### Nix Environment
|
|
This project uses Nix flakes for development environment management. The flake provides Dart SDK and SQLite with proper library paths configured:
|
|
- `nix develop` - Enter development environment with Dart and SQLite
|
|
|
|
## Architecture Overview
|
|
|
|
### Core Components
|
|
|
|
**ProductivityMonitor** (`lib/src/monitors/productivity_monitor.dart`) - Central orchestrator that:
|
|
- Coordinates activity detection, idle monitoring, and desktop enhancement
|
|
- Calculates XP rewards based on activity types and time multipliers
|
|
- Manages level progression and achievement system
|
|
- Supports both event-driven (via IActivityDetector) and legacy polling modes
|
|
- Broadcasts updates via WebSocket for real-time dashboard updates
|
|
|
|
**DashboardServer** (`lib/src/web/dashboard_server.dart`) - Web server providing:
|
|
- RESTful API endpoints for stats, achievements, activities, and configuration
|
|
- Real-time WebSocket connections for live updates
|
|
- Serves Flutter-built dashboard from static files
|
|
- Configurable port (default: 8080)
|
|
|
|
**DatabaseManager** (`lib/src/database/database_manager.dart`) - SQLite database operations for:
|
|
- Daily stats tracking (XP, focus time, meeting time, level)
|
|
- Activity events with duration and metadata
|
|
- Application classifications (user-defined)
|
|
- Achievements and focus sessions
|
|
- Theme change history and streak tracking
|
|
|
|
### Dependency Injection & Testing
|
|
|
|
The codebase uses dependency injection through interfaces to enable both production and testing modes:
|
|
|
|
**Interfaces** (`lib/src/interfaces/`):
|
|
- `IActivityDetector` - Window/application activity detection
|
|
- `IIdleMonitor` - User idle state monitoring
|
|
- `IDesktopEnhancer` - Desktop theme/visual enhancements
|
|
- `ITimeProvider` - Time operations (for testing time manipulation)
|
|
- `IWindowManager` - Window manager operations abstraction
|
|
|
|
**Hyprland Implementations**:
|
|
- `HyprlandActivityDetector` - Uses `hyprctl activewindow` for activity detection
|
|
- `IdleMonitor` - Uses `hypridle` for idle state monitoring
|
|
- `HyprlandEnhancer` - Full desktop theming and visual enhancements
|
|
- `HyprlandManager` - Window manager operations via `hyprctl`
|
|
|
|
**Sway Implementations**:
|
|
- `SwayActivityDetector` - Uses `swaymsg -t get_tree` for activity detection
|
|
- `SwayIdleMonitor` - Uses `swayidle` for idle state monitoring
|
|
- `SwayEnhancer` - Notifications-only enhancer (no visual changes)
|
|
- `SwayManager` - Window manager operations via `swaymsg`
|
|
|
|
**Factory Classes** (`lib/src/factories/`):
|
|
- `IdleMonitorFactory` - Creates appropriate idle monitor for detected window manager
|
|
- `ActivityDetectorFactory` - Creates appropriate activity detector for detected window manager
|
|
- `DesktopEnhancerFactory` - Creates appropriate enhancer for detected window manager
|
|
- `WindowManagerFactory` - Creates appropriate window manager interface
|
|
|
|
**Test Mocks** (`lib/src/testing/`):
|
|
- `MockActivityDetector` - Controllable activity simulation
|
|
- `MockIdleMonitor` - Controllable idle state simulation
|
|
- `MockDesktopEnhancer` - No-op desktop enhancement for testing
|
|
- `MockTimeProvider` - Controllable time for testing
|
|
- `MockWindowManagerDetector` - Test scenarios for different window managers
|
|
|
|
### Activity Classification System
|
|
|
|
**ActivityEventType** enum categorizes activities:
|
|
- `coding` - Development work (10 XP/min base)
|
|
- `focusedBrowsing` - Research and documentation (6 XP/min base)
|
|
- `collaboration` - Team communication (7 XP/min base)
|
|
- `meetings` - Video conferences and calls (3 XP/min base)
|
|
- `misc` - General productivity (2 XP/min base)
|
|
- `uncategorized` - Unknown activities (1 XP/min base)
|
|
|
|
**Classification Logic**:
|
|
- Uses user-defined application classifications stored in database
|
|
- Fallback categorization based on application names and window titles
|
|
- Tracks unclassified applications for manual categorization
|
|
|
|
### XP & Gamification System
|
|
|
|
**XP Calculation**:
|
|
- Base XP per minute varies by activity type
|
|
- Time-based multipliers from configuration:
|
|
- Deep work hours (1.5x): 09:00-11:00, 14:00-16:00
|
|
- Late night penalty (0.8x): 22:00-06:00
|
|
- Focus session bonuses: 60min (+100 XP), 120min (+200 XP), 180min (+500 XP)
|
|
|
|
**Level System**:
|
|
- 100 XP per level progression
|
|
- Visual desktop themes applied at different levels
|
|
- Achievement system with level, focus, and session-based rewards
|
|
|
|
**Achievements**:
|
|
- Level-based: Rising Star (L5), Productivity Warrior (L10), Focus Master (L15), Legendary Achiever (L25)
|
|
- Focus-based: Deep Focus (4h), Focus Titan (8h)
|
|
- Session-based: Session Master (5+ sessions)
|
|
- Meeting-based: Communication Pro (3h meetings)
|
|
|
|
### Configuration Management
|
|
|
|
**ConfigManager** (`lib/src/config/config_manager.dart`):
|
|
- Loads from `config/xp_config.json`
|
|
- Manages XP multipliers, achievement definitions, focus bonuses
|
|
- Supports runtime configuration updates via web API
|
|
|
|
**Key Configuration Sections**:
|
|
- `xp_rewards` - Base multipliers and time-based modifiers
|
|
- `achievements` - Achievement definitions and rewards
|
|
- `level_system` - XP per level and max level
|
|
- `monitoring` - Polling intervals and thresholds
|
|
- `logging` - Log levels and file management
|
|
|
|
### Web Dashboard & API
|
|
|
|
**Dashboard Features**:
|
|
- Real-time stats display with WebSocket updates
|
|
- Activity timeline and XP breakdown charts
|
|
- Achievement gallery and progress tracking
|
|
- Application classification management
|
|
- Configuration editor
|
|
- Log viewer with filtering
|
|
|
|
**API Endpoints**:
|
|
- `GET /api/stats` - Current day statistics
|
|
- `GET /api/stats/history?days=7` - Historical stats
|
|
- `GET /api/achievements` - All achievements
|
|
- `GET /api/activities?limit=100` - Recent activities
|
|
- `GET /api/focus-sessions` - Focus session history
|
|
- `GET /api/xp-breakdown` - XP breakdown by activity type
|
|
- `GET /api/classifications` - Application classifications
|
|
- `POST /api/classifications` - Save application classification
|
|
- `GET /api/config` - Current configuration
|
|
- `POST /api/config` - Update configuration
|
|
|
|
**WebSocket Events**:
|
|
- `level_up` - Level progression notifications
|
|
- `achievement_unlocked` - Achievement notifications
|
|
- `stats_update` - Real-time stats updates
|
|
- `xp_breakdown_update` - XP distribution updates
|
|
- `focus_session_complete` - Focus session completions
|
|
|
|
### Flutter Dashboard Build System
|
|
|
|
**DashboardBuilder** (`lib/src/build/dashboard_builder.dart`):
|
|
- Builds Flutter dashboard from `../xp_dashboard` directory
|
|
- Copies built web files to `lib/src/web/static/`
|
|
- Accessible via `build` command while server is running
|
|
- Requires Flutter to be available in system PATH
|
|
|
|
## Testing Strategy
|
|
|
|
### Test Structure
|
|
- **Unit Tests**: Individual component testing with mocks
|
|
- **Integration Tests**: WebSocket and database integration
|
|
- **Simulation Tests**: Complete work day scenarios
|
|
- **Configuration Tests**: Hyprland config parsing
|
|
|
|
### Key Test Files
|
|
- `test/xp_nix_test.dart` - Main productivity monitor tests
|
|
- `test/websocket_integration_test.dart` - WebSocket functionality
|
|
- `test/simulation/` - Work day simulation scenarios
|
|
- `test/deep_idle_test.dart` - Idle detection edge cases
|
|
- `test/hyprland_config_parser_test.dart` - Configuration parsing
|
|
- `test/sway_integration_test.dart` - Sway window manager integration tests
|
|
|
|
### Testing Utilities
|
|
- `test/create_golden_db.dart` - Creates test database with sample data
|
|
- Time manipulation via `MockTimeProvider` for deterministic testing
|
|
- Activity simulation via `MockActivityDetector` for scenario testing
|
|
|
|
## System Requirements & Compatibility
|
|
|
|
### Window Manager Requirements
|
|
|
|
**Hyprland Environment**:
|
|
- `hyprctl` - Window management and querying
|
|
- `hypridle` - Idle detection and monitoring
|
|
- Environment: `$HYPRLAND_INSTANCE_SIGNATURE` must be set
|
|
|
|
**Sway Environment**:
|
|
- `swaymsg` - Window management and querying
|
|
- `swayidle` - Idle detection and monitoring
|
|
- Environment: `$SWAYSOCK` must be set
|
|
|
|
**Optional Dependencies**:
|
|
- `notify-send` - Desktop notifications (both window managers)
|
|
- `mako` or `dunst` - Enhanced notification daemons (Sway)
|
|
|
|
### Feature Comparison
|
|
|
|
| Feature | Hyprland | Sway | Notes |
|
|
|---------|----------|------|-------|
|
|
| Activity Detection | ✅ | ✅ | Uses `hyprctl` vs `swaymsg` |
|
|
| Idle Monitoring | ✅ | ✅ | Uses `hypridle` vs `swayidle` |
|
|
| Visual Enhancements | ✅ | ❌ | Disabled by design for Sway |
|
|
| Desktop Theming | ✅ | ❌ | Config modifications disabled |
|
|
| Notifications | ✅ | ✅ | Level-up and achievement alerts |
|
|
| WebSocket API | ✅ | ✅ | Full dashboard functionality |
|
|
| Database Tracking | ✅ | ✅ | Identical functionality |
|
|
|
|
### Runtime Detection
|
|
|
|
The system automatically detects your window manager at startup:
|
|
|
|
1. **Environment Variables**: Checks `$HYPRLAND_INSTANCE_SIGNATURE` and `$SWAYSOCK`
|
|
2. **Process Detection**: Falls back to checking available commands
|
|
3. **Graceful Degradation**: Uses appropriate implementations or fallbacks
|
|
|
|
## Development Workflow
|
|
|
|
### Initial Setup
|
|
1. `dart pub get` - Install dependencies
|
|
2. `dart run bin/xp_nix.dart` - Start server (auto-detects window manager)
|
|
3. Visit `http://localhost:8080` for dashboard
|
|
|
|
### Making Changes
|
|
1. Run tests: `dart test`
|
|
2. Check analysis: `dart analyze`
|
|
3. Test with custom database: `dart run bin/xp_nix.dart --db test.db`
|
|
4. Build dashboard: Use `build` command at runtime command `flutter build web` in `../xp_dashboard`
|
|
|
|
### Configuration Changes
|
|
- Edit `config/xp_config.json` for XP rules and achievements
|
|
- Use `refresh` command to reload configuration
|
|
- Test theme changes with `test [level]` command
|
|
- Use `restore` command if desktop theme issues occur
|
|
|
|
## Roadmap Integration
|
|
|
|
The project roadmap includes ambitious enhancements:
|
|
- **Cursor-following XP numbers** - RPG-style floating damage numbers
|
|
- **Dual currency shop system** - XP points and real-world reward tokens
|
|
- **Enhanced celebrations** - Full-screen level-up animations
|
|
- **Environmental feedback** - Focus-based ambient changes
|
|
- **Real-world purchase integration** - Automated reward fulfillment
|
|
|
|
Current architecture supports these extensions through:
|
|
- Modular desktop enhancement system
|
|
- Extensible notification framework
|
|
- Configurable reward and achievement system
|
|
- Database schema designed for expansion
|