Installation
- Cursor (global)
- Cursor (project)
- Claude Code
- Other
Available in all projects:
What Your Agent Learns
| Category | Coverage |
|---|---|
| 7 Channels | Email, SMS, push, in-app inbox, Slack, Microsoft Teams, WhatsApp; each with deliverability rules, compliance requirements, and code examples |
| 5 Transactional Types | Authentication (OTP, password reset), orders, billing, appointments, account notifications; timing requirements, security rules, and templates |
| 6 Growth Types | Onboarding, adoption, engagement, re-engagement, referral, campaigns; consent requirements, frequency limits, and exit conditions |
| 10 Cross-Cutting Guides | Multi-channel routing, preferences, compliance (GDPR/TCPA/CAN-SPAM), reliability, batching, throttling, CLI usage, and reusable patterns |
How It Works
The skill is organized around a routing file (SKILL.md) that agents read first. Based on the task at hand, it directs the agent to read only the 1-2 files relevant to that task.
Each resource file follows a consistent structure:
- Quick Reference at the top with hard rules, common mistakes, and copy-paste templates
- Detailed guidance with explanations, examples, and edge cases
- Related links to other relevant files
Example: agent building an OTP flow
- Agent reads
SKILL.md, finds the routing table - Routing table says: OTP/2FA -> read
authentication.md+sms.md - Agent reads those two files, gets: 6-digit codes, 5-10 min expiry, SMS primary with email fallback, TCPA rules, idempotency key pattern, rate limits
- Agent generates code that follows all constraints
Code Examples
The skill includes TypeScript, Python, CLI, and curl examples for key patterns:Universal Rules
The skill enforces these constraints across all generated code:- Never send promotional content in transactional notifications
- Never batch or delay OTP, password reset, or security alerts
- Never send SMS without TCPA-compliant consent records
- Always use idempotency keys for transactional sends
- Always respect quiet hours (10pm-8am local) unless critical
- Always use
method: "single"unless the notification warrants all channels