Skip to main content

ralph/productivity/
mod.rs

1//! Productivity stats tracking for task completions, streaks, and velocity metrics.
2//!
3//! Responsibilities:
4//! - Track daily task completions and calculate streaks
5//! - Record milestone achievements (10, 50, 100, etc.)
6//! - Calculate velocity metrics (tasks per day/week)
7//! - Persist stats to `.ralph/cache/productivity.jsonc`
8//!
9//! Not handled here:
10//! - Queue/task management (see `crate::queue`)
11//! - Notification delivery (see `crate::notification`)
12//! - Celebration rendering (see `crate::celebrations`)
13//!
14//! Invariants/assumptions:
15//! - Stats file is JSON with schema version for migrations
16//! - Timestamps are RFC3339 format
17//! - All operations are atomic (read-modify-write with file locking)
18
19// Submodules
20mod calculations;
21mod date_utils;
22mod persistence;
23mod reports;
24mod types;
25
26#[cfg(test)]
27mod tests;
28
29// Re-export types
30pub use types::{
31    CompletedTaskRef, CompletionResult, DayStats, EstimationMetrics, Milestone,
32    ProductivityEstimationReport, ProductivityStats, ProductivityStreakReport,
33    ProductivitySummaryReport, ProductivityVelocityReport, SessionSummary, StreakInfo,
34    TaskEstimationPoint, VelocityMetrics,
35};
36
37// Re-export persistence functions
38pub use persistence::{load_productivity_stats, save_productivity_stats};
39
40// Re-export calculation functions
41pub use calculations::{
42    calculate_estimation_metrics, calculate_velocity, mark_milestone_celebrated, next_milestone,
43    record_task_completion, record_task_completion_by_id, update_streak,
44};
45
46// Re-export report functions
47pub use reports::{
48    build_estimation_report, build_streak_report, build_summary_report, build_velocity_report,
49    format_duration, print_estimation_report_text, print_streak_report_text,
50    print_summary_report_text, print_velocity_report_text,
51};
52
53// Re-export date utilities for advanced use cases
54pub use date_utils::{date_key_add_days, format_date_key, parse_date_key, previous_date_key};