Meeting Processor
Intelligent meeting transcript processor that auto-detects meeting type and applies type-specific extraction with optional interactive clarification.
When to Use
- After syncing Fathom or Granola transcripts (
/fathom --today, /granola export)
- When asked to process, analyze, or summarize a meeting transcript
- When a new meeting transcript appears in the vault root matching
YYYYMMDD-*.md
- For coaching sessions, delegate to
coaching-session-summarizer skill instead
Prerequisites
pip install openai pyyaml
Requires CEREBRAS_API_KEY environment variable (uses Cerebras API with llama-3.3-70b).
Supported Meeting Types
| Type |
Description |
Key Extractions |
| leadgen |
Sales/business development calls |
Commitments, pain points, budget, timeline, decision makers, deal stage, sentiment |
| partnership |
Collaboration/partnership exploration |
Opportunity overview, value proposition, strategic alignment, technical needs, fit assessment |
| coaching |
Coaching/mentoring sessions |
Insights, decisions, action items, themes, emotional arc, techniques, session quality |
| internal |
Internal team meetings |
Coming soon |
Usage
Interactive Mode (default)
Run the processor, which auto-detects meeting type and asks clarifying questions:
python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --mode interactive
Interactive flow:
- Script analyzes transcript and detects meeting type
- Extracts structured data via LLM
- Identifies missing/ambiguous fields
- Returns questions as JSON (exit code 2 signals interaction needed)
- Parse the JSON between
__INTERACTIVE_QUESTIONS__ markers
- Use AskUserQuestion to collect answers for each question
- Save answers to a temp JSON file and re-run with
process_with_answers.py
Handling interactive questions:
When the script exits with code 2, parse the output for questions JSON. Each question has:
question: The question text
header: Short label (used as answer key)
options: Array of {label, description} for AskUserQuestion
After collecting answers, create two temp files:
questions.json — the original questions context (includes partial_data, meeting_type, transcript_file)
answers.json — map of {header_lowercase: selected_label}
Then run:
python3 ~/.claude/skills/meeting-processor/scripts/process_with_answers.py questions.json answers.json
Batch Mode
Extract only high-confidence information without user interaction:
python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --mode batch
Force Meeting Type
Skip auto-detection:
python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --type leadgen
python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --type partnership
Output
Analysis is appended to the transcript file as a ## Meeting Analysis section. Frontmatter is updated with meeting_type, processed_date, and processing_mode.
Leadgen Output Structure
- Commitments & Actions — with deadlines and owners
- Follow-up — next meeting date if scheduled
- Client Context — pain points, budget, timeline, decision makers
- Deal Assessment — stage (cold/warm/hot), probability (1-5), blocker, sentiment
Partnership Output Structure
- Opportunity — description and value proposition for both sides
- Commitments & Actions — with deadlines and owners
- Follow-up — next meeting date if scheduled
- Partnership Context — strategic alignment, technical needs, resources, challenges
- Opportunity Assessment — fit (strong/medium/weak), readiness, success factors, sentiment
Step 2: Auto-Link Prep Notes
After the meeting analysis is complete (Step 1), automatically link any matching meeting-prep notes to the session note. This replaces the need to manually run /meeting-prep link.
How It Works
Derive the meetings directory from the processed session note's parent directory (do not hardcode paths).
Extract session metadata from the processed note:
date from frontmatter (YYYYMMDD format)
participants from frontmatter (list of names)
- If no
participants field, extract names from the transcript header or attendee list
Search for matching prep notes:
find <MEETINGS_DIR> -name "YYYYMMDD-prep-*" -type f 2>/dev/null
Where YYYYMMDD is the session date.
Validate the match: For each candidate prep note, read its frontmatter and confirm:
- The
date field matches the session date
- The
participant field matches one of the session's participants (fuzzy: check both full name and first name, case-insensitive)
- The
session_note field is empty ("") — skip already-linked prep notes
Update both files when a match is found:
In the prep note:
- Set
session_note: "[[session-note-filename]]" (without .md extension)
- Set
status: done
In the session note:
Report in the processing output which prep notes were linked, skipped, or not found.
Rules
- Derive
MEETINGS_DIR from the session note path, not from hardcoded values
- If the meeting-prep
config.yaml is available, read prep_notes.prefix (default: prep) and prep_notes.type_tag (default: meeting-prep)
- This step is non-blocking: if it fails or finds no prep notes, processing still succeeds
1---2name: meeting-processor3description: This skill should be used when processing meeting transcripts to auto-detect meeting type (leadgen, partnership, coaching, internal) and extract type-specific structured analysis. Triggers on "process meeting", "analyze meeting", "meeting summary", or after syncing new Fathom/Granola transcripts.4---5
6# Meeting Processor
7
8Intelligent meeting transcript processor that auto-detects meeting type and applies type-specific extraction with optional interactive clarification.
9
10## When to Use
11
12- After syncing Fathom or Granola transcripts (`/fathom --today`, `/granola export`)
13- When asked to process, analyze, or summarize a meeting transcript
14- When a new meeting transcript appears in the vault root matching `YYYYMMDD-*.md`
15- For coaching sessions, delegate to `coaching-session-summarizer` skill instead
16
17## Prerequisites
18
19```bash
20pip install openai pyyaml
21```
22
23Requires `CEREBRAS_API_KEY` environment variable (uses Cerebras API with llama-3.3-70b).
24
25## Supported Meeting Types
26
27| Type | Description | Key Extractions |
28|------|-------------|-----------------|
29| **leadgen** | Sales/business development calls | Commitments, pain points, budget, timeline, decision makers, deal stage, sentiment |
30| **partnership** | Collaboration/partnership exploration | Opportunity overview, value proposition, strategic alignment, technical needs, fit assessment |
31| **coaching** | Coaching/mentoring sessions | Insights, decisions, action items, themes, emotional arc, techniques, session quality |
32| **internal** | Internal team meetings | Coming soon |
33
34## Usage
35
36### Interactive Mode (default)
37
38Run the processor, which auto-detects meeting type and asks clarifying questions:
39
40```bash
41python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --mode interactive
42```
43
44**Interactive flow:**
451. Script analyzes transcript and detects meeting type
462. Extracts structured data via LLM
473. Identifies missing/ambiguous fields
484. Returns questions as JSON (exit code 2 signals interaction needed)
495. Parse the JSON between `__INTERACTIVE_QUESTIONS__` markers
506. Use AskUserQuestion to collect answers for each question
517. Save answers to a temp JSON file and re-run with `process_with_answers.py`
52
53**Handling interactive questions:**
54
55When the script exits with code 2, parse the output for questions JSON. Each question has:
56- `question`: The question text
57- `header`: Short label (used as answer key)
58- `options`: Array of `{label, description}` for AskUserQuestion
59
60After collecting answers, create two temp files:
61- `questions.json` — the original questions context (includes `partial_data`, `meeting_type`, `transcript_file`)
62- `answers.json` — map of `{header_lowercase: selected_label}`
63
64Then run:
65```bash
66python3 ~/.claude/skills/meeting-processor/scripts/process_with_answers.py questions.json answers.json
67```
68
69### Batch Mode
70
71Extract only high-confidence information without user interaction:
72
73```bash
74python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --mode batch
75```
76
77### Force Meeting Type
78
79Skip auto-detection:
80
81```bash
82python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --type leadgen
83python3 ~/.claude/skills/meeting-processor/scripts/process.py <transcript-file> --type partnership
84```
85
86## Output
87
88Analysis is appended to the transcript file as a `## Meeting Analysis` section. Frontmatter is updated with `meeting_type`, `processed_date`, and `processing_mode`.
89
90### Leadgen Output Structure
91
92- **Commitments & Actions** — with deadlines and owners
93- **Follow-up** — next meeting date if scheduled
94- **Client Context** — pain points, budget, timeline, decision makers
95- **Deal Assessment** — stage (cold/warm/hot), probability (1-5), blocker, sentiment
96
97### Partnership Output Structure
98
99- **Opportunity** — description and value proposition for both sides
100- **Commitments & Actions** — with deadlines and owners
101- **Follow-up** — next meeting date if scheduled
102- **Partnership Context** — strategic alignment, technical needs, resources, challenges
103- **Opportunity Assessment** — fit (strong/medium/weak), readiness, success factors, sentiment
104
105## Step 2: Auto-Link Prep Notes
106
107After the meeting analysis is complete (Step 1), automatically link any matching meeting-prep notes to the session note. This replaces the need to manually run `/meeting-prep link`.
108
109### How It Works
110
1111. **Derive the meetings directory** from the processed session note's parent directory (do not hardcode paths).
112
1132. **Extract session metadata** from the processed note:
114 - `date` from frontmatter (YYYYMMDD format)
115 - `participants` from frontmatter (list of names)
116 - If no `participants` field, extract names from the transcript header or attendee list
117
1183. **Search for matching prep notes**:
119 ```bash
120 find <MEETINGS_DIR> -name "YYYYMMDD-prep-*" -type f 2>/dev/null
121 ```
122 Where `YYYYMMDD` is the session date.
123
1244. **Validate the match**: For each candidate prep note, read its frontmatter and confirm:
125 - The `date` field matches the session date
126 - The `participant` field matches one of the session's participants (fuzzy: check both full name and first name, case-insensitive)
127 - The `session_note` field is empty (`""`) — skip already-linked prep notes
128
1295. **Update both files** when a match is found:
130
131 **In the prep note:**
132 - Set `session_note: "[[session-note-filename]]"` (without `.md` extension)
133 - Set `status: done`
134
135 **In the session note:**
136 - If a `## See also` section exists, add `- [[YYYYMMDD-prep-participant-slug]]` to it
137 - Otherwise, append a new section at the end:
138 ```markdown
139 ## Prep Note
140 - [[YYYYMMDD-prep-participant-slug]]
141 ```
142 - Never create duplicate links — check if the link already exists before adding
143
1446. **Report** in the processing output which prep notes were linked, skipped, or not found.
145
146### Rules
147
148- Derive `MEETINGS_DIR` from the session note path, not from hardcoded values
149- If the meeting-prep `config.yaml` is available, read `prep_notes.prefix` (default: `prep`) and `prep_notes.type_tag` (default: `meeting-prep`)
150- This step is non-blocking: if it fails or finds no prep notes, processing still succeeds