Prepare nuDesk co-founders for business development, client, and network meetings. Use when asked to prepare for a meeting, create a meeting brief, help with meeting preparation, or when phrases like "I have a meeting with...", "meeting prep", "prepare me for...", or "upcoming meeting" appear. Autonomous by default — auto-selects meetings, runs parallel research, and generates briefs with minimal interruption.
From nudesk-osnpx claudepluginhub nudesk/nudesk-os-plugin --plugin nudesk-osThis skill uses the workspace's default tool permissions.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Details PluginEval's skill quality evaluation: 3 layers (static, LLM judge), 10 dimensions, rubrics, formulas, anti-patterns, badges. Use to interpret scores, improve triggering, calibrate thresholds.
Prepare nuDesk co-founders for business meetings through calendar integration, parallel engagement analysis, and adaptive discovery.
This skill minimizes round trips. Most preps complete with 0-1 questions.
Identify the meeting to prepare for.
Tools:
gws calendar +agenda --days 7
Logic:
gws workflow +meeting-prep
Extract: attendee names, email domains, meeting title, description, linked docs.
After meeting selection, launch all three tracks simultaneously as parallel operations. Do not run these sequentially.
gws gmail users messages list --params 'q=(to:kenny@nudesk.ai OR cc:kenny@nudesk.ai OR to:kenny@cintargroup.com OR cc:kenny@cintargroup.com) is:important {attendee name OR domain}'
Always include the base Gmail filter above. Append attendee names and/or company domain as additional search terms.
Look for: recent threads, open questions, commitments made, tone of relationship.
Read the top 3-5 most recent relevant messages for context.
Use the HubSpot MCP tools:
mcp__claude_ai_HubSpot__search_crm_objects — search contacts by attendee name/email, search deals by company namemcp__claude_ai_HubSpot__get_crm_objects — pull full contact or deal records for matchesLook for: deal stage, lifecycle stage, last interaction date, recorded notes, associated deals, owner.
Use the Fireflies MCP tools:
mcp__claude_ai_Fireflies__fireflies_search — search by attendee name or companymcp__claude_ai_Fireflies__fireflies_get_summary — get AI summary for matching meetingsLook for: past meeting topics, action items, decisions, follow-ups, relationship dynamics.
After all three tracks complete, classify the relationship:
Based on engagement depth, decide whether to ask questions:
Rich history (hits in 2+ tracks) — Skip questions. Generate brief from data.
Partial history (hits in 1 track, gaps in others) — Ask 1 targeted question to fill the gap:
No history (new relationship) — Ask up to 2 questions:
User provided context upfront — Extract what you can from their message. Only ask if something critical is missing (e.g., meeting objective is completely unclear).
Max questions in any scenario: 2.
Run these in parallel where triggered. Skip what's redundant with Step 2 findings.
gws people people searchDirectoryPeople --params 'query={attendee name}' --params 'readMask=names,emailAddresses,organizations,phoneNumbers' --params 'sources=DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE'
Determines if attendees are internal (nuDesk/Cintar) vs external.
Use WebSearch for: company background, recent news, funding, key metrics, industry position.
Use WebSearch for: attendee backgrounds, roles, career history. Skip for people already in Kenny's working memory (see CLAUDE.md People table).
Generate the brief as markdown and present it to the user. This is the review draft before creating the Google Doc.
Adapt format based on relationship type:
## Meeting Prep Brief: [Company Name]
**Date:** [Day of week], [Month] [Day], [Year] | [Start time] - [End time] [TZ]
**Type:** [Meeting type — e.g., First consultation call (new prospect)]
**Meeting Objective:** [From discovery or inferred from context]
## Research & Engagement History
### Engagement History
- [Summary of prior interactions from email, HubSpot, Fireflies — or note if new relationship]
### Company Overview
[Company name] -- [One-line description, location, identifiers]
[Niche/focus areas]
[Scale/metrics]
[Differentiator]
### Participant Bios
[Name], [Title] -- [Key background, achievements, relevant context]
## Meeting Preparation
### Recommended Agenda
[Topic] ([time]) -- [Description]
### Key Talking Points
[Topic] -- [Explanation of why this matters and how to position it]
### What We've Built (Capabilities to Highlight)
[Capability name] -- [Description of what it does and why it's relevant]
### Discovery Questions
[Question]
### Expected Questions and nuDesk Responses
Q: [Expected question]
A: [Suggested response]
Same structure but replace "Research & Engagement History" focus with current engagement status, recent deliverables, and open items. Replace "Discovery Questions" with "Questions for Client." Skip "What We've Built" unless demoing new capabilities.
Simplify to: Date, Type, Meeting Objective, Engagement History, Participant Bios, Talking Points, Questions to Ask.
After presenting the markdown brief, ask the user: "Ready to create the Google Doc?"
Do not proceed to Step 6 until the user signs off. They may request changes to the brief content first.
After user sign-off, create a formatted Google Doc in the Meeting Notes shared drive folder.
gws docs documents create --json '{"title":"Meeting Prep Brief: [Company Name]"}' --format json
Extract the documentId from the response.
The doc must be moved to the Meeting Notes (nuDesk) shared drive folder:
1dIPBQ--7uI9YEKn8DAq7ityBdcOa21cM0APOefP_6ePhHUk9PVAgws drive files update --params '{"fileId":"[DOC_ID]","addParents":"1dIPBQ--7uI9YEKn8DAq7ityBdcOa21cM","removeParents":"[CURRENT_PARENT_ID]","supportsAllDrives":true}' --format json
To get the current parent, read the file metadata first:
gws drive files get --params '{"fileId":"[DOC_ID]","fields":"id,parents","supportsAllDrives":true}' --format json
Use gws docs documents batchUpdate to insert and format all content. The document must match this style structure (based on the established template):
Document formatting rules:
| Content | Google Docs Style |
|---|---|
| Title (e.g., "Meeting Prep Brief: Convoy Home Loans") | TITLE (set by namedStyleType) |
| Metadata lines (Date, Type, Meeting Objective) | NORMAL_TEXT with bold label + normal value |
| Major sections (Research & Engagement History, Meeting Preparation) | HEADING_2 |
| Subsections (Engagement History, Company Overview, Participant Bios, etc.) | HEADING_3 |
| Bullet points | NORMAL_TEXT starting with - |
| Agenda items | NORMAL_TEXT — "[Topic] ([time]) -- [Description]" |
| Q&A pairs | NORMAL_TEXT — separate Q: and A: lines |
Important formatting notes:
updateTextStyle with bold: true.insertText at index 1 + updateParagraphStyle with namedStyleType: TITLE.batchUpdate request structure:
Build the requests array by inserting text bottom-up (insert from end to start so character indices don't shift). Alternatively, insert sequentially and track the running index.
gws docs documents batchUpdate --params '{"documentId":"[DOC_ID]"}' --json '{"requests":[...]}' --format json
Each request in the array is one of:
insertText — {"insertText":{"location":{"index":N},"text":"content\n"}}updateParagraphStyle — {"updateParagraphStyle":{"range":{"startIndex":N,"endIndex":M},"paragraphStyle":{"namedStyleType":"HEADING_2"},"fields":"namedStyleType"}}updateTextStyle — {"updateTextStyle":{"range":{"startIndex":N,"endIndex":M},"textStyle":{"bold":true},"fields":"bold"}}After creating the doc, share the Google Doc link with the user:
Doc created: https://docs.google.com/document/d/[DOC_ID]/edit
| Tool | Used In | Purpose |
|---|---|---|
gws calendar +agenda | Step 1 | List upcoming meetings |
gws workflow +meeting-prep | Step 1 | Full meeting details with attendees |
gws gmail users messages list | Step 2A | Email search (always include base filter) |
HubSpot MCP search_crm_objects | Step 2B | CRM contact and deal search |
HubSpot MCP get_crm_objects | Step 2B | Full CRM record details |
Fireflies MCP fireflies_search | Step 2C | Past meeting transcript search |
Fireflies MCP fireflies_get_summary | Step 2C | AI meeting summaries |
gws people people searchDirectoryPeople | Step 4 | Internal vs external contact check |
WebSearch | Step 4 | Company and participant research |
gws docs documents create | Step 6a | Create blank Google Doc |
gws drive files update | Step 6b | Move doc to shared drive folder |
gws docs documents batchUpdate | Step 6c | Insert and format doc content |
All Gmail searches in this skill MUST prepend this filter:
(to:kenny@nudesk.ai OR cc:kenny@nudesk.ai OR to:kenny@cintargroup.com OR cc:kenny@cintargroup.com) is:important
Then append attendee-specific terms (name, domain, company).