Skip to main content
ClaudeWave
Slash Command4.4k repo starsupdated 5d ago

obsidian-calendar

The obsidian-calendar command identifies gaps between commitments implied by vault notes and what actually appears on Google Calendar within a specified window (defaulting to this week). It scans project next-actions, dated deadlines, task board items, daily note commitments, and critical facts, then reports vault-implied items missing from the calendar and calendar events lacking vault context, proposing actions without modifying the calendar. Use this when you need to catch overlooked deadlines or commitments that exist in your notes but aren't yet scheduled.

Install in Claude Code
Copy
mkdir -p ~/.claude/commands && curl -fsSL https://raw.githubusercontent.com/eugeniughelbur/obsidian-second-brain/HEAD/commands/obsidian-calendar.md -o ~/.claude/commands/obsidian-calendar.md
Then start a new Claude Code session; the slash command loads automatically.

obsidian-calendar.md

Use the obsidian-second-brain skill. Execute `/obsidian-calendar $ARGUMENTS`:

One command for everything that touches the calendar, selected by the first word (the **mode**):

- `agenda [range]` - read the calendar and write an AI-first snapshot to the vault (read-only on the calendar).
- `reconcile [window]` - flag commitments the vault implies that are NOT on the calendar (read-only; flags, never writes events).
- `meeting [selector]` - turn a calendar event into a meeting note in the vault.
- `schedule <args>` - create or move a calendar event (the only mode that writes to the calendar).

If no mode word is given, infer it: a bare range word (`today`, `week`, `next-week`, a date) means `agenda`; otherwise ask which mode. Default with no argument at all: `agenda today`.

All modes require a Google Calendar MCP. The claude.ai connector exposes `mcp__claude_ai_Google_Calendar__list_calendars`, `list_events`, `get_event`, `create_event`, `update_event`, `suggest_time`; if your calendar MCP namespaces its tools differently, use that server's equivalents. If no calendar MCP is connected, say so clearly and stop - do not fall back to asking the user to paste their calendar.

Always start by reading `_CLAUDE.md` (folder conventions, working hours) and `CRITICAL_FACTS.md` (timezone) if they exist. If neither declares a timezone, default to the session timezone and note that as a caveat. Resolve every folder per `references/folder-map.md` (wiki-style paths shown below).

---

## Mode: agenda - read the calendar into a snapshot note

Range argument: `today` (default), `tomorrow`, `week` (current ISO week Mon-Sun), `next-week`, `YYYY-MM-DD`, or `YYYY-MM-DD..YYYY-MM-DD`.

1. Resolve the range against the user's current date; convert start/end to ISO 8601 (`YYYY-MM-DDTHH:MM:SS+/-HH:MM`) in the user's timezone, end bound exclusive at end-of-day local.
2. `list_calendars` once, pick the primary (`primary: true`). Accept `--calendars <id1>,<id2>` to include more; otherwise primary only.
3. `list_events` with `timeMin`, `timeMax`, `singleEvents: true`, `orderBy: "startTime"`; filter cancelled events client-side.
4. For each event capture verbatim: id, htmlLink, summary, start, end, location, description, hangoutLink/conferenceData URL, attendees (email + displayName + responseStatus), organizer, status, recurringEventId.
5. Cross-link attendees against the entities folder (resolved per `references/folder-map.md`): match by full name then email local-part, fuzzy (handle missing diacritics/short forms). Found -> `[[Person Name]]`; not found -> plain name + `(unknown person)`.
6. Detect quality issues: **conflicts** (overlapping intervals on one calendar), **back-to-back stretches** (3+ with no gap), **focus gaps** (working-hours blocks 09:00-18:00 local unless overridden, with no meeting), **externally-organized events** (organizer domain != user's).
7. Write the snapshot (`type: agenda-snapshot`, schema in `references/ai-first-rules.md`) to the agenda folder (resolved per `references/folder-map.md` - wiki-style `wiki/agenda/`, Obsidian-style `Agenda/`): single day `YYYY-MM-DD - <today|tomorrow|day>.md`, week `YYYY-MM-DD - week.md` (Monday prefix), range `YYYY-MM-DD - range.md` (start prefix). If one exists for the range, overwrite it (the calendar is the source of truth) and add `superseded-at: <previous fetched-at>`. The `## For future agent` preamble must state the calendar is the source of truth, not this note, and `fetched-at` is the recency anchor. Body: `## Range`, `## Summary`, `## Events` (one `### YYYY-MM-DD - <Weekday>` subsection per day; each event a bullet with start-end, title, `[[attendees]]`, location, conference link verbatim, and `event-id: <id>` so other modes can locate it), then `## Conflicts` / `## Focus blocks` / `## External organizers` only if present.
8. Append to the operation log (`Logs/YYYY-MM-DD.md` if the vault uses a `Logs/` folder - create today's file if needed - else `log.md`): `## [<iso>] agenda | <range-label> - <event-count> events, <conflict-count> conflicts`. Inject (do not overwrite) a `## Calendar` link into today's daily note.
9. Report: snapshot path, events per day, conflicts/back-to-back/focus blocks, external organizers, and any `(unknown person)` attendees. Do not paraphrase event titles or infer attendees. If the range is empty, still write the snapshot (`event-count: 0`).

---

## Mode: reconcile - what the vault expects that the calendar doesn't show

Window argument: `today`, `this week` (default), `this month`. Flag only - never add, move, or change events.

1. Pull the calendar for the window (primary calendar, list events with times).
2. Gather what the vault implies for the same window by listing and grepping (never from memory): active project `next_action`s and dated deadlines; tasks/board items due in the window; commitments in recent daily notes and captures (appointments, calls, travel, filing deadlines, birthdays); fixed dates from `CRITICAL_FACTS.md`.
3. Reconcile in two directions: **vault-implied, not on the calendar** (the headline - state the item, its `[[source note]]`, and date/urgency) and **on the calendar, no vault context** (lighter - events that might warrant a prep note or project link).
4. **Flag only.** For each gap propose an action ("add a hold?", "needs a prep note?") but do not touch the calendar - hard boundary.
5. Offer to record the reconciliation in today's daily note (inject, do not overwrite); on request, add tasks for items the user intends to act on.

---

## Mode: meeting - turn a calendar event into a meeting note

Selector argument: `last` (most recent past event, default), `next` (next upcoming), `today` (list and ask), `event-id:<id>`, or a fuzzy event title (search now +/- 14d, show top 3, confirm).

1. Resolve the event: `last` -> `list_events` timeMin now-7d..now, take last whose `end` is past; `next` -> now..now+14d, take first; `today` -> list and ask (do not guess); `event-id:` -> `get_event`; fuzzy ->