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 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.title || ''}\${card.company ? ' @ ' + card.company : ''}</div>
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 : ''}\${card.location ? ' · ' + card.location : ''}</p>
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
- <h2>Personality</h2>
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
- \${card.expertise?.length ? \`<h2>Expertise</h2><ul>\${card.expertise.map(e => \`<li>\${e}</li>\`).join('')}</ul>\` : ''}
350
- \${card.superpower ? \`<p><strong>⚡ Superpower:</strong> \${card.superpower}</p>\` : ''}
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.icebreakers?.length ? \`<p><strong>💡 Icebreakers:</strong> \${card.icebreakers.join(', ')}</p>\` : ''}
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.tags?.length ? \`<h2>Tags</h2><div class="tags">\${card.tags.map(t => \`<span class="tag">\${t}</span>\`).join('')}</div>\` : ''}
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 behavioral analyst building a comprehensive VIP contact profile.
2
- Given the raw data below from public sources (tweets, LinkedIn snippets, web search results, video transcripts), \
3
- synthesize a deep-analysis profile in the exact Markdown format provided.
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 you can directly support from the provided data
14
- - For personality analysis, these are INFERENCES based on public behavior — always note this
15
- - Score each dimension 1-5 based on evidence strength
16
- - If a section has no data, write "No public information found."
17
- - Do not fabricate details
18
- - If video transcripts are included, pay special attention to the person's own words, speaking patterns, and how they frame arguments
19
- - Output ONLY the Markdown profile followed by the JSON metadata block — no extra commentary
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
- > {One-line summary / tagline}
18
+ > Current: {current role @ company}
19
+ > Previous: {most notable previous role}
20
+ > Updated: {today's date}
26
21
 
27
- ## Basic Info
28
- - **Title:** {Current role}
29
- - **Company:** {Current company}
30
- - **Location:** {City, Country}
31
- - **Industry:** {Industry/domain}
22
+ ---
32
23
 
33
- ## Links
34
- - Twitter: {url}
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
- ## How to Work With Them
72
- - **Icebreaker Topics:** {3 conversation starters based on their interests}
73
- - **Do:** {3 things that would resonate positively}
74
- - **Don't:** {3 things to avoid based on known preferences}
75
- - **Gift Ideas:** {Based on hobbies, interests, values}
76
- - **Communication Tips:** {Best way to reach/engage this person}
77
- - **Meeting Prep:** {What to prepare before meeting them}
78
-
79
- ## Key Interests & Topics
80
- - {Topic 1}
81
- - {Topic 2}
82
- - {Topic 3}
83
-
84
- ## Notable Achievements
85
- - {Achievement 1}
86
- - {Achievement 2}
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
- - {Summary of recent public posts/tweets/news}
65
+ {Chronological list of notable recent public actions, each as:}
90
66
 
91
- ## Background
92
- {Education, career history, other public background}
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
- ## Personal
95
- {Family info, hobbies, or personal details only if publicly shared}
96
+ **Gift Ideas:** {Based on known interests}
96
97
 
97
- ## Notes
98
- {Any other relevant public information}
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 Markdown profile above, output a JSON metadata block in EXACTLY this format:
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
- "disc": "{D/I/S/C primary type letter}",
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, 1=intuition 5=data-driven},
119
- "risk_appetite": {1-5, 1=conservative 5=aggressive},
120
- "communication": {1-5, 1=reserved 5=expressive},
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": "{their unique edge in one phrase}",
126
- "tags": ["{tag1}", "{tag2}", "{tag3}", "{tag4}"],
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": ["{gift1}", "{gift2}"],
131
- "quote": "{a representative quote from this person}"
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
- - Personality insights from new data
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vipcare",
3
- "version": "0.3.30",
3
+ "version": "0.5.0",
4
4
  "description": "Auto-build VIP person profiles from Twitter/LinkedIn public data",
5
5
  "type": "module",
6
6
  "bin": {