Skip to main content
ClaudeWave
Skill1.3k estrellas del repoactualizado today

minutes-brief

The minutes-brief skill generates a one-page meeting summary in under 60 seconds by automatically detecting your next calendar event, retrieving relationship history, and surfacing relevant open commitments. Use it when you need quick context before a call, such as when saying "brief me," "who am I meeting next," or right before walking into a meeting, as it prioritizes speed over the goal-setting depth of the companion prep skill.

Instalar en Claude Code
Copiar
git clone --depth 1 https://github.com/silverstein/minutes /tmp/minutes-brief && cp -r /tmp/minutes-brief/tooling/skills/sources/minutes-brief ~/.claude/skills/minutes-brief
Después abre una sesión nueva de Claude Code; el skill carga automáticamente.

skill.md

# /minutes-brief

Fast, non-interactive briefing that synthesizes your relationship history with someone into a one-page brief — designed so you can read it in 60 seconds before walking into a call.

This is the **proactive layer**. It's built to be invoked silently by a hook (e.g., 15 min before a calendar event) and to also work as a manual `/minutes-brief` command. Unlike `/minutes-prep`, brief asks no questions and sets no goals — it just hands you the facts.

## How it works

### Phase 0: Determine the target

Three ways the user can invoke this:

**1. With a name** (`/minutes-brief sarah`, "brief me on Alex")
→ Use that name directly. Before searching, check for learned aliases:

```bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" aliases "<name>" 2>/dev/null
```

If aliases exist, search across all returned variants and treat them as the same person for the rest of the flow. If the user explicitly says two names are the same person, persist it:

```bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" set-alias "Sarah Chen" "Sarah" "User confirmed these refer to the same person"
```

Then skip to Phase 1.

**2. With "auto" or no argument** (`/minutes-brief`, "brief me on my next call")
→ Auto-detect the next upcoming calendar event. Try sources in order — use the first that works:

- **Google Calendar MCP** (best — Claude users):
  ```
  gcal_list_events(timeMin: "<now ISO>", timeMax: "<+2hr ISO>", condenseEventDetails: false)
  ```
  Filter to events with 2+ attendees, skip all-day events, pick the soonest. Pull attendee names from the event.

- **`gog` CLI** (if installed):
  ```bash
  gog calendar list --today --json 2>/dev/null
  ```

- **Apple Calendar via 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) + 2 * hours))'
  ```

If none return anything, ask once: "I can't find an upcoming meeting. Who do you want a brief on?" Then take whatever they say and move on.

**3. Hook-fireable mode** (`/minutes-brief --auto`, or invoked silently from a hook)
→ Same as auto, but **never ask questions**. If no upcoming meeting and no name, exit silently with no output. Hooks should never spam the user.

### Phase 1: Gather data in parallel

The Minutes CLI already does the hard work. Fire all four of these as separate Bash tool calls in the same message — Claude Code will run them in parallel because they're independent. **The CLI's stream contract is messy; each command below has a specific shape documented below the block — read them before running.**

```bash
# 1. Person profile. stdout is CONTAMINATED: WARN tracing lines + JSON, mixed.
#    Use sed to extract from the first "{" to EOF before parsing as JSON.
minutes person "<name>" 2>/dev/null | sed -n '/^{/,$p'

# 2. Open commitments — what they owe you and what you owe them.
#    Clean JSON on stdout when --json is passed.
minutes commitments -p "<name>" --json 2>/dev/null

# 3. Recent decisions involving them, last 30 days.
#    Clean JSON on stdout by default (insights does NOT accept --json — output is already JSON).
minutes insights --participant "<name>" --kind decision --since <30-days-ago> 2>/dev/null

# 4. Recent meetings with them, last 60 days. Newline-delimited JSON (one object per line).
minutes search "<name>" --limit 10 --since <60-days-ago> --format json 2>/dev/null
```

**CLI stream-handling notes** — the Minutes CLI is actively developed and its stream contract is not fully settled. Today (0.8.0):

- `minutes person` writes tracing WARN lines **and** the JSON profile to **stdout** (not stderr, as you'd expect). The WARN lines appear first. The `sed -n '/^{/,$p'` pipe above strips them. If you pass `minutes person`'s raw stdout to a JSON parser, it will blow up on the first WARN line.
- `minutes person` also writes a human-readable summary ("Profile for Mat: …") to **stderr**. Harmless but weird. We redirect stderr to `/dev/null` to keep it out of the pipeline.
- `minutes commitments --json`, `minutes insights`, `minutes search --format json`, and `minutes people --json` all produce clean JSON on stdout when stderr is redirected. No extraction needed.
- **Do not invent new flags** on top of what's shown above — e.g. `minutes insights --json` is not a real flag, `minutes export --since` is not a real flag. The CLI will reject unknown flags with a usage error.

If a future CLI release changes any of these contracts, update this skill in the same PR that ships the CLI change.

**The `minutes person` empty-but-not-empty trap.** Some real meetings have malformed frontmatter that the CLI's strict schema rejects — you can see it in the WARN lines. When that happens, `minutes person "<name>"` returns an empty profile (`{"recent_meetings": [], ...}`) **even though meetings with that person actually exist on disk**. Before declaring "first meeting on record", always cross-check with `minutes search`:

```bash
minutes search "<name>" --limit 1 --format json 2>/dev/null
```

If `search` returns hits but `person` is empty, surface that as: "I have meetings with this person on record but the person profile is broken (likely a frontmatter schema issue). Here's what search found instead." Then read those meeting files directly and synthesize from the raw transcripts. Never lie to the user about a "first meeting" when it isn't one.

For multi-attendee meetings, focus on the **single most-mentioned attendee** (the one with the highest meeting count via `minutes person`). Mention the others briefly at the end. Don't try to brief 5 people at once — it dilutes the signal to nothing.

### Phase 2: Read what you actually need

Extract the file paths of the most recent 1–2 meetings from `minutes search`'s JSON output. Each line of the search output is a JSON object with a `path` field — the absolute path to the meeting file. Parse those, t
minutes-cleanupSkill

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.

minutes-debriefSkill

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.

minutes-graphSkill

Cross-meeting entity graph — query who/what/when across all your meetings as structured data, with co-occurrence and cross-entity queries that text search can't answer. Use whenever the user says "show me everyone who mentioned X", "all mentions of Y across meetings", "who knows about Z", "graph", "across all meetings", "entity search", "first time we talked about", "trend for X over time", "who's been mentioned alongside", or wants to query meetings as an index rather than full-text search. Builds a JSON entity index on first run (one-time slow), then answers queries instantly. Surface this skill for relationship intelligence, due diligence, or any "across all my history" question that text search alone can't answer.

minutes-ideasSkill

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.

minutes-ingestSkill

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.

minutes-lintSkill

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.

minutes-listSkill

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.

minutes-mirrorSkill

Self-coaching analysis of your own behavior across meetings — talk-time ratio, filler words, hedging language, monologue length, energy patterns, and (when meetings are tagged via /minutes-tag) what your behavior in winning meetings looks like vs losing ones. Use this whenever the user says "how did I do", "review my last meeting", "mirror", "self-review", "show my patterns", "coach me", "where am I weak", "talk time", "am I improving", "what do I do in meetings I win", "feedback on me", or asks for any kind of personal feedback on their own meeting behavior. This is the rare skill that gives the user a mirror to their own habits — surface it whenever they show curiosity about their own performance, even if they don't use the word "mirror".