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", "every time we talked about Y", "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.
Cross-meeting entity graph that lets you query your meeting history as structured data — people and topics out of the box, with companies and products as an opt-in deep-extraction path.
Minutes already exposes minutes people, minutes person, and minutes insights for first-class entity queries. Graph layers on top of those to answer questions the CLI can't:
Defer to the existing CLI when it suffices. Use graph for the queries the CLI can't answer. Anything about companies or products requires opt-in deep extraction (see Phase 1).
Graph has two modes: build (creates the index) and query (uses it).
If the user explicitly says "build" / "rebuild" / "refresh the graph" → Phase 1 (build mode).
Otherwise → Phase 2 (query mode). Query mode auto-builds the index if it doesn't exist, and incrementally refreshes it if new meetings exist since the last build.
Detect company/product queries upfront. If the user's question mentions a specific company name, product, brand, or anything that wouldn't be in standard meeting frontmatter (e.g., "Stripe", "Notion", "the deal with Acme"), tell them upfront — before any building happens — that this needs deep extraction:
"That query is about a company/product, which isn't in standard meeting frontmatter. I'd need to deep-scan transcripts (~<estimate> seconds for <N> meetings) to answer. Continue, or rephrase to use topics/people that are already indexed?"
This avoids the worst flow: build → discover the data isn't there → ask user → rebuild.
The index lives at ~/.minutes/graph/index.json. Use the bundled graph_build.py script — do not try to walk meeting files or parse YAML frontmatter in-context. The script is deterministic, fast, atomic, and handles all the edge cases (incremental rebuilds, garbage filtering, name disambiguation, augmentation from minutes people --json).
Always warn before building, even on the auto-trigger path. Users hate commands that hang silently more than they hate one-line confirmations:
"Building entity graph from <N> meetings. The frontmatter-only path is fast (a few seconds for hundreds of meetings). Continue? (Ctrl+C to abort)"
To get the meeting count for the warning, use Glob on the meetings dir from minutes paths.
Run the script:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/minutes-graph/scripts/graph_build.py" --incremental
Defaults:
--meetings-dir defaults to output_dir from minutes paths--output defaults to ~/.minutes/graph/index.json--incremental skips the rebuild entirely if no meeting files have been modified since the last build (the common case after the first build)The script prints a one-line summary JSON to stdout:
{"status": "ok", "meeting_count": 142, "person_count": 12, "topic_count": 38, "output": "/Users/.../index.json"}
Or {"status": "fresh", ...} if --incremental found nothing to rebuild.
What the script does, in order:
date, attendees (display names), people (wikilink slugs), tags, and decisions[].topic — all the entity-relevant fields the real meeting schema actually hasnone/null/~ topic values that show up in some malformed meetingsattendees and people have the same length, zips them positionally to map each slug to its display name (gives mat → Mat S., etc.)minutes people --json and merges its top_topics, open_commitments, score, losing_touch fields into the people entries it already builtunknown-speaker, speaker-3, etc.) out of the final people indexWhat's NOT in the default build: companies and products. Some real meetings do have an entities: block in their frontmatter — the current schema looks like: