|
| 1 | +--- |
| 2 | +name: proactive-reminders |
| 3 | +description: Set time-based reminders that deliver via chat when they come due. Supports natural language times ("next Tuesday at 9am"), recurrence (daily/weekly/weekdays/monthly), and cross-team reminders ("remind Sarah to send the proposal"). Use when someone says "remind me to...", "follow up on...", "ping me about...", or "set a reminder for [person]". |
| 4 | +--- |
| 5 | + |
| 6 | +# Proactive Reminders |
| 7 | + |
| 8 | +Go beyond static task lists — set reminders that **deliver themselves** at the right time via ~~chat. Supports natural language scheduling, recurrence, teammate reminders, and optional links to ~~CRM deals or ~~project tracker items. |
| 9 | + |
| 10 | +## Connectors |
| 11 | + |
| 12 | +| Connector | What It Adds | |
| 13 | +|-----------|-------------| |
| 14 | +| **~~chat** (required) | Delivers reminders as DMs when they come due | |
| 15 | +| **~~CRM** | Links reminders to deals for pipeline follow-up context | |
| 16 | +| **~~project tracker** | Links reminders to tasks/issues | |
| 17 | +| **~~calendar** | Cross-references with scheduled meetings | |
| 18 | + |
| 19 | +> **Minimum requirement:** A ~~chat connector is needed to deliver reminders. Without it, this skill can still help _draft_ reminders but cannot deliver them proactively. |
| 20 | +
|
| 21 | +--- |
| 22 | + |
| 23 | +## How It Works |
| 24 | + |
| 25 | +``` |
| 26 | +┌─────────────────────────────────────────────────────────────┐ |
| 27 | +│ PROACTIVE REMINDERS │ |
| 28 | +├─────────────────────────────────────────────────────────────┤ |
| 29 | +│ │ |
| 30 | +│ 1. PARSE Natural language → structured reminder │ |
| 31 | +│ "remind me to call Acme next Tuesday at 2pm" │ |
| 32 | +│ → who: me, what: call Acme, when: Tue 2:00 PM │ |
| 33 | +│ │ |
| 34 | +│ 2. VALIDATE Ensure the date is in the future │ |
| 35 | +│ ⚠️ If year looks wrong, auto-correct to current year │ |
| 36 | +│ ⚠️ If time is ambiguous, default to 9:00 AM │ |
| 37 | +│ │ |
| 38 | +│ 3. STORE Save to persistent storage │ |
| 39 | +│ → reminder table / file with: who, what, when, │ |
| 40 | +│ created_by, recurrence, deal/task link │ |
| 41 | +│ │ |
| 42 | +│ 4. DELIVER When time arrives, send via ~~chat │ |
| 43 | +│ → DM to the assigned person │ |
| 44 | +│ → Include context (deal name, task link) │ |
| 45 | +│ → Handle recurrence (create next occurrence) │ |
| 46 | +│ │ |
| 47 | +│ 5. MANAGE List, dismiss, reschedule │ |
| 48 | +│ → "show my reminders" → list upcoming │ |
| 49 | +│ → "cancel the Acme reminder" → dismiss │ |
| 50 | +│ → "push that to Friday" → reschedule │ |
| 51 | +│ │ |
| 52 | +└─────────────────────────────────────────────────────────────┘ |
| 53 | +``` |
| 54 | + |
| 55 | +--- |
| 56 | + |
| 57 | +## Usage |
| 58 | + |
| 59 | +### Setting Reminders |
| 60 | + |
| 61 | +When the user says "remind me to...", "follow up on...", "ping me about...", or "set a reminder for...": |
| 62 | + |
| 63 | +**1. Parse the request into structured fields:** |
| 64 | + |
| 65 | +| Field | Source | Default | |
| 66 | +|-------|--------|---------| |
| 67 | +| `message` | What to be reminded about | Required | |
| 68 | +| `remind_at` | When to deliver (ISO 8601 timestamp) | Required — parse from natural language | |
| 69 | +| `assigned_to` | Who gets the reminder | Current user | |
| 70 | +| `recurrence` | Repeat pattern | None | |
| 71 | +| `deal_id` / `task_id` | Linked item | None | |
| 72 | + |
| 73 | +**2. Parse natural language times:** |
| 74 | + |
| 75 | +| User says | Interpret as | |
| 76 | +|-----------|-------------| |
| 77 | +| "tomorrow at 2pm" | Next day, 2:00 PM in user's timezone | |
| 78 | +| "next Tuesday" | The upcoming Tuesday, 9:00 AM | |
| 79 | +| "Friday at 8am" | The upcoming Friday, 8:00 AM | |
| 80 | +| "in 2 hours" | Current time + 2 hours | |
| 81 | +| "end of day" | Today 5:00 PM | |
| 82 | +| "next week" | Next Monday, 9:00 AM | |
| 83 | +| "every weekday at 9am" | Recurrence: weekdays, starting tomorrow 9:00 AM | |
| 84 | + |
| 85 | +**3. Validate the timestamp:** |
| 86 | + |
| 87 | +⚠️ **Critical: Date validation.** AI models may generate timestamps with incorrect years (e.g., 2025 instead of 2026). Always validate: |
| 88 | + |
| 89 | +``` |
| 90 | +IF remind_at is in the past: |
| 91 | + TRY replacing year with current year |
| 92 | + IF now in the future → use corrected date |
| 93 | + TRY replacing year with current year + 1 |
| 94 | + IF now in the future → use corrected date (Dec→Jan edge case) |
| 95 | + ELSE → ask user to clarify |
| 96 | +``` |
| 97 | + |
| 98 | +This server-side validation prevents reminders from firing immediately due to year errors. |
| 99 | + |
| 100 | +**4. Confirm with the user:** |
| 101 | + |
| 102 | +> ✅ Reminder set for **Tuesday, Mar 25 at 2:00 PM**: "Call Acme about the proposal" |
| 103 | +
|
| 104 | +Always confirm with a human-readable date (not ISO format) so the user can verify at a glance. |
| 105 | + |
| 106 | +### Cross-Team Reminders |
| 107 | + |
| 108 | +When someone says "remind Sarah to..." or "ping Nick about...": |
| 109 | + |
| 110 | +- Set `assigned_to` to the named person |
| 111 | +- The reminder delivers to **both** the sender and recipient (group DM if possible via ~~chat) |
| 112 | +- Include attribution: "💬 Reminder from **Jackson**: Call Acme about the proposal" |
| 113 | + |
| 114 | +This turns reminders into a lightweight delegation tool. |
| 115 | + |
| 116 | +### Recurrence |
| 117 | + |
| 118 | +| Pattern | Behavior | |
| 119 | +|---------|----------| |
| 120 | +| `daily` | Repeats every day at the same time | |
| 121 | +| `weekly` | Repeats every 7 days | |
| 122 | +| `weekdays` | Mon-Fri only; skips Sat/Sun (Friday → Monday) | |
| 123 | +| `monthly` | Same day each month | |
| 124 | + |
| 125 | +When a recurring reminder is delivered: |
| 126 | +1. Mark the current occurrence as triggered |
| 127 | +2. Create the next occurrence with the appropriate offset |
| 128 | +3. For `weekdays`: if the next day is Saturday, skip to Monday |
| 129 | + |
| 130 | +### Listing Reminders |
| 131 | + |
| 132 | +When the user asks "what are my reminders?" or "show upcoming reminders": |
| 133 | + |
| 134 | +- Show upcoming (non-triggered, non-dismissed) reminders sorted by time |
| 135 | +- Group by: Today, Tomorrow, This Week, Later |
| 136 | +- Include: message, time (relative + absolute), recurrence badge, linked deal/task |
| 137 | +- Support filtering: "show team reminders" for all, "show Nick's reminders" for specific person |
| 138 | + |
| 139 | +### Dismissing / Rescheduling |
| 140 | + |
| 141 | +When the user says "cancel the Acme reminder" or "push that to Friday": |
| 142 | + |
| 143 | +- **Dismiss:** Mark as dismissed, confirm to user |
| 144 | +- **Reschedule:** Update `remind_at`, confirm new time |
| 145 | +- **Ownership check:** Only the assigned person or creator should be able to dismiss |
| 146 | + |
| 147 | +--- |
| 148 | + |
| 149 | +## Delivery Mechanism |
| 150 | + |
| 151 | +Reminders need a **background process** to check for due reminders and deliver them. Implementation options: |
| 152 | + |
| 153 | +### Option A: Cron / Scheduled Function (Recommended) |
| 154 | +Run a check every 5-15 minutes: |
| 155 | +``` |
| 156 | +1. Query: SELECT * FROM reminders WHERE remind_at <= NOW() AND triggered = false AND dismissed = false |
| 157 | +2. For each due reminder: |
| 158 | + a. Send DM via ~~chat to assigned_to |
| 159 | + b. Mark as triggered |
| 160 | + c. If recurring, create next occurrence |
| 161 | +3. Log delivery for analytics |
| 162 | +``` |
| 163 | + |
| 164 | +### Option B: Calendar Integration |
| 165 | +Create a ~~calendar event for each reminder. The calendar handles delivery natively. Trade-off: no recurrence control, clutters calendar. |
| 166 | + |
| 167 | +### Option C: Chat Scheduled Messages |
| 168 | +Use ~~chat's scheduled message API (e.g., Slack's `chat.scheduleMessage`). Trade-off: limited to single delivery, no recurrence, harder to manage. |
| 169 | + |
| 170 | +**Option A is recommended** because it supports recurrence, cross-team delivery, and integrates naturally with CRM/project-tracker links. |
| 171 | + |
| 172 | +--- |
| 173 | + |
| 174 | +## Storage Schema |
| 175 | + |
| 176 | +Reminders need persistent storage. Recommended schema: |
| 177 | + |
| 178 | +```sql |
| 179 | +CREATE TABLE reminders ( |
| 180 | + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), |
| 181 | + created_by text NOT NULL, -- who set the reminder |
| 182 | + assigned_to text NOT NULL, -- who gets reminded |
| 183 | + remind_at timestamptz NOT NULL, -- when to deliver |
| 184 | + message text NOT NULL, -- what to remind about |
| 185 | + deal_id uuid, -- optional ~~CRM link |
| 186 | + task_id text, -- optional ~~project tracker link |
| 187 | + recurrence text CHECK (recurrence IN ('daily', 'weekly', 'weekdays', 'monthly')), |
| 188 | + dismissed boolean NOT NULL DEFAULT false, |
| 189 | + triggered boolean NOT NULL DEFAULT false, |
| 190 | + created_at timestamptz NOT NULL DEFAULT now() |
| 191 | +); |
| 192 | + |
| 193 | +CREATE INDEX idx_reminders_pending |
| 194 | + ON reminders (remind_at) |
| 195 | + WHERE triggered = false AND dismissed = false; |
| 196 | +``` |
| 197 | + |
| 198 | +Alternative: For teams without a database, use a `REMINDERS.md` file (similar to how `task-management` uses `TASKS.md`), but note this cannot support background delivery. |
| 199 | + |
| 200 | +--- |
| 201 | + |
| 202 | +## Integration with task-management |
| 203 | + |
| 204 | +This skill complements `task-management`: |
| 205 | + |
| 206 | +| | task-management | proactive-reminders | |
| 207 | +|---|---|---| |
| 208 | +| **Purpose** | Track what needs doing | Ensure it gets done on time | |
| 209 | +| **Storage** | TASKS.md file | Database or file | |
| 210 | +| **Delivery** | User checks manually | Push notification at set time | |
| 211 | +| **Recurrence** | No | Yes | |
| 212 | +| **Cross-team** | No (single user) | Yes (remind teammates) | |
| 213 | +| **Time-based** | No | Yes | |
| 214 | + |
| 215 | +They work best together: use `task-management` for your backlog, use `proactive-reminders` for time-sensitive follow-ups. |
| 216 | + |
| 217 | +--- |
| 218 | + |
| 219 | +## Example Implementation |
| 220 | + |
| 221 | +See [Dyrt's standup bot](https://github.com/dyrt-labs/standup-bot) for a production implementation that includes: |
| 222 | +- Natural language parsing via Claude → ISO timestamp |
| 223 | +- Server-side year auto-correction (handles AI model date errors) |
| 224 | +- 15-minute cron delivery via Cloudflare Workers |
| 225 | +- Slack DM delivery with group DM for cross-team reminders |
| 226 | +- Supabase PostgreSQL storage with the schema above |
| 227 | +- Recurrence handling (daily/weekly/weekdays/monthly) |
| 228 | +- CRM deal linking for sales follow-up context |
| 229 | +- Dashboard UI for viewing and managing reminders |
| 230 | + |
| 231 | +Built by an 11-person waste management team running their entire CRM and operations stack on Claude Cowork + MCP tools. |
0 commit comments