vipcare 0.3.30 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/vip.js +42 -0
- package/lib/card.js +53 -24
- package/lib/templates.js +123 -94
- package/package.json +1 -1
package/bin/vip.js
CHANGED
|
@@ -847,6 +847,48 @@ program.command('reset')
|
|
|
847
847
|
console.log(c.green('\nAll data cleared. Run "vip init" to start fresh.'));
|
|
848
848
|
});
|
|
849
849
|
|
|
850
|
+
// --- annotate ---
|
|
851
|
+
program.command('annotate')
|
|
852
|
+
.description('Add a personal annotation/comment to a profile')
|
|
853
|
+
.argument('<name>', 'Profile name')
|
|
854
|
+
.argument('<note...>', 'Your annotation')
|
|
855
|
+
.action((name, noteParts) => {
|
|
856
|
+
const content = loadProfile(name);
|
|
857
|
+
if (!content) { console.error(c.red(`Profile not found: ${name}`)); process.exit(1); }
|
|
858
|
+
|
|
859
|
+
const note = noteParts.join(' ');
|
|
860
|
+
const personSlug = slugify(name);
|
|
861
|
+
const rawDir = path.join(getProfilesDir(), '.raw', personSlug);
|
|
862
|
+
fs.mkdirSync(rawDir, { recursive: true });
|
|
863
|
+
|
|
864
|
+
const annotationFile = path.join(rawDir, 'user_annotations.md');
|
|
865
|
+
const timestamp = new Date().toISOString().slice(0, 16).replace('T', ' ');
|
|
866
|
+
const entry = `\n- [${timestamp}] ${note}\n`;
|
|
867
|
+
|
|
868
|
+
if (fs.existsSync(annotationFile)) {
|
|
869
|
+
fs.appendFileSync(annotationFile, entry);
|
|
870
|
+
} else {
|
|
871
|
+
fs.writeFileSync(annotationFile, `# User Annotations for ${name}\n\nPersonal notes, observations, and meeting history.\n${entry}`);
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
// Also add to profile's Notes section
|
|
875
|
+
const updatedContent = loadProfile(name);
|
|
876
|
+
if (updatedContent) {
|
|
877
|
+
let newContent;
|
|
878
|
+
if (updatedContent.includes('## Notes')) {
|
|
879
|
+
newContent = updatedContent.replace('## Notes\n', `## Notes\n- [${timestamp}] ${note}\n`);
|
|
880
|
+
} else if (updatedContent.includes('\n---\n')) {
|
|
881
|
+
newContent = updatedContent.replace('\n---\n', `\n## Notes\n- [${timestamp}] ${note}\n\n---\n`);
|
|
882
|
+
} else {
|
|
883
|
+
newContent = updatedContent.trimEnd() + `\n\n## Notes\n- [${timestamp}] ${note}\n`;
|
|
884
|
+
}
|
|
885
|
+
saveProfile(name, newContent);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
console.log(c.green(`Annotation added to ${name}`));
|
|
889
|
+
console.log(c.dim(` Saved to: ${annotationFile}`));
|
|
890
|
+
});
|
|
891
|
+
|
|
850
892
|
// --- upgrade ---
|
|
851
893
|
program.command('upgrade')
|
|
852
894
|
.description('Update vipcare to the latest version')
|
package/lib/card.js
CHANGED
|
@@ -28,6 +28,24 @@ export function generateCards(profiles, outputPath) {
|
|
|
28
28
|
const twMatch = content.match(/twitter\.com\/(\w+)/i) || content.match(/x\.com\/(\w+)/i);
|
|
29
29
|
const twitterHandle = twMatch ? twMatch[1] : null;
|
|
30
30
|
|
|
31
|
+
// Load user annotations
|
|
32
|
+
const annotationFile = path.join(path.dirname(p.path), '.raw', p.slug, 'user_annotations.md');
|
|
33
|
+
let annotations = [];
|
|
34
|
+
if (fs.existsSync(annotationFile)) {
|
|
35
|
+
const annoContent = fs.readFileSync(annotationFile, 'utf-8');
|
|
36
|
+
annotations = annoContent.split('\n')
|
|
37
|
+
.filter(line => line.match(/^- \[/))
|
|
38
|
+
.map(line => line.replace(/^- /, '').trim());
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Extract last connection from Notes section
|
|
42
|
+
const notesMatch = content.match(/## Notes\n([\s\S]*?)(?=\n##|\n---|$)/);
|
|
43
|
+
let lastConnection = null;
|
|
44
|
+
if (notesMatch) {
|
|
45
|
+
const noteLines = notesMatch[1].split('\n').filter(l => l.startsWith('- ')).map(l => l.replace(/^- /, ''));
|
|
46
|
+
if (noteLines.length) lastConnection = noteLines[noteLines.length - 1];
|
|
47
|
+
}
|
|
48
|
+
|
|
31
49
|
const data = extractVipData(content);
|
|
32
50
|
if (!data) {
|
|
33
51
|
const nameMatch = content.match(/^# (.+)$/m);
|
|
@@ -54,12 +72,16 @@ export function generateCards(profiles, outputPath) {
|
|
|
54
72
|
expertise: [],
|
|
55
73
|
superpower: '',
|
|
56
74
|
quote: summaryMatch ? summaryMatch[1] : (p.summary || ''),
|
|
75
|
+
annotations,
|
|
76
|
+
last_connection: lastConnection,
|
|
57
77
|
});
|
|
58
78
|
continue;
|
|
59
79
|
}
|
|
60
80
|
|
|
61
81
|
data.slug = p.slug;
|
|
62
82
|
data.twitter_handle = data.twitter_handle || twitterHandle;
|
|
83
|
+
data.annotations = annotations;
|
|
84
|
+
data.last_connection = lastConnection;
|
|
63
85
|
cards.push(data);
|
|
64
86
|
}
|
|
65
87
|
|
|
@@ -293,10 +315,6 @@ function radarSvg(scores, size = 200) {
|
|
|
293
315
|
}
|
|
294
316
|
|
|
295
317
|
function renderCard(card, index) {
|
|
296
|
-
const scores = card.scores || {};
|
|
297
|
-
const radar = radarSvg(scores);
|
|
298
|
-
|
|
299
|
-
const twitterUrl = card.twitter || (card.slug ? \`https://unavatar.io/twitter/\${card.slug}\` : '');
|
|
300
318
|
const avatarUrl = \`https://unavatar.io/twitter/\${card.twitter_handle || card.slug || 'unknown'}\`;
|
|
301
319
|
|
|
302
320
|
return \`
|
|
@@ -306,20 +324,17 @@ function renderCard(card, index) {
|
|
|
306
324
|
<img src="\${avatarUrl}" alt="" style="width:48px;height:48px;border-radius:50%;object-fit:cover;border:2px solid #e2e8f0" onerror="this.style.display='none'">
|
|
307
325
|
<div>
|
|
308
326
|
<div class="card-name">\${card.name || 'Unknown'}</div>
|
|
309
|
-
<div class="card-role">\${card.
|
|
327
|
+
<div class="card-role">\${card.one_liner || card.title || ''}</div>
|
|
310
328
|
</div>
|
|
311
329
|
</div>
|
|
312
|
-
<span class="badge badge-mbti">\${card.mbti || '?'}</span>
|
|
313
|
-
</div>
|
|
314
|
-
\${card.quote ? \`<div class="card-quote">"\${card.quote.slice(0, 120)}\${card.quote.length > 120 ? '...' : ''}"</div>\` : ''}
|
|
315
|
-
<div class="radar-container">\${radar}</div>
|
|
316
|
-
\${card.superpower ? \`<div class="superpower">⚡ \${card.superpower}</div>\` : ''}
|
|
317
|
-
\${card.tags?.length ? \`<div class="tags">\${card.tags.map(t => \`<span class="tag">\${t}</span>\`).join('')}</div>\` : ''}
|
|
318
|
-
<div class="tips">
|
|
319
|
-
\${card.icebreakers?.length ? \`<div class="tip-row"><span class="tip-icon">💡</span><span class="tip-label">Icebreaker</span>\${card.icebreakers[0]}</div>\` : ''}
|
|
320
|
-
\${card.dos?.length ? \`<div class="tip-row"><span class="tip-icon">✅</span><span class="tip-label">Do</span>\${card.dos[0]}</div>\` : ''}
|
|
321
|
-
\${card.donts?.length ? \`<div class="tip-row"><span class="tip-icon">❌</span><span class="tip-label">Don't</span>\${card.donts[0]}</div>\` : ''}
|
|
330
|
+
<span class="badge badge-mbti" title="\${card.mbti_reason || ''}">\${card.mbti || '?'}</span>
|
|
322
331
|
</div>
|
|
332
|
+
\${card.latest_news ? \`<div style="background:#f0f9ff;padding:8px 12px;border-radius:8px;font-size:0.8em;color:#1e40af;margin:8px 0">📰 \${card.latest_news.slice(0, 120)}\${card.latest_news.length > 120 ? '...' : ''}</div>\` : ''}
|
|
333
|
+
\${card.current_focus ? \`<div style="font-size:0.85em;color:#475569;margin:6px 0"><strong>Focus:</strong> \${card.current_focus}</div>\` : ''}
|
|
334
|
+
\${card.wants ? \`<div style="font-size:0.85em;color:#475569;margin:6px 0"><strong>Wants:</strong> \${card.wants}</div>\` : ''}
|
|
335
|
+
\${card.last_connection ? \`<div style="font-size:0.8em;color:#2563eb;margin:6px 0">🤝 \${card.last_connection}</div>\` : \`<div style="font-size:0.8em;color:#94a3b8;margin:6px 0">💡 \${card.icebreakers?.[0] || 'No connection yet'}</div>\`}
|
|
336
|
+
\${card.talking_points?.length ? \`<div style="margin:8px 0"><div style="font-size:0.75em;color:#94a3b8;text-transform:uppercase;margin-bottom:4px">Talking Points</div>\${card.talking_points.slice(0,2).map(t => \`<div style="font-size:0.8em;color:#475569;padding:2px 0">• \${t}</div>\`).join('')}</div>\` : ''}
|
|
337
|
+
\${card.annotations?.length ? \`<div style="border-top:1px solid #e2e8f0;margin-top:8px;padding-top:8px;font-size:0.75em;color:#64748b">📝 \${card.annotations[card.annotations.length-1]}</div>\` : ''}
|
|
323
338
|
</div>\`;
|
|
324
339
|
}
|
|
325
340
|
|
|
@@ -336,26 +351,40 @@ function openModal(index) {
|
|
|
336
351
|
<img src="\${avatarUrl}" alt="" style="width:64px;height:64px;border-radius:50%;object-fit:cover;border:2px solid #e2e8f0" onerror="this.style.display='none'">
|
|
337
352
|
<div>
|
|
338
353
|
<h1 style="color:#2563eb;margin-bottom:4px;font-size:1.5em">\${card.name}</h1>
|
|
339
|
-
<p style="color:#64748b">\${card.title || ''}\${card.company ? ' @ ' + card.company : ''}
|
|
354
|
+
<p style="color:#64748b">\${card.title || ''}\${card.company ? ' @ ' + card.company : ''}</p>
|
|
355
|
+
\${card.previous_role ? \`<p style="color:#94a3b8;font-size:0.8em">Previously: \${card.previous_role}</p>\` : ''}
|
|
340
356
|
\${card.twitter_handle ? \`<a href="https://twitter.com/\${card.twitter_handle}" target="_blank" style="color:#2563eb;font-size:0.85em;text-decoration:none">@\${card.twitter_handle}</a>\` : ''}
|
|
341
357
|
</div>
|
|
342
358
|
</div>
|
|
343
|
-
\${card.quote ? \`<div class="card-quote" style="margin:16px 0">"\${card.quote}"</div>\` : ''}
|
|
344
359
|
|
|
345
|
-
|
|
346
|
-
<p><strong>MBTI:</strong> \${card.mbti || '?'}</p>
|
|
347
|
-
<div style="display:flex;justify-content:center;margin:16px 0">\${radarSvg(s, 260)}</div>
|
|
360
|
+
\${card.latest_news ? \`<div style="background:#f0f9ff;padding:10px 14px;border-radius:8px;font-size:0.85em;color:#1e40af;margin:12px 0">📰 \${card.latest_news}</div>\` : ''}
|
|
348
361
|
|
|
349
|
-
|
|
350
|
-
\${card.
|
|
362
|
+
<h2>Current Focus</h2>
|
|
363
|
+
\${card.current_focus ? \`<p>\${card.current_focus}</p>\` : '<p style="color:#94a3b8">No data available.</p>'}
|
|
364
|
+
\${card.wants ? \`<p><strong>Wants:</strong> \${card.wants}</p>\` : ''}
|
|
365
|
+
|
|
366
|
+
\${card.philosophy?.length ? \`<h2>Core Philosophy</h2>\${card.philosophy.map(p => \`<blockquote style="border-left:3px solid #2563eb;padding:4px 12px;margin:8px 0;color:#475569;font-style:italic">"\${p}"</blockquote>\`).join('')}\` : ''}
|
|
367
|
+
|
|
368
|
+
\${card.competition?.length ? \`<h2>Competition</h2><p>\${card.competition.join(', ')}</p>\` : ''}
|
|
369
|
+
|
|
370
|
+
\${card.talking_points?.length ? \`<h2>Talking Points</h2><ul>\${card.talking_points.map(t => \`<li>\${t}</li>\`).join('')}</ul>\` : ''}
|
|
351
371
|
|
|
352
372
|
<h2>How to Work With Them</h2>
|
|
353
|
-
\${card.
|
|
373
|
+
\${card.last_connection ? \`<p><strong>🤝 Last:</strong> \${card.last_connection}</p>\` : ''}
|
|
354
374
|
\${card.dos?.length ? \`<p><strong>✅ Do:</strong> \${card.dos.join(' · ')}</p>\` : ''}
|
|
355
375
|
\${card.donts?.length ? \`<p><strong>❌ Don't:</strong> \${card.donts.join(' · ')}</p>\` : ''}
|
|
356
376
|
\${card.gifts?.length ? \`<p><strong>🎁 Gifts:</strong> \${card.gifts.join(', ')}</p>\` : ''}
|
|
357
377
|
|
|
358
|
-
\${card.
|
|
378
|
+
\${card.key_quotes?.length ? \`<h2>Key Quotes</h2>\${card.key_quotes.slice(0,5).map(q => \`<p style="font-size:0.85em;color:#475569;padding:2px 0">• "\${q}"</p>\`).join('')}\` : ''}
|
|
379
|
+
|
|
380
|
+
<h2>Personality</h2>
|
|
381
|
+
<p><strong>MBTI:</strong> <span style="cursor:help;border-bottom:1px dashed #94a3b8" title="\${card.mbti_reason || ''}">\${card.mbti || '?'}</span>\${card.mbti_reason ? \` — \${card.mbti_reason}\` : ''}</p>
|
|
382
|
+
\${card.superpower ? \`<p><strong>⚡ Superpower:</strong> \${card.superpower}</p>\` : ''}
|
|
383
|
+
<div style="display:flex;justify-content:center;margin:16px 0">\${radarSvg(s, 240)}</div>
|
|
384
|
+
|
|
385
|
+
\${card.annotations?.length ? \`<h2>Your Notes</h2>\${card.annotations.map(a => \`<p style="font-size:0.85em;color:#64748b">📝 \${a}</p>\`).join('')}\` : ''}
|
|
386
|
+
|
|
387
|
+
\${card.tags?.length ? \`<div class="tags" style="margin-top:12px">\${card.tags.map(t => \`<span class="tag">\${t}</span>\`).join('')}</div>\` : ''}
|
|
359
388
|
|
|
360
389
|
\${card.slug ? \`<p style="margin-top:20px;text-align:center"><a href="\${card.slug}.html" style="color:#2563eb;text-decoration:none;padding:8px 20px;border:1px solid #2563eb;border-radius:8px;display:inline-block">View Full Profile →</a></p>\` : ''}
|
|
361
390
|
\`;
|
package/lib/templates.js
CHANGED
|
@@ -1,134 +1,163 @@
|
|
|
1
|
-
export const PROFILE_SYSTEM_PROMPT = `You are an expert
|
|
2
|
-
Given the raw data below from public sources (tweets, LinkedIn
|
|
3
|
-
synthesize
|
|
4
|
-
|
|
5
|
-
## Analysis Framework
|
|
6
|
-
Use these theories to infer personality and behavior:
|
|
7
|
-
- **DISC Model** — Dominance, Influence, Steadiness, Conscientiousness
|
|
8
|
-
- **Big Five (OCEAN)** — Openness, Conscientiousness, Extraversion, Agreeableness, Neuroticism
|
|
9
|
-
- **Cialdini's Influence** — Which persuasion principles this person uses/responds to
|
|
10
|
-
- **Situational Leadership** — Their decision-making and leadership approach
|
|
1
|
+
export const PROFILE_SYSTEM_PROMPT = `You are an expert relationship intelligence analyst building a VIP contact dossier.
|
|
2
|
+
Given the raw data below from public sources (tweets, LinkedIn, web search, video transcripts, user annotations), \
|
|
3
|
+
synthesize an actionable profile focused on HOW to work with this person.
|
|
11
4
|
|
|
12
5
|
## Rules
|
|
13
|
-
- Only include information
|
|
14
|
-
- For personality
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
- If
|
|
19
|
-
- Output ONLY the Markdown profile followed by the JSON metadata block
|
|
6
|
+
- Only include information supported by the provided data
|
|
7
|
+
- For personality/MBTI inferences, note these are estimates based on public behavior
|
|
8
|
+
- Focus on ACTIONABLE intelligence: what they care about NOW, what they want, how to approach them
|
|
9
|
+
- Include their own words whenever possible (direct quotes)
|
|
10
|
+
- If user annotations exist, incorporate them into interaction history
|
|
11
|
+
- If a section has no data, write "No data available."
|
|
12
|
+
- Output ONLY the Markdown profile followed by the JSON metadata block
|
|
20
13
|
|
|
21
14
|
## Output Format
|
|
22
15
|
|
|
23
|
-
# {Full Name}
|
|
16
|
+
# {Full Name} — Profile
|
|
24
17
|
|
|
25
|
-
> {
|
|
18
|
+
> Current: {current role @ company}
|
|
19
|
+
> Previous: {most notable previous role}
|
|
20
|
+
> Updated: {today's date}
|
|
26
21
|
|
|
27
|
-
|
|
28
|
-
- **Title:** {Current role}
|
|
29
|
-
- **Company:** {Current company}
|
|
30
|
-
- **Location:** {City, Country}
|
|
31
|
-
- **Industry:** {Industry/domain}
|
|
22
|
+
---
|
|
32
23
|
|
|
33
|
-
##
|
|
34
|
-
-
|
|
35
|
-
- LinkedIn: {url}
|
|
36
|
-
- Website: {url if found}
|
|
37
|
-
|
|
38
|
-
## Bio
|
|
39
|
-
{2-3 paragraph biography synthesized from public sources}
|
|
40
|
-
|
|
41
|
-
## Personality & Communication Style
|
|
42
|
-
- **DISC Type:** {Primary type (D/I/S/C) with brief rationale}
|
|
43
|
-
- **MBTI Estimate:** {e.g. ENTJ — with brief rationale}
|
|
44
|
-
- **Communication Style:** {Direct/Diplomatic/Analytical/Storyteller — with evidence}
|
|
45
|
-
- **Decision-Making:** {Data-driven/Intuition-led/Consensus-seeking/Decisive}
|
|
46
|
-
- **Tone:** {Formal/Casual/Inspiring/Technical}
|
|
47
|
-
- **Key Phrases:** {Recurring phrases or vocabulary patterns they use}
|
|
48
|
-
|
|
49
|
-
## Expertise & Strengths
|
|
50
|
-
- **Core Expertise:** {The domains where they have deep knowledge and proven track record}
|
|
51
|
-
- **Superpower:** {What they do better than almost anyone — their unique edge}
|
|
52
|
-
- **Known For:** {What peers/media consistently cite them for}
|
|
53
|
-
- **Skills Matrix:**
|
|
54
|
-
- {Skill 1}: {★★★★★ level + brief evidence}
|
|
55
|
-
- {Skill 2}: {★★★★☆ level + brief evidence}
|
|
56
|
-
- {Skill 3}: {★★★★☆ level + brief evidence}
|
|
57
|
-
|
|
58
|
-
## Interests & Values
|
|
59
|
-
- **Core Beliefs:** {What they consistently advocate for}
|
|
60
|
-
- **Topics They Care About:** {Recurring themes from speeches, tweets, writing}
|
|
61
|
-
- **Public Positions:** {Publicly stated opinions on relevant issues}
|
|
62
|
-
- **Motivations:** {What drives them — mission, money, impact, legacy, etc.}
|
|
63
|
-
|
|
64
|
-
## Character & Leadership
|
|
65
|
-
- **Leadership Style:** {Visionary/Operational/Servant-leader/Transformational — with evidence}
|
|
66
|
-
- **Risk Tolerance:** {Conservative/Calculated/Aggressive — with evidence}
|
|
67
|
-
- **Management Philosophy:** {How they describe running teams/companies}
|
|
68
|
-
- **Under Pressure:** {How they handle crises, based on public evidence}
|
|
69
|
-
- **Influence Strategy:** {Authority/Reciprocity/Vision/Data/Social-proof — per Cialdini}
|
|
24
|
+
## Background
|
|
25
|
+
{3-5 bullet points of career highlights — concise, factual}
|
|
70
26
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
- {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
- {
|
|
86
|
-
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Core Philosophy
|
|
30
|
+
{2-4 key beliefs/principles they consistently express, each as:}
|
|
31
|
+
|
|
32
|
+
**"{direct quote}"**
|
|
33
|
+
{1-line interpretation of what this means}
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Leadership & Work Style
|
|
38
|
+
- **Type:** {IC Leader/Delegator/Visionary/Operator — with evidence}
|
|
39
|
+
- **Speed:** {How fast they move, what pace they expect}
|
|
40
|
+
- **Decision-making:** {Data-driven/Intuition/Consensus — with evidence}
|
|
41
|
+
- **Communication:** {Direct/Diplomatic/Storyteller — how they interact publicly}
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Current Focus
|
|
46
|
+
{What they are actively working on and talking about RIGHT NOW}
|
|
47
|
+
- {Focus area 1 with evidence}
|
|
48
|
+
- {Focus area 2 with evidence}
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## What They Want
|
|
53
|
+
{What they're trying to achieve, what they're looking for}
|
|
54
|
+
- {Goal/desire 1}
|
|
55
|
+
- {Goal/desire 2}
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Competition & Positioning
|
|
60
|
+
{Who they see as competition, how they position themselves}
|
|
61
|
+
|
|
62
|
+
---
|
|
87
63
|
|
|
88
64
|
## Recent Activity
|
|
89
|
-
|
|
65
|
+
{Chronological list of notable recent public actions, each as:}
|
|
90
66
|
|
|
91
|
-
|
|
92
|
-
{
|
|
67
|
+
### {Date} — {Event type}
|
|
68
|
+
- {What happened, with context}
|
|
69
|
+
- {Link if available}
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Interaction History
|
|
74
|
+
{User's own notes and meeting history — from annotations and Notes section}
|
|
75
|
+
{If no interactions yet, write "No interactions recorded yet."}
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## How to Work With Them
|
|
80
|
+
|
|
81
|
+
**Talking Points:**
|
|
82
|
+
- {Topic 1 — why it would resonate}
|
|
83
|
+
- {Topic 2 — why it would resonate}
|
|
84
|
+
- {Topic 3 — why it would resonate}
|
|
85
|
+
|
|
86
|
+
**Do:**
|
|
87
|
+
- {Approach 1}
|
|
88
|
+
- {Approach 2}
|
|
89
|
+
- {Approach 3}
|
|
90
|
+
|
|
91
|
+
**Don't:**
|
|
92
|
+
- {Anti-pattern 1}
|
|
93
|
+
- {Anti-pattern 2}
|
|
94
|
+
- {Anti-pattern 3}
|
|
93
95
|
|
|
94
|
-
|
|
95
|
-
{Family info, hobbies, or personal details only if publicly shared}
|
|
96
|
+
**Gift Ideas:** {Based on known interests}
|
|
96
97
|
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Key Quotes
|
|
101
|
+
{5-8 memorable quotes from this person, each on its own line with source context}
|
|
102
|
+
- "{quote}" — {context}
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Personality (Inferred)
|
|
107
|
+
- **MBTI:** {type} — {1-2 sentence rationale}
|
|
108
|
+
- **DISC:** {type}
|
|
109
|
+
- **Risk tolerance:** {Conservative/Calculated/Aggressive}
|
|
110
|
+
- **Influence style:** {Authority/Reciprocity/Vision/Data per Cialdini}
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Links
|
|
115
|
+
- Twitter: {url}
|
|
116
|
+
- LinkedIn: {url}
|
|
117
|
+
- Website/Blog: {url}
|
|
99
118
|
|
|
100
119
|
---
|
|
101
|
-
IMPORTANT: After the
|
|
120
|
+
IMPORTANT: After the profile, output a JSON metadata block in EXACTLY this format:
|
|
102
121
|
|
|
103
122
|
<!-- VIP_DATA
|
|
104
123
|
{
|
|
105
124
|
"name": "{Full Name}",
|
|
106
125
|
"title": "{Current role}",
|
|
107
126
|
"company": "{Company}",
|
|
127
|
+
"previous_role": "{Most notable previous role}",
|
|
108
128
|
"location": "{City, Country}",
|
|
109
129
|
"industry": "{Industry}",
|
|
110
|
-
"
|
|
130
|
+
"one_liner": "{who is this person in <=10 words}",
|
|
111
131
|
"mbti": "{4-letter MBTI}",
|
|
132
|
+
"mbti_reason": "{1-2 sentence why this MBTI}",
|
|
133
|
+
"disc": "{D/I/S/C}",
|
|
112
134
|
"scores": {
|
|
113
135
|
"openness": {1-5},
|
|
114
136
|
"conscientiousness": {1-5},
|
|
115
137
|
"extraversion": {1-5},
|
|
116
138
|
"agreeableness": {1-5},
|
|
117
139
|
"resilience": {1-5},
|
|
118
|
-
"decision_style": {1-5
|
|
119
|
-
"risk_appetite": {1-5
|
|
120
|
-
"communication": {1-5
|
|
140
|
+
"decision_style": {1-5},
|
|
141
|
+
"risk_appetite": {1-5},
|
|
142
|
+
"communication": {1-5},
|
|
121
143
|
"influence": {1-5},
|
|
122
144
|
"leadership": {1-5}
|
|
123
145
|
},
|
|
146
|
+
"current_focus": "{what they are focused on NOW}",
|
|
147
|
+
"wants": "{what they are trying to achieve}",
|
|
148
|
+
"latest_news": "{most recent notable event with date}",
|
|
149
|
+
"philosophy": ["{core belief 1}", "{core belief 2}"],
|
|
150
|
+
"key_quotes": ["{memorable quote 1}", "{memorable quote 2}", "{memorable quote 3}"],
|
|
151
|
+
"talking_points": ["{actionable topic 1}", "{actionable topic 2}", "{actionable topic 3}"],
|
|
124
152
|
"expertise": ["{area1}", "{area2}", "{area3}"],
|
|
125
|
-
"superpower": "{
|
|
126
|
-
"tags": ["{tag1}", "{tag2}", "{tag3}"
|
|
153
|
+
"superpower": "{unique edge in one phrase}",
|
|
154
|
+
"tags": ["{tag1}", "{tag2}", "{tag3}"],
|
|
127
155
|
"icebreakers": ["{topic1}", "{topic2}", "{topic3}"],
|
|
128
156
|
"dos": ["{do1}", "{do2}", "{do3}"],
|
|
129
157
|
"donts": ["{dont1}", "{dont2}", "{dont3}"],
|
|
130
|
-
"gifts": ["{
|
|
131
|
-
"
|
|
158
|
+
"gifts": ["{gift idea 1}", "{gift idea 2}"],
|
|
159
|
+
"competition": ["{competitor/rival 1}", "{competitor/rival 2}"],
|
|
160
|
+
"twitter_handle": "{handle without @}"
|
|
132
161
|
}
|
|
133
162
|
-->`;
|
|
134
163
|
|
|
@@ -137,7 +166,7 @@ export const CHANGE_DETECTION_PROMPT = `Compare the OLD profile and NEW data bel
|
|
|
137
166
|
- New achievements or milestones
|
|
138
167
|
- Notable new public statements or positions
|
|
139
168
|
- Changes in focus areas or interests
|
|
140
|
-
-
|
|
169
|
+
- New competitive moves or product launches
|
|
141
170
|
|
|
142
171
|
If there are significant changes, output a brief summary (2-3 sentences) of what changed.
|
|
143
172
|
If there are no significant changes, output exactly: NO_SIGNIFICANT_CHANGES
|