
calendar-event-manager
user wants to create a macOS Calendar event with sound alarms and paired Reminders, schedule a meeting, RSVP to an invitation, or set reminders.
- Installs
- 213
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/terrylica/cc-skills --skill calendar-event-manager- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads calendar-event-manager automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Calendar Event Manager
Create macOS Calendar events with tiered sound alarms and paired Reminders so events are never missed across Mac and iOS.
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
CRITICAL RULES (Hard-Learned Truths 2026-02-12)
These rules are NON-NEGOTIABLE. Violating any of them defeats the purpose of this skill.
1. Calendar + Reminders ALWAYS Together
Every event MUST create BOTH:
- Calendar event with multiple
sound alarmentries (custom sound per tier) - Reminders (3 minimum) as a separate notification channel
Never create one without the other.
2. Use sound alarm, NOT display alarm
-- CORRECT: audible alert with custom sound
make new sound alarm at end of sound alarms with properties {trigger interval:-60, sound name:"Glass"}
-- WRONG: silent visual banner only
make new display alarm at end of display alarms with properties {trigger interval:-60}
Each alarm supports its own sound name property. Use DIFFERENT sounds for different tiers so the user knows which alert level it is by sound alone.
3. ONLY Long Sounds (>= 1.4 seconds)
Short sounds get missed and ignored. NEVER use sounds under 1.4 seconds.
APPROVED sounds only:
| Sound | Duration | Use For |
|---|---|---|
| Funk | 2.16s | At event time (loudest) |
| Glass | 1.65s | 1 hour before |
| Pop | 1.63s | Morning-of / 3 hrs before |
| Sosumi | 1.54s | Day-before |
| Ping | 1.50s | 30 min before |
| Submarine | 1.49s | Alternative |
| Blow | 1.40s | Gentle early reminder |
BANNED sounds: Hero, Basso, Bottle, Purr, Frog, Morse, Tink (all < 1.4s)
4. Multiple Early Reminders Are Mandatory
Calendar accepts at most 5 alarms per event (verified 2026-08-17 on a CalDAV calendar: adding a 6th silently evicts an earlier one, with no error). Budget the 5 slots deliberately and do NOT spend one duplicating a Reminder that already fires at the same moment.
Default alarm tiers:
| Tier | Trigger | Calendar Sound | Reminder |
|---|---|---|---|
| 1 day before | -1439 min | Blow | "TOMORROW: ..." |
| Night before | -720 min | Sosumi | — |
| 1 hour before | -60 min | Glass | (via Calendar) |
| 30 min before | -30 min | Ping | (via Calendar) |
| At event time | 0 min | Funk | Due-time reminder |
Plus 3 Reminders: "TOMORROW:" (day before, 9 AM), "TODAY:" (morning-of), and the due-time one.
Use -1439, never -1440. An exact 1440-minute (24 h) offset is silently dropped by Calendar — the alarm simply does not appear on read-back. Verified twice on 2026-08-17.
-1439persists.
Early-morning events (before ~9:30 AM)
The default tiers misfire for early events. Adjust:
- The morning-of 9 AM Reminder fires after an 08:30 event. Move it to ~90 min before the event instead.
- A -180 min tier on an 08:30 event rings at 05:30, waking the user three hours early. Drop it; use the night-before -720 tier instead.
5. macOS Notification Settings Prerequisite
Calendar notifications must be enabled in System Settings:
- System Settings > Notifications > Calendar > Allow Notifications = ON
- Alert style = Banners or Alerts
- Play sound = ON
Open with: open "x-apple.systempreferences:com.apple.Notifications-Settings.extension"
TodoWrite Task Templates
Template A: Create Event from Invitation
1. Extract event details (title, date, time, location, notes, RSVP)
2. Create Calendar event with 5-tier sound alarms (Blow, Sosumi, Glass, Ping, Funk)
3. Create 3 Reminders (TOMORROW, TODAY morning, due-time)
4. Verify event and reminders created
5. Report full schedule to user
Template B: Create Event from User Description
1. Ask user for: event name, date/time, duration, location
2. Create Calendar event with 5-tier sound alarms (max Calendar allows)
3. Create 3 Reminders
4. Verify event and reminders created
5. Report full schedule to user
Template C: Test Notification Setup
1. Create test Calendar event 3 min in future with sound alarms (1 min, 2 min tiers)
2. Create test Reminder 2 min in future
3. Wait for user confirmation of notifications
4. Clean up test event and reminders
AppleScript Date Construction (CRITICAL)
NEVER use date "STRING" in AppleScript. String-based date parsing is locale-dependent and silently produces wrong results:
| Anti-pattern | What happens | Example |
|---|---|---|
date "April 1, 2026 at 6:00:00 PM" | On 24h systems, "PM" is ignored → 06:00 | 4 failures in personal session |
date "2026-04-01 18:00:00" | ISO parsed as individual numbers → year 12169 | 1 failure |
set month before set day to 1 | Day 31 + April (30 days) → rolls to May 1 | 1 failure |
ALWAYS use programmatic date construction:
-- Build date safely: day-first-then-month prevents rollover
set d to current date
set day of d to 1 -- safe floor FIRST (prevents month rollover)
set month of d to April
set year of d to 2026
set day of d to 1 -- now set actual target day
set hours of d to 18 -- 24h format, no AM/PM ambiguity
set minutes of d to 0
set seconds of d to 0
Calendar Discovery (run first)
tell application "Calendar"
set output to ""
repeat with c in calendars
set output to output & name of c & " (writable:" & writable of c & ")" & linefeed
end repeat
output
end tell
Use the first writable:true calendar. Never assume "Home" or "Calendar" exists.
Full Event Creation (Copy-Paste Ready)
tell application "Calendar"
-- Build start date programmatically
set startDate to current date
set day of startDate to 1
set month of startDate to MONTH_CONSTANT
set year of startDate to YEAR_INT
set day of startDate to DAY_INT
set hours of startDate to HOUR_24
set minutes of startDate to 0
set seconds of startDate to 0
-- Build end date (1 hour later)
set endDate to startDate + 1 * hours
tell calendar "WRITABLE_CALENDAR_NAME"
set newEvent to make new event with properties {summary:"EVENT_NAME", start date:startDate, end date:endDate, location:"LOCATION", description:"NOTES"}
tell newEvent
-- EXACTLY 5 alarms: a 6th silently evicts one of these.
-- -1439 not -1440: an exact 24h offset is silently dropped.
make new sound alarm at end of sound alarms with properties {trigger interval:-1439, sound name:"Blow"}
make new sound alarm at end of sound alarms with properties {trigger interval:-720, sound name:"Sosumi"}
make new sound alarm at end of sound alarms with properties {trigger interval:-60, sound name:"Glass"}
make new sound alarm at end of sound alarms with properties {trigger interval:-30, sound name:"Ping"}
make new sound alarm at end of sound alarms with properties {trigger interval:0, sound name:"Funk"}
end tell
end tell
reload calendars
end tell
Verification (always run after creation)
Verification is NOT optional. Every failure logged in this file was silent — the create step returned success in all of them.
tell application "Calendar"
tell calendar "WRITABLE_CALENDAR_NAME"
set e to first event whose summary contains "EVENT_NAME"
set out to (summary of e) & " | " & (start date of e) & " -> " & (end date of e) & linefeed
-- Read BOTH classes: Calendar reports sound alarms back as display alarms.
set out to out & "alarms=" & ((count of display alarms of e) + (count of sound alarms of e)) & linefeed
repeat with a in display alarms of e
set out to out & " " & (trigger interval of a) & linefeed
end repeat
repeat with a in sound alarms of e
set out to out & " " & (trigger interval of a) & linefeed
end repeat
return out
end tell
end tell
Confirm the alarm COUNT and every trigger interval — do not just confirm the event exists. Dropped alarms are the most common silent failure.
Calendar AppleScript bridge limitations (verified 2026-08-17)
| Attempt | Result | Do this instead |
|---|---|---|
repeat with e in (every event whose summary …) | error -1728, "Can't get item 1" | Collect uid of (every event whose …) first, then delete/act per uid |
count of (every alarm of e) | syntax error -2741, no alarm class exists | Count display alarms + sound alarms separately |
delete (first display alarm whose …) | error -10000, AppleEvent handler failed | Individual alarms cannot be deleted — recreate the whole event |
delete display alarm <index> | error -10000 | Same: recreate the event |
Read back sound name of a created alarm | Reports 0 sound alarms, N display alarms | Expected. sound name persists at the EventKit level; create sound alarms anyway |
Paired Reminders Creation
NEVER use
default list. On this machine it resolves to an empty placeholder list literally namedDEFAULT_TASK_CALENDAR_NAME(an unsubstituted template string).make new reminder in (default list)returns success and writes nothing — a total silent failure. Discover the real list by name first and target it explicitly.
-- Discover lists FIRST; never assume.
tell application "Reminders"
set out to ""
repeat with l in lists
set out to out & name of l & " count=" & (count of reminders in l) & linefeed
end repeat
return out
end tell
tell application "Reminders"
-- Target the real list BY NAME (usually "Reminders"), not `default list`.
set targetList to list "Reminders"
-- Build date programmatically (same pattern as Calendar)
set eventDate to current date
set day of eventDate to 1
set month of eventDate to MONTH_CONSTANT
set year of eventDate to YEAR_INT
set day of eventDate to DAY_INT
set hours of eventDate to HOUR_24
set minutes of eventDate to 0
set seconds of eventDate to 0
-- CRITICAL: `copy`, not `set`. `set x to eventDate` ALIASES the same date
-- object, so mutating x silently rewrites eventDate too (this corrupted a
-- due-time reminder to 07:00 on 2026-08-17). `copy` makes a real clone.
copy eventDate to morningDate
set hours of morningDate to 7
set minutes of morningDate to 0
set seconds of morningDate to 0
copy eventDate to dayBefore
set dayBefore to dayBefore - 1 * days
set hours of dayBefore to 9
set minutes of dayBefore to 0
set seconds of dayBefore to 0
make new reminder in targetList with properties {name:"NOW: EVENT_NAME", due date:eventDate, body:"LOCATION" & linefeed & "NOTES"}
make new reminder in targetList with properties {name:"TOMORROW: EVENT_NAME", due date:dayBefore, body:"Event tomorrow! LOCATION"}
make new reminder in targetList with properties {name:"TODAY: EVENT_NAME", due date:morningDate, body:"Today! LOCATION"}
end tell
Note body: must use & linefeed & — a literal \n inside an AppleScript
string is the two characters backslash-n, not a newline.
Post-Change Checklist
After modifying this skill:
- Sound reference table matches sound-reference.md
- All 5 alarm tiers documented with correct sounds (Calendar caps at 5)
- BANNED sounds list is complete
- Hook file (
hooks/calendar-reminder-sync.ts) aligned with skill rules - AppleScript examples use
sound alarmnotdisplay alarm
References
- Sound Reference - Full sound duration data and approved/rejected lists
- Apple Calendar Scripting Guide
Post-Execution Reflection
After this skill completes, check before closing:
- Did the command succeed? — If not, fix the instruction or error table that caused the failure.
- Did parameters or output change? — If the underlying tool's interface drifted, update Usage examples and Parameters table to match.
- Was a workaround needed? — If you had to improvise (different flags, extra steps), update this SKILL.md so the next invocation doesn't need the same workaround.
Only update if the issue is real and reproducible — not speculative.
FAQ
What does the calendar-event-manager skill do?
user wants to create a macOS Calendar event with sound alarms and paired Reminders, schedule a meeting, RSVP to an invitation, or set reminders.
How do I install calendar-event-manager?
Run npx skills add https://github.com/terrylica/cc-skills --skill calendar-event-manager in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/calendar-event-manager/ (personal) or .claude/skills/calendar-event-manager/ (project).
Which AI agents can use calendar-event-manager?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is calendar-event-manager safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains calendar-event-manager?
It is published by terrylica in terrylica/cc-skills. It has 213 recorded installs.
More from terrylica/cc-skills
mise-tasks
terrylica/cc-skills
Orchestrate multi-step project workflows using mise task definitions with dependency management and argument handling. Use whenever the user.
pandoc-pdf-generation
terrylica/cc-skills
PDF generation from markdown via Pandoc/XeLaTeX. TRIGGERS - markdown for PDF, print document, pandoc
mql5-indicator-patterns
terrylica/cc-skills
MQL5 indicator development patterns. TRIGGERS - MQL5 indicator, OnCalculate, indicator buffers, MetaTrader 5.
python-logging-best-practices
terrylica/cc-skills
Python logging with loguru, structlog, and orjson. TRIGGERS - loguru, structlog, structured logging
gdrive-access
terrylica/cc-skills
Access Google Drive via CLI with 1Password OAuth: list files, download, and sync folders. TRIGGERS - google drive, gdrive, drive folder, download drive, sync drive.
Popular productivity & automation skills
agent-browser
vercel-labs/agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.
lark-doc
open.feishu.cn
飞书云文档(Docx / Wiki)内容操作:读取、创建、编辑文档,插入或下载图片附件,以及操作思维笔记。用户提供文档 URL/token(包括 doubao.com 的 /docx/、/wiki/)时使用;按 URL 路径/token 而非域名路由;/page/ 是妙搭应用,非飞书云文档。文档内嵌资源按读取参考中的统一规则分流。独立评论操作走 lark-drive;随正文读取评论使用 docs +fetch。表格或 Base 内部数据操作不在本 skill。
lark-base
open.feishu.cn
飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式(BaseApp/AppMode 页面与组件)、Workspace 目录、workflow、角色权限、模板中心(多维表格模板分类/列表/搜索);遇到 Base/多维表格/bitable、BaseApp/AppMode、/base/ 或 /app/ 链接时使用。BaseApp 不走 lark-apps;文件导入/导出转 lark-drive,认证/授权转 lark-shared。
lark-drive
open.feishu.cn
飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、查询权限设置、评论/权限/订阅、标题、版本、飞书文档密级标签(secure labels)和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token、判断链接类型/真实 token/标题,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。
lark-shared
open.feishu.cn
Use for lark-cli setup/auth tasks: auth login/status/logout, user vs bot identity, business-domain permissions (--domain, including all/docs/drive), missing scopes, revoking authorization, or handling notice JSON.
lark-im
open.feishu.cn
飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。