一键导入
process-meetings
Process synced Granola meetings to update person pages, extract tasks, and organize meeting notes
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Process synced Granola meetings to update person pages, extract tasks, and organize meeting notes
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | process-meetings |
| description | Process synced Granola meetings to update person pages, extract tasks, and organize meeting notes |
| model_hint | balanced |
| context | fork |
| hooks | {"PostToolUse":[{"matcher":"Write","type":"command","command":"node .claude/hooks/post-meeting-person-update.cjs"}]} |
Process meetings that have been synced from Granola by the background automation. Updates person pages, extracts tasks, and organizes meeting notes.
This skill supports background execution. When invoked:
Meetings are synced automatically every 30 minutes by a background process. This command reads those synced files and:
No terminal commands are shown - the heavy lifting happens in the background.
today: Only process today's meetings"search term": Find meetings by title/attendee--people-only: Only update person/company pages (skip tasks)--no-todos: Create notes but don't extract tasks--setup: Install/check background automationGranola sync uses the official Granola public API. Desktop and mobile recordings both come through it once your Granola API key is connected. If GRANOLA_API_KEY isn't set (checked in the environment, then the .env file at the vault root), say: "Granola isn't connected yet — run /granola-setup to add your Granola API key (requires a Granola Business plan)." and continue with any meetings already synced.
First, check if background sync is set up:
# Check for state file (indicates sync has run)
ls .scripts/meeting-intel/processed-meetings.json
If state file exists: Background sync is working. Continue to Step 2.
If state file doesn't exist:
"Background meeting sync isn't set up yet. This runs automatically every 30 minutes so
/process-meetingsdoesn't need terminal commands.To set up (one-time, takes 30 seconds):
cd .scripts/meeting-intel && ./install-automation.shOr run
/process-meetings --setupand I'll do it for you.Requirements:
- A Granola Business plan, with your Granola API key connected via
/granola-setup- An LLM API key in
.env(GEMINI_API_KEY, ANTHROPIC_API_KEY, or OPENAI_API_KEY)"
If user runs --setup:
cd .scripts/meeting-intel && ./install-automation.sh
Read the processed meetings state:
const state = JSON.parse(fs.readFileSync('.scripts/meeting-intel/processed-meetings.json'));
List meeting files in 00-Inbox/Meetings/:
find 00-Inbox/Meetings -name "*.md" -mtime -7 | head -50
For each meeting file:
granola_id, participants, company, dateReport findings:
"Found X synced meetings from the last 7 days. Y need person page updates, Z have unextracted tasks."
For each participant in synced meetings:
Load user profile for email domain:
Read System/user-profile.yaml → get email_domain
Classify as Internal/External:
Look up the person with the Work MCP lookup_person tool.
ambiguous: true, do not create a page. Surface the possible matches to the user.If no match exists, call the Work MCP create_person tool:
name, role when known, emails from the meeting's attendees block, and location from that attendee's location field.---
type: person
name: "{Name}"
role: null
company: "{company from meeting}"
company_page: null
emails: ["{lowercased email, if available}"]
aliases: []
location: {internal|external}
last_interaction: {meeting date}
---
# {Name}
## Notes
*Auto-created from meeting on {date}*
## Recent Interactions
<!-- dex:auto:recent-interactions -->
- [{Meeting Title}](00-Inbox/Meetings/{date}/{slug}.md) — {date}
<!-- /dex:auto -->
## Key Context
```
5. **If page exists, add meeting to Recent Interactions:**
- Read existing page
- Add new meeting link under "## Recent Interactions"
- Keep max 20 entries (remove oldest if needed)
- Update "Last Interaction" in frontmatter
### Step 4: Update Company Pages
For each unique external company domain:
1. **Check if company page exists:** `05-Areas/Companies/{Company}.md`
2. **If doesn't exist, create it:**
```markdown
---
type: company
name: "{Company Name}"
domains: ["{lowercased domain}"]
website: "{website, if known}"
status: "Prospect"
---
# {Company Name}
## Key Contacts
<!-- dex:auto:key-contacts -->
- [[05-Areas/People/External/{Person}|{Person}]]
<!-- /dex:auto -->
## Meeting History
<!-- dex:auto:meeting-history -->
- [{Meeting Title}](00-Inbox/Meetings/{date}/{slug}.md) — {date}
<!-- /dex:auto -->
## Notes
*Auto-created from meeting on {date}*
Check if semantic search is available by looking for qmd in PATH.
If available, enhance meeting processing with meaning-based intelligence:
Detect implicit commitments: For each meeting's discussion notes, search semantically:
qmd query "we should circle back on..." --limit 3
qmd query "let me think about..." --limit 3
Catch soft commitments that regex action-item extraction misses.
Link meetings to projects: For the meeting topic, search:
qmd query "meeting topic/title" --limit 3
against 04-Projects/ to auto-link the meeting to relevant projects that keyword matching would miss.
Enrich person context: For each new person encountered, search:
qmd query "person name + company" --limit 3
Find if they've been mentioned in other meetings/notes, even if they weren't a direct participant.
Integration:
For each meeting with unextracted tasks:
Find action items in the "## Action Items > ### For Me" section
For each unchecked item (- [ ]):
^task-YYYYMMDD-XXX)Create task using Work MCP:
create_task(
title: "Task description",
priority: "P2", // default, P1 if "urgent" mentioned
pillar: "{from meeting}",
people: ["{participants}"],
source: "{meeting path}"
)
Mark as extracted by adding comment to meeting note:
<!-- tasks-extracted: 2026-02-03T10:30:00Z -->
After finishing edits to each processed meeting note, run this once for every processed note:
node .scripts/auto-link-people.cjs "<note-file>"
Use node .scripts/auto-link-people.cjs --dry-run "<note-file>" to preview what would be linked without changing the file.
Run node .scripts/meeting-intel/verify-entities.cjs and show its one-line summary.
If ENTITY_SUGGESTIONS_FILE contains suggested people, list them and ask: "Want me to create these pages? (creates via create_person; dismiss or never also fine)"
create_person, set the suggestion to accepted, and set the contact state to created with its page path.dismissed.suppressed.## Meeting Processing Complete ✅
**Synced meetings found:** X (last 7 days)
**Background sync status:** Running (last sync: 10 min ago)
### Updates Made
**Person pages:**
- Created: 3 new (Alice Chen, Bob Smith, Carol Wang)
- Updated: 5 existing
**Company pages:**
- Created: 1 new (Acme Corp)
- Updated: 2 existing
**Tasks extracted:** 7 items added to 03-Tasks/Tasks.md
### Recent Meetings
| Date | Meeting | Company | Participants |
|------|---------|---------|--------------|
| Feb 3 | Product Review | Acme | Alice, Bob |
| Feb 2 | Strategy Call | BigCo | Carol |
---
*Background sync runs every 30 min. Check status: `.scripts/meeting-intel/install-automation.sh --status`*
If no meetings found:
"No meetings synced in the last 7 days. Make sure:
- Your Granola API key is connected (run
/granola-setupif not)- Background sync is set up (run
/process-meetings --setup)- Check logs:
.scripts/logs/meeting-intel.stdout.log"
If background sync isn't running:
"Background sync appears to be stopped. To restart:
cd .scripts/meeting-intel && ./install-automation.sh ```"
/process-meetings
"Found 8 synced meetings. Updating 12 person pages, extracting 5 tasks..."
/process-meetings today
"Found 2 meetings from today. Processing..."
/process-meetings --setup
"Installing background automation..." [runs install script]
/process-meetings --people-only
"Updating person and company pages only (skipping task extraction)..."
Update System/usage_log.md to mark meeting processing as used.
Analytics (Silent):
Call track_event with event_name meetings_processed and properties:
meetings_count: number of meetings processedpeople_created: number of new person pages createdtodos_extracted: number of tasks extractedThis only fires if the user has opted into analytics. No action needed if it returns "analytics_disabled".
Process synced Granola meetings to update person pages, extract tasks, and organize meeting notes
Capture solved problems as categorized documentation with YAML frontmatter for fast lookup
Personal career coach with 4 modes: weekly reports, monthly reflections, self-reviews, promotion assessments
Generate a DexDiff methodology document from your vault customisations: package how you use Dex so others can replicate it
Rigorous whole-system checkup — verifies every Dex feature honestly (working / off / broken / couldn't-check), self-heals what is provably safe, and guides the user only where Dex cannot fix itself. Replaces /health-check.
Interactive post-onboarding tour with adaptive pathways based on available data