This repo stores an AI agent skill for Apple Reminders.app on macOS.
The public interface is scripts/commands.
scripts/applescripts stores internal AppleScript backends and dictionary-aligned coverage.
npx skills add vinitu/apple-reminders-skillOr with skills.sh:
skills.sh add vinitu/apple-reminders-skillThe installed global skill directory is usually ~/.agents/skills/macos-reminders.
skills check and skills update may refer to the upstream package name apple-reminders.
Run skill actions with:
scripts/commands/<entity>/<action>.sh [args...]Output rules:
- Commands return JSON by default unless noted otherwise.
scripts/commands/account/show.shandscripts/commands/list/show.shopen the Reminders UI and return JSON like{"shown": true, ...}.scripts/commands/reminder/show.shis not part of the public interface.--jsonis not supported.--plainis not supported.--format=plain|jsonis not supported.
scripts/commands/account/*-> AppleScript inscripts/applescripts/account/*scripts/commands/list/*-> AppleScript inscripts/applescripts/list/*scripts/commands/reminder/*-> optionalremindctlfast path; required fallback is AppleScript + ReminderKit
scripts/applescripts is internal. Do not call it directly from the skill instructions.
- macOS Reminders.app
jq- Reminder commands: AppleScript + ReminderKit are the required functional backend
remindctlis optional and used only as a fast path when it is available and healthy- Account and list command wrappers also use
jqto produce JSON - ReminderKit is compiled from
scripts/tools/reminderkit_helper.mduringmake compileor on first use
Check remindctl access with remindctl status or /opt/homebrew/bin/remindctl status.
remindctl statusA clean macOS install does not include remindctl; the skill still works through AppleScript + ReminderKit.
Backend policy:
remindctlonly accelerates reminder commands- Missing
remindctlmust not break the public reminder interface - Failing
remindctlcalls must fall back to AppleScript + ReminderKit urgentand nested reminder operations are implemented through ReminderKit, not throughremindctl
AGENTS.md- repo rules for future agents.SKILL.md- the main skill workflow and command reference.Makefile- helper commands for dictionary dump, compile, and tests.scripts/commands/- public shell command interface.scripts/applescripts/- internal AppleScript backends in<entity>/<action>.applescriptformat.scripts/tests/- live integration checks.
Account:
scripts/commands/account/list.shscripts/commands/account/get.shscripts/commands/account/search.shscripts/commands/account/show.shscripts/commands/account/default-account.shscripts/commands/account/default-list.sh
List:
scripts/commands/list/list.shscripts/commands/list/create.shscripts/commands/list/show.shscripts/commands/list/edit.shscripts/commands/list/delete.shscripts/commands/list/search.shscripts/commands/list/get.shscripts/commands/list/exists.sh
Reminder:
scripts/commands/reminder/list.shscripts/commands/reminder/count.shscripts/commands/reminder/today.shscripts/commands/reminder/overdue.shscripts/commands/reminder/upcoming.shscripts/commands/reminder/due-before.shscripts/commands/reminder/due-range.shscripts/commands/reminder/today-or-overdue.shscripts/commands/reminder/create.shscripts/commands/reminder/get.shscripts/commands/reminder/get-by-id.shscripts/commands/reminder/edit.shscripts/commands/reminder/edit-by-id.shscripts/commands/reminder/reschedule.shscripts/commands/reminder/reschedule-by-id.shscripts/commands/reminder/delete.shscripts/commands/reminder/delete-by-id.shscripts/commands/reminder/complete.shscripts/commands/reminder/move.shscripts/commands/reminder/move-by-id.shscripts/commands/reminder/exists.shscripts/commands/reminder/search.sh
Not published:
scripts/commands/reminder/show.sh
scripts/commands/account/list.sh
scripts/commands/account/default-list.sh
scripts/commands/list/create.sh "Errands"
scripts/commands/list/get.sh "Inbox" id
scripts/commands/reminder/today.sh
scripts/commands/reminder/create.sh "Inbox" "Buy milk" "2 liters" --priority high
scripts/commands/reminder/create.sh "Inbox" "Buy milk" --flagged
scripts/commands/reminder/create.sh "Inbox" "Buy milk" --urgent
scripts/commands/reminder/create.sh "Inbox" "Buy milk" --parent-id "PARENT-ID"
scripts/commands/reminder/get.sh --id "REMINDER-ID" body
scripts/commands/reminder/get.sh --id "REMINDER-ID" flagged
scripts/commands/reminder/get.sh --id "REMINDER-ID" urgent
scripts/commands/reminder/edit.sh --id "REMINDER-ID" body "3 liters"
scripts/commands/reminder/edit.sh --id "REMINDER-ID" flagged true
scripts/commands/reminder/edit.sh --id "REMINDER-ID" urgent true
scripts/commands/reminder/edit.sh --id "REMINDER-ID" parent_id "PARENT-ID"
scripts/commands/reminder/edit.sh --id "REMINDER-ID" parent_id missing
scripts/commands/reminder/search.sh flagged "Inbox"
scripts/commands/reminder/search.sh urgent "Inbox"
scripts/commands/reminder/search.sh nested "Inbox"
scripts/commands/reminder/reschedule.sh --id "REMINDER-ID" "2030-01-15"
scripts/commands/reminder/complete.sh --id "REMINDER-ID"
scripts/commands/reminder/delete.sh --id "REMINDER-ID"- Public reminder identity is the reminder UUID or a unique UUID prefix.
- Canonical reminder read and write commands use
--id. - Public reminder fields:
idnamelistbodycompletedprioritydue_dateflaggedurgentparent_idparent_name
- Public priority values:
nonelowmediumhigh
exists.shreturns{"exists": false, "id": null}when a reminder is not found.- Nested reminder metadata is public through
parent_idandparent_name. - Nested reminder writes are public through
create.sh --parent-idandedit.sh parent_id. - Detaching a subtask with
edit.sh --id ... parent_id missingmay return a new reminder UUID because the fallback lifts the subtask to top level and deletes the old child. urgentis public and is backed by ReminderKit, not by AppleScript orremindctl.
These reminder features are not part of the public interface:
showcontainercreation_datemodification_datecompletion_dateallday_due_dateremind_me_date- AppleScript reminder IDs
make compile
make testmake test runs live smoke checks against Reminders.app and expects working Reminders automation access. remindctl is optional.