minutes-prep
The minutes-prep Claude Code skill guides users through an interactive meeting preparation workflow that automatically searches conversation history with a specific contact and synthesizes relationship context and talking points. Use this when a user wants to prepare for an upcoming meeting by asking about prepping for a call, requesting meeting preparation, or asking what to discuss with someone before meeting them.
git clone --depth 1 https://github.com/silverstein/minutes /tmp/minutes-prep && cp -r /tmp/minutes-prep/tooling/skills/goldens/claude/minutes-prep ~/.claude/skills/minutes-prepSKILL.md
# /minutes-prep
Interactive meeting preparation that searches the normal conversation history
authorized by Minutes, synthesizes a relationship brief, and produces talking
points — before you walk into the room. Restricted history is excluded from
this agent workflow by default and must never be treated as absent evidence.
## How it works
This is a multi-phase interactive flow, not a single command. Walk the user through each phase using AskUserQuestion, pushing back on vague answers.
### Phase 0: Calendar auto-detect (optional, runs first)
Before asking who the user is meeting with, check if upcoming meetings are available from any calendar source. Try these in order — use the first that works:
**1. Google Calendar MCP** (best — most Minutes users have Claude + MCP):
If `mcp__claude_ai_Google_Calendar__gcal_list_events` is available, query today's remaining events:
```
gcal_list_events(
timeMin: "<now ISO, e.g. 2026-03-19T14:00:00>",
timeMax: "<end of day, e.g. 2026-03-19T23:59:59>",
condenseEventDetails: false
)
```
Do NOT hardcode a timezone — omit the `timeZone` parameter so the MCP uses the user's calendar default. This returns attendees, event titles, and times. Parse the results to find the next upcoming meeting with other people (skip all-day events and events with no attendees).
**2. `gog` CLI** (if installed):
```bash
gog calendar list --today --json -a <account> 2>/dev/null
```
**3. Apple Calendar (osascript)** (every Mac, zero install):
```bash
osascript -e 'tell application "Calendar" to get {summary, start date} of (every event of every calendar whose start date >= (current date) and start date < ((current date) + 1 * days))'
```
**4. Microsoft 365 / Outlook (`m365` CLI)** (if installed):
First check if m365 is installed and whether it's logged in:
```bash
command -v m365 2>/dev/null && m365 status --output json 2>/dev/null
```
- **If not installed**: skip silently to the next source.
- **If installed but not logged in** (`status` returns `"Logged out"`): ask the user via AskUserQuestion:
> "I found the Microsoft 365 CLI (`m365`) but you're not logged in. Want me to start the login flow so I can pull your Outlook calendar?"
- If **yes**: run `m365 login --authType browser` and wait. Once done, proceed to fetch events below.
- If **no**: skip to the next source silently.
- **If installed and logged in**: fetch today's remaining events:
```bash
m365 outlook event list \
--userId "@meId" \
--startDateTime "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--endDateTime "$(date -u -d '+1 day' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v+1d +%Y-%m-%dT%H:%M:%SZ)" \
--output json 2>/dev/null
```
Only use the result if the command exits with code 0 and returns a non-empty JSON array. Parse the response:
- **Title**: `event.subject`
- **Start time**: `event.start.dateTime` (UTC — convert to local time for display)
- **Attendees**: `event.attendees[].emailAddress.name` (extract first names)
- **Skip if**: `event.isAllDay === true`, `event.isCancelled === true`, `event.attendees` is empty, or `event.start.dateTime` converted to **local** time is not today (the `now`..`now+24h` UTC window over-fetches so it never misses a local-today event near the UTC date boundary; this trims the next-day-local spillover)
**5. None available** — skip to Phase 1 and ask manually.
**If upcoming meetings are found:**
Present via AskUserQuestion: "I see you have these meetings coming up today:
- [time] — [title] with [attendees]
- [time] — [title] with [attendees]
Which one are you prepping for?"
Options: list each meeting + "None of these — I want to prep for something else"
If the user picks a meeting, auto-populate the person name and skip Phase 1. Pull attendee names from the calendar event directly.
**If no upcoming meetings or calendar unavailable:**
Silently skip to Phase 1. Don't error or apologize — just ask manually.
### Phase 1: Who are you meeting with?
If Phase 0 already identified the person, skip this phase.
Otherwise, ask via AskUserQuestion: "Who are you meeting with?"
**If the answer is specific** (a name like "Alex" or "Case"):
→ Check for learned aliases first:
```bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" aliases "<name>" 2>/dev/null
```
If aliases exist, search across every returned variant and merge the hits before deciding there is no history.
→ Search authorized normal meeting history:
```bash
minutes search "<name>" --limit 50
```
Also search common variations — first name, last name, nickname.
**If the answer is vague** ("the team", "everyone", "my usual meeting"):
→ Push back: "Be specific. Name one person who'll be in the room. I'll search the normal meeting history Minutes is authorized to use."
**If the answer is a topic** ("the pricing meeting", "the Q2 planning call"):
→ Adapt to topic-based prep:
```bash
minutes search "<topic>" --limit 20
```
Skip the relationship brief and go straight to a topic brief instead.
### Phase 2: Relationship brief
Treat search paths as hints, not capabilities. Reauthorize each selected normal meeting through `minutes get "<exact path>" --json`, require exit status 0, and use only its returned content. Never reopen a search path with the host `Read` tool. Build a relationship brief from those bounded native results:
**Meeting history:**
- Total meetings with this person, first and most recent dates
- Meeting frequency trend (increasing/decreasing/stable)
**Recurring topics:**
- Topics that come up across multiple meetings
- Topic trending: which topics are appearing MORE recently (↑) vs fading (↓)
- Flag any topic that appeared 3+ times in the last 2 weeks — "Something's on their mind"
**Open commitments:**
- Items YOU owe THEM (from `action_items` where assignee matches the user)
- Items THEY owe YOU (from `action_items` where assignee matches the other person)
- Flag any overdue items (due date in the past, status still `open`)
**Decision history:**
- Recent decisions involving thisFast non-interactive briefing before any meeting — auto-detects your next calendar event, pulls relationship history, surfaces open commitments, and produces a one-page brief in under 30 seconds. Use this whenever the user says "brief me", "give me a quick brief", "what's coming up", "background on my next call", "who am I meeting next", "brief me on Sarah", "I have a call in 10 min", "quick rundown", or right before walking into a meeting. Different from /minutes-prep — brief is the fast hook-fireable version that doesn't ask questions and doesn't set goals. Use brief when speed matters; use prep when the user wants to think hard about goals first.
Manage old recordings — find large files, archive old meetings, delete processed originals. Use when the user says "clean up recordings", "how much space are meetings using", "delete old recordings", "archive meetings", "manage meeting storage", or asks about disk space from minutes.
Post-meeting debrief — analyzes what happened, compares outcomes to your prep intentions, tracks decision evolution. Use when the user says "debrief", "what just happened in that meeting", "what did we decide", "debrief that call", "post-meeting", "what changed", or right after stopping a recording.
Policy-safe relationship rankings, commitments, aliases, person profiles, and topic research. Always use Minutes' bounded native CLI surfaces; never build or read a durable graph cache.
Surface recent voice memos and ideas captured from any device. Use when the user asks "what ideas did I have?", "what were my recent memos?", "what did I record while walking?", or wants to recall a captured thought.
Extract facts from meetings and update your knowledge base — person profiles, chronological log, and index. Use when the user asks "ingest my meetings", "update my knowledge base", "extract facts from meetings", "sync meetings to wiki", "backfill knowledge", or wants their PARA/Obsidian/wiki profiles updated from conversation data.
Health-check your meeting knowledge for contradictions, stale commitments, and decision conflicts. Use when the user asks "any conflicts in my meetings", "check for stale action items", "lint my meetings", "consistency check", "are there contradictions", or wants to audit their decision history.
List recent meetings and voice memos. Use when the user asks "what meetings did I have", "show my recent recordings", "any meetings today", "list my voice memos", or wants an overview of their meeting history. Also use when they need to find a specific meeting by browsing rather than searching.