skills/myday/SKILL.md
Daily productivity assistant. Shows today + tomorrow schedule, scans emails for meeting updates, creates/modifies/cancels events, schedules meetings with contacts. Triggers on "what's my day", "my schedule", "what's next", "myday", "schedule a meeting", "move my meeting", "cancel my event", "am I free at...", "what's my week".
npx skillsauth add asets-gobizit/claude-skills mydayInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Single-pane view of Danny's schedule across Zoho Calendar (which already syncs Google Calendar inbound) plus a 48-hour scan of work + personal email for meeting-related updates. Lets Danny read, create, modify, and cancel events with natural language.
Single source of truth for calendar: Zoho Calendar. Google Calendar events are synced into Zoho via Zoho's native Google integration, so the skill never calls a Google API.
| Key | Value |
|---|---|
| Timezone | Europe/Madrid |
| Display date format | DD/MM/YYYY |
| Display time format | HH:mm (24-hour) |
| Zoho Books org ID | 20100889648 |
| Zoho work mail (Himalaya) | zoho-danny ([email protected]) |
| Personal mail (Himalaya) | gmail ([email protected]) |
| Cached IDs file | C:\Users\dansk\.claude\projects\C--Users-dansk-Claude\memory\project_myday_setup.md |
The cached IDs file holds caluid (primary calendar) and accountId (Zoho Mail). Both are discovered on first use and reused thereafter.
There are two date formats. The skill always converts at the boundary:
| Layer | Format | Example | When |
|---|---|---|---|
| User-facing (read & write) | DD/MM/YYYY + HH:mm (24h) | 12/04/2026 15:00 | Everything Danny reads or types |
| Zoho API wire format | YYYYMMDD and YYYYMMDDTHHmmssZ | 20260412T150000Z | ONLY when calling ZohoCalendar_* MCP tools |
Rules — never violate:
DD/MM/YYYY. Never YYYY-MM-DD, never MM/DD/YYYY, never YYYYMMDD.HH:mm in Europe/Madrid local time.DD/MM/YYYY OR natural language ("tomorrow at 3pm" = 15:00, "next Monday at 10").date command output rather than guessing.Quick reference for the conversion:
12/04/2026 → API date: 2026041212/04/2026 15:00 Madrid (CEST = UTC+2) → API datetime: 20260412T130000Z12/04/2026 15:00 Madrid (CET = UTC+1) → API datetime: 20260412T140000ZThe first time the skill is invoked, the cached IDs file may not exist or may be incomplete. Bootstrap as follows:
project_myday_setup.md. If caluid and accountId are both present, skip to the requested feature.caluid is missing:
ZohoCalendar_getAllCalendar with {category: "own"}.isdefault: true or the one matching [email protected]).caluid to project_myday_setup.md.accountId is missing:
ZohoMail_getMailAccounts (no params).accountId to project_myday_setup.md.MEMORY.md if not already there.If MCP authorization is broken (token expired), tell Danny exactly which MCP server to reconnect in claude.ai (CRM-Activities-Engagement-MCP-Server) — don't keep retrying.
Trigger phrases (be generous in matching):
Daily summary:
Week view:
Next event:
Create:
Modify:
Delete:
Availability:
Calendar (today + 48h forward):
date if needed).YYYYMMDD.ZohoCalendar_getEventsInRange with {start: <today>, end: <today+2>}.DD/MM/YYYY + HH:mm.Email scan (48h back):
6. Scan Zoho Mail (last 48 h) via ZohoMail_SearchEmails for keywords: meeting, calendar, invite, confirmed, rescheduled, cancelled, postponed, agenda, call, zoom, teams, appointment, booking, reservation.
7. Scan Gmail in parallel via Himalaya CLI:
himalaya envelope list -a gmail --page-size 50 -o json "after <YYYY-MM-DD of 48h ago>"
Then filter envelopes whose subject contains any of the keywords above (case-insensitive). For deeper context on a hit, run himalaya message read -a gmail <id>.
8. Render output (tables + notes):
## Today — <Weekday>, DD/MM/YYYY
| Time | Event | Location | With |
|--------------|-----------------|----------|----------------|
| HH:mm–HH:mm | … | … | … |
## Tomorrow — <Weekday>, DD/MM/YYYY
| Time | Event | Location | With |
|--------------|-----------------|----------|----------------|
| … | … | … | … |
## <Day after tomorrow — Weekday>, DD/MM/YYYY ← only if events exist
| Time | Event | Location | With |
|--------------|-----------------|----------|----------------|
| … | … | … | … |
## Notes
- ⚠ Conflict: <details> ← only if events overlap
- 🟢 Free block: HH:mm–HH:mm (Xh) ← only if a gap > 1h exists in working hours
## Meeting-related ← only if meeting-related emails were found
| # | Source | Date | Subject | With (email) |
|---|--------|------|---------|--------------|
| 1 | Zoho/Gmail | DD/MM/YYYY | Subject line | from/to email of the person Danny is meeting with |
→ Extract the contact email from the `from` or `to` field of the envelope. For calendar updates/invites, the participant email is usually in the subject or the `from` field. Show it in the "With (email)" column.
→ **Time filter:** Only show meeting-related emails about meetings happening **today or in the next 2 days** (today + 48h forward). Past meetings (yesterday or earlier) are irrelevant — discard them.
→ Number each row sequentially starting from 1. Danny can reference rows by number to request removal or action.
## Action items ← only if actionable emails were found
| # | Source | Date | Subject | Details (sent to) |
|---|--------|------|---------|-------------------|
| 1 | Zoho/Gmail | DD/MM/YYYY | Subject line | Key detail + recipient email address (`to` field) |
→ Always include the `to` email address in the Details column so Danny knows which account received it.
→ Number each row sequentially starting from 1 (independent numbering from Meeting-related table). Danny can say "remove 3, 5" to drop rows.
If a section has nothing to show, omit it (don't print empty tables).
ZohoCalendar_getEventsInRange with the full range as YYYYMMDD.DD/MM/YYYY.now (Europe/Madrid).dateandtime.start and dateandtime.end in YYYYMMDDTHHmmssZ.ZohoCalendar_getUserBusySlots for that window. If conflict → warn and offer alternatives via ZohoCalendar_findTimeSlots.DD/MM/YYYY HH:mm format:
Create Title on DD/MM/YYYY at HH:mm–HH:mm with email1@…, email2@…?
ZohoCalendar_addEvent with:
{
"caluid": "<from cache>",
"title": "<title>",
"description": "<optional>",
"dateandtime": {
"start": "YYYYMMDDTHHmmssZ",
"end": "YYYYMMDDTHHmmssZ",
"timezone": "Europe/Madrid"
},
"attendees": [{"email": "..."}, ...]
}
DD/MM/YYYY HH:mm.ZohoCalendar_searchEvents with keywords from the request (search range = today − 7 days to today + 30 days unless Danny specified).DD/MM/YYYY HH:mm, ask which one.getUserBusySlots).Move Title from DD/MM/YYYY HH:mm to DD/MM/YYYY HH:mm?
ZohoCalendar_updateEvent with the event's uid, current etag, and updated dateandtime. Etag must come from the search result — never invent it.Cancel Title on DD/MM/YYYY at HH:mm? This cannot be undone.
ZohoCalendar_deleteEvent with uid, etag, caluid.DD/MM/YYYY or natural language).ZohoCalendar_getUserBusySlots for the requested window.findTimeSlots, all in DD/MM/YYYY HH:mm.When Danny mentions a person by name and we need their email:
ZohoBooks_list_contacts with organization_id: 20100889648, contact_name_contains: <name>.ZohoMail_listEmails last 50 messages, scan from field for the name.himalaya -a gmail envelope list --page-size 50 -o json, scan from field.Once resolved, optionally cache the name → email mapping to project_myday_setup.md for next time.
ZohoMail_SearchEmails or ZohoMail_listEmails + filter) AND Gmail (Himalaya CLI).[email protected] or @holisticcrm.co.il that are client support threads). These are handled separately and should never appear in the daily summary.Source, Subject, With (email). Extract the contact's email from the envelope from/to fields. For calendar invites/updates the participant is typically in from; for outbound meetings check to.Source, Subject, Details (sent to). Always append the to email address so Danny knows which mailbox received it.☀️ Good morning Danny — <Weekday>, DD/MM/YYYY
📅 TODAY
• HH:mm–HH:mm Event title (Location)
• HH:mm–HH:mm Event title
📅 TOMORROW
• HH:mm–HH:mm Event title
📬 MEETING-RELATED
• Subject — from [email protected] (Source)
📋 ACTION ITEMS
• Subject — key detail (sent to [email protected])
⚠️ Conflicts: None / details
🟢 Free: HH:mm–HH:mm (Xh block)
HH:mm, always DD/MM/YYYY.uid).DD/MM/YYYY HH:mm format in the confirmation prompt.C:\Users\dansk\.claude\projects\C--Users-dansk-Claude\memory\project_myday_setup.md — caluid, accountId, optional contact cache.C:\Users\dansk\.claude\projects\C--Users-dansk-Claude\memory\MEMORY.md — pointer line.C:\Users\dansk\Claude\Obsidian@Claude\MyDay Skill.md — Obsidian vault entry (dual-save rule).data-ai
Automated backup skill for PKA + Obsidian + Claude memory. Snapshots pka.db (via SQLite .backup so WAL is handled safely), the Obsidian vault, Claude memory files, agent profiles, and the help-content Excel into a single timestamped zip in Zoho WorkDrive. Daily/weekly/monthly retention rotation built in. USE WHEN Danny says "backup", "run backup", "snapshot pka", or to recover from a snapshot.
testing
Run any question, idea, or decision through a council of 5 AI advisors who independently analyze it, peer-review each other anonymously, and synthesize a final verdict. Based on Karpathy's LLM Council methodology, packaged as the stress-test skill. MANDATORY TRIGGERS: 'stress-test this', 'stress test this', 'pressure-test this', 'pressure test this', 'war room this', 'council this', 'run the council', 'debate this'. STRONG TRIGGERS (use when combined with a real decision or tradeoff): 'should I X or Y', 'which option', 'what would you do', 'is this the right move', 'validate this', 'get multiple perspectives', 'I can't decide', 'I'm torn between'. Do NOT trigger on simple yes/no questions, factual lookups, or casual 'should I' without a meaningful tradeoff (e.g. 'should I use markdown' is not a stress-test question). DO trigger when the user presents a genuine decision with stakes, multiple options, and context that suggests they want it pressure-tested from multiple angles.
content-media
Weekly scan of Obsidian vault for empty/low-content notes. Moves them to zToBeDeleted/ for user review. Use when the user says "tidy obsidian", "clean obsidian", "obsidian cleanup", or on scheduled weekly run.
development
Design-first website builder. Accepts a Claude Design export (HTML or screenshot) as a visual blueprint, collects business inputs, calls Claude API to generate a design-matched index.html, and publishes to GitHub Pages. Falls back to vibe-based generation if no design is provided. Use when the user says "make-website-design", "design website", "build from design", or provides a Claude Design export for website generation.