#!/usr/bin/env perl # print-digest — seeds a temporary in-memory database with sample tasks covering # all five task classes and every status bucket, then prints the Day at a Glance # digest to the terminal. No Telegram connection required. # # Reference date: 2026-06-04 (Thu) ← pinned so the output is reproducible. # Pass --date YYYY-MM-DD to use a different date. # # Usage: # perl scripts/print-digest # perl scripts/print-digest --date 2026-07-01 use strict; use warnings; use utf8; use open ':std', ':encoding(UTF-8)'; use FindBin qw($RealBin); use lib "$RealBin/../lib"; use DateTime; use Mnemosyne::DB; use Mnemosyne::Digest; # ---- reference date ------------------------------------------------------- my $ref_date_str = '2026-06-04'; while (@ARGV) { my $arg = shift @ARGV; if ($arg eq '--date' && @ARGV) { $ref_date_str = shift @ARGV } } $ref_date_str =~ /^(\d{4})-(\d{2})-(\d{2})$/ or die "Bad date: $ref_date_str\n"; my $TODAY = DateTime->new(year => $1+0, month => $2+0, day => $3+0); # ---- in-memory database --------------------------------------------------- my $db = Mnemosyne::DB->new(':memory:'); my $dbh = $db->dbh; # Helper: insert a task row, return its new id sub insert_task { my (%h) = @_; $dbh->do(q{ INSERT INTO tasks (title, notes, class, active, day_of_month, weekday, ordinal, interval_n, period_unit, anchor_date, interval_days, priority, created_at) VALUES (?,?,?,?, ?,?,?, ?,?,?, ?,?,?) }, undef, $h{title}, $h{notes}//'', $h{class}, $h{active}//1, $h{day_of_month}, $h{weekday}, $h{ordinal}, $h{interval_n}, $h{period_unit},$h{anchor_date}, $h{interval_days},$h{priority}, $h{created_at}//'2026-01-01T00:00:00Z', ); return $dbh->last_insert_id(undef,undef,'tasks',undef); } sub complete { # mark task done on a given date my ($task_id, $date_str) = @_; $dbh->do("INSERT INTO completions (task_id, completed_at) VALUES (?,?)", undef, $task_id, "${date_str}T12:00:00Z"); } # =========================================================================== # Seed data — all dates chosen relative to TODAY = 2026-06-04 (Thu) # # Jun 2026: Jun 1=Mon, Jun 4=Thu, Jun 6=Sat, Jun 8=Mon, Jun 11=Thu # May 2026: May 1=Fri, May 7=Thu, May 8=Fri, May 28=Thu # =========================================================================== # ── OVERDUE ───────────────────────────────────────────────────────────────── # monthly_date: fires on the 1st; Jun 1 was 3 days ago, no completion my $id1 = insert_task( title => 'Pay credit card', class => 'monthly_date', day_of_month => 1, notes => 'Autopay is off — do it manually', ); # interval: every 90 days from 2026-01-01 → due 2026-04-01, now 64 days overdue my $id2 = insert_task( title => 'Rotate tires', class => 'interval', interval_days => 90, created_at => '2026-01-01T00:00:00Z', ); # ── DUE TODAY (2026-06-04) ────────────────────────────────────────────────── # monthly_weekday: 1st Thursday of every month; May's was May 7 (completed), June's is Jun 4 my $id3 = insert_task( title => 'Weekly review', class => 'monthly_weekday', weekday => 4, # 4 = Thursday (DateTime: 1=Mon..7=Sun) ordinal => 1, ); complete($id3, '2026-05-07'); # completed last month's occurrence # interval: every 7 days; last done 2026-05-28 → next due 2026-06-04 my $id4 = insert_task( title => 'Backup servers', class => 'interval', interval_days => 7, ); complete($id4, '2026-05-28'); # ── UPCOMING ──────────────────────────────────────────────────────────────── # monthly_date: fires on the 8th; May 8 completed → Jun 8 is 4 days out my $id5 = insert_task( title => 'Pay rent', class => 'monthly_date', day_of_month => 8, ); complete($id5, '2026-05-08'); # every_n_period: anchor 2026-06-06 (future) → 2 days out; recurs weekly my $id6 = insert_task( title => 'Newsletter draft', class => 'every_n_period', interval_n => 1, period_unit => 'week', anchor_date => '2026-06-06', ); # every_n_period: anchor 2026-06-11 (future) → 7 days out; recurs weekly my $id7 = insert_task( title => 'Team meeting prep', class => 'every_n_period', interval_n => 1, period_unit => 'week', anchor_date => '2026-06-11', ); # ── FLOATING ──────────────────────────────────────────────────────────────── # id=8: low priority, created Jun 4 → days_since=0; (0+8)%7=1 → NOT shown (rotation) # id=9: low priority, created Jun 4 → days_since=0; (0+9)%7=2 → NOT shown # We want id=7 for a shown low item: (0+7)%7=0 → shown. # Insert order above gives us id 1-7 already used; next inserts get 8+. # So: insert a "shown low" task at a created_at where days_since makes it work. # days_since=6, id=8: (6+8)%7=0 → shown. created_at = Jun 4 - 6 days = May 29. my $id8 = insert_task( title => 'Learn Spanish', class => 'floating', priority => 'low', created_at => '2026-05-29T00:00:00Z', # days_since=6; (6+8)%7=0 → shown ); # medium: created Jun 1 → days_since=3; 3%3=0 → shown my $id9 = insert_task( title => 'Call parents', class => 'floating', priority => 'medium', created_at => '2026-06-01T00:00:00Z', ); # high: always shown my $id10 = insert_task( title => 'Plan summer vacation', class => 'floating', priority => 'high', ); # low task that is NOT shown today (demonstrates rotation) my $id11 = insert_task( title => 'Read more books', class => 'floating', priority => 'low', created_at => '2026-06-04T00:00:00Z', # days_since=0; (0+11)%7=4 → not shown ); # inactive task — should never appear insert_task( title => 'Old habit tracker', class => 'floating', active => 0, ); # =========================================================================== # Build and render # =========================================================================== my $digest = Mnemosyne::Digest->build($db, $TODAY); print Mnemosyne::Digest->render_text($digest); # Also dump a quick summary of what's hidden (for verification) print "\n[Hidden floating tasks — not shown today by rotation/frequency:\n"; my $all = $db->active_tasks; my $lc_map = $db->last_completions; for my $task (grep { $_->{class} eq 'floating' } @$all) { my $r = Mnemosyne::Schedule->resolve($task, $TODAY); if ($r->{status} eq 'not_relevant') { my $id = $task->{id}; my $created = substr($task->{created_at}, 0, 10); my $days_since = DateTime->compare( DateTime->new(year=>substr($created,0,4)+0, month=>substr($created,5,2)+0, day=>substr($created,8,2)+0), $TODAY ); # compute days_since manually my $cd = DateTime->new(year=>substr($created,0,4)+0, month=>substr($created,5,2)+0, day=>substr($created,8,2)+0); my $ds = int($TODAY->jd - $cd->jd); print " • $task->{title} (id=$id, priority=$task->{priority}, days_since=$ds, " . "show_check=" . (($ds + $id) % 7) . " mod 7)\n"; } } print "]\n";