69 lines
3.1 KiB
SQL
69 lines
3.1 KiB
SQL
-- Mnemosyne schema
|
|
-- Apply once; all statements use IF NOT EXISTS so this is safe to re-run.
|
|
|
|
PRAGMA foreign_keys = ON;
|
|
PRAGMA journal_mode = WAL;
|
|
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
title TEXT NOT NULL,
|
|
notes TEXT,
|
|
class TEXT NOT NULL
|
|
CHECK(class IN ('monthly_date','monthly_weekday',
|
|
'every_n_period','interval','floating')),
|
|
active INTEGER NOT NULL DEFAULT 1,
|
|
|
|
-- monthly_date: fires on this day of every month.
|
|
-- Short-month rule: if day_of_month > last day of month, fire on last day.
|
|
day_of_month INTEGER,
|
|
|
|
-- monthly_weekday: fires on the Nth weekday of every month.
|
|
-- weekday: 0=Monday .. 6=Sunday (ISO weekday - 1)
|
|
-- ordinal: 1-4 for first-fourth; -1 for "last"
|
|
weekday INTEGER,
|
|
ordinal INTEGER,
|
|
|
|
-- every_n_period: fires every interval_n period_units after anchor_date.
|
|
-- Occurrences are calendar-anchored (not completion-driven).
|
|
interval_n INTEGER,
|
|
period_unit TEXT CHECK(period_unit IN ('day','week','month') OR period_unit IS NULL),
|
|
anchor_date TEXT, -- ISO date YYYY-MM-DD
|
|
|
|
-- interval: next due = last_completed_at + interval_days.
|
|
-- If never completed, seeds from created_at (so it doesn't scream overdue on day one).
|
|
interval_days INTEGER,
|
|
|
|
-- floating: no fixed date; reminder frequency driven by priority.
|
|
-- high → appears every day
|
|
-- medium → appears every medium_float_days (see config table, default 3)
|
|
-- low → appears roughly weekly; which low items show is randomised/rotated
|
|
-- Completing a floating task sets active=0 (archives it), since floating items
|
|
-- are typically one-and-done aspirations.
|
|
priority TEXT CHECK(priority IN ('high','medium','low') OR priority IS NULL),
|
|
|
|
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now')),
|
|
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS completions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
completed_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_completions_task_id ON completions(task_id);
|
|
|
|
-- Single-row key/value store for runtime-tunable settings.
|
|
-- Populated with defaults below; /settime and future commands update rows here.
|
|
CREATE TABLE IF NOT EXISTS config (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL
|
|
);
|
|
|
|
INSERT OR IGNORE INTO config (key, value) VALUES
|
|
('digest_time', '06:30'), -- local HH:MM, adjustable via /settime
|
|
('timezone', 'UTC'), -- overridden by mnemosyne.conf at startup
|
|
('last_digest_sent', ''), -- ISO date of last successful digest; guards against dupes
|
|
('upcoming_horizon', '7'), -- days forward shown in Upcoming section
|
|
('medium_float_days', '3'); -- how often medium-priority floating items surface
|