4.4 KiB
4.4 KiB
name, description
| name | description |
|---|---|
| remind | Create recurring reminders for tasks. Use when the user wants to set up a reminder for something they need to do regularly, or when they mention tasks they keep forgetting. Also handles listing and removing reminders. Triggers on words like "remind", "reminder". |
Remind
Create, list, and manage recurring reminders for tasks.
CRUD Script
All mutations to reminder.yaml go through scripts/remind_edit.py (paths in this skill are relative to the skill directory).
Run via: uv run scripts/remind_edit.py <subcommand>
Subcommands:
list— prints JSON{"reminders": [...]}.add --text "..." --cron "EXPR" [--cron "EXPR"]— add recurring reminder; validates cron syntax.add --text "..." --at "ISO_DATETIME" [--at "ISO_DATETIME"]— add one-time reminder(s);--atis repeatable.add --text "..." --at "ISO" --cron "EXPR"— combine one-time and recurring times in one entry.add --text "..." --random-times-per-day N --random-window "HH:MM-HH:MM" [--random-days "1-5"] [--random-from "YYYY-MM-DD"] [--random-until "YYYY-MM-DD"]— random but deterministic times: firesNtimes per day at random moments inside the window. Use when the user wants something a few times a day without a fixed clock time (e.g. "remind me to drink water a few times during the day").--random-daysis a cron day-of-week filter;--random-from/--random-untilbound the active period. Minimum gap between fires is a fixed constant inscripts/random_times.py. Combinable with--at/--cron.remove --keyword "..."— removes by case-insensitive substring match. Returns error JSON if 0 or >1 matches.
All outputs are JSON. Errors go to stderr with non-zero exit code.
Create Workflow
- Identify the task — What does the user want to be reminded about? If unclear, ask.
- Check for duplicates — Run
remind_edit.py listand compare existing reminder texts against the new one. If a similar reminder already exists:- Show the user the existing reminder
- Ask whether they really want a duplicate, or want to modify the existing one
- Only proceed if the user explicitly confirms
- Determine frequency — Ask how often the reminder should fire. Suggest common options:
- Every N minutes/hours/days
- Specific time of day (e.g. "every weekday at 9am")
- Specific day of week/month
- One-time at a specific datetime
- A few times a day at random moments (use the
--random-*flags)
- Create the cron expression(s) or
atfield — Map user input to cron syntax for recurring reminders, or ISO datetime for one-time reminders. - Add via script — Run a single
addcall combining all times (see CRUD Script for the exact flags). Never calladdmultiple times for the same task — put all times into one call. - Confirm — Show the user what was created (text, schedule).
List Workflow
- Run
uv run remind_edit.py listand parse the JSON output. - Present all reminders in a table with columns: number, task, schedule.
- Convert each schedule to human-readable text in the user's language (e.g. "every day at 9:00", "every Tuesday at 9:00"). For a
randomblock, describe it like "5× a day at random between 9:00–21:00, Mon–Fri" (includedays/from/untilonly if present). - If
remindersis empty, say so.
Remove / Done Workflow
- Run
uv run remind_edit.py remove --keyword "...". - If exit code is non-zero, read the error JSON:
"no match"→ tell the user no reminder matches the keyword."ambiguous"→ show the matches and ask the user to be more specific.
- If success, confirm what was removed.
Rules
- Respond to the user in their own language (e.g. Czech) — this skill is written in English, but user-facing messages adapt to the user's language.
- Never edit
reminder.yamldirectly — noedit_file,write_file, or any direct write. All mutations go exclusively throughscripts/remind_edit.py. - Read via the
listsubcommand — never read the YAML file directly; alwaysremind_edit.py list. - Always confirm the reminder text and frequency with the user before creating.
- When listing, always show a human-readable schedule.
- Completed or removed reminders are deleted from
reminder.yamlentirely — nodonefield, nostatusfield. - Timezone is always
Europe/Pragueunless the user explicitly requests otherwise.