slashvibe-mcp 0.3.18 → 0.3.19
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/index.js +20 -0
- package/package.json +1 -1
- package/setup.js +88 -10
- package/tools/init.js +25 -7
package/index.js
CHANGED
|
@@ -463,6 +463,26 @@ class VibeMCPServer {
|
|
|
463
463
|
|
|
464
464
|
// Check for updates (non-blocking)
|
|
465
465
|
this.checkForUpdates();
|
|
466
|
+
|
|
467
|
+
// Auto-presence: if authenticated, broadcast presence on connect
|
|
468
|
+
this.autoPresence();
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
async autoPresence() {
|
|
472
|
+
try {
|
|
473
|
+
const handle = config.getHandle();
|
|
474
|
+
if (!handle) return; // Not authenticated yet
|
|
475
|
+
|
|
476
|
+
const one_liner = config.getOneLiner() || '';
|
|
477
|
+
|
|
478
|
+
// Start presence heartbeat
|
|
479
|
+
presence.start(handle, one_liner);
|
|
480
|
+
|
|
481
|
+
// Log quietly (only to stderr, not intrusive)
|
|
482
|
+
process.stderr.write(`🟢 Auto-connected as @${handle}\n`);
|
|
483
|
+
} catch (error) {
|
|
484
|
+
// Silent fail - don't block startup
|
|
485
|
+
}
|
|
466
486
|
}
|
|
467
487
|
|
|
468
488
|
async checkForUpdates() {
|
package/package.json
CHANGED
package/setup.js
CHANGED
|
@@ -161,6 +161,36 @@ async function getOnlineCount() {
|
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Get online users with details for display
|
|
166
|
+
*/
|
|
167
|
+
async function getOnlineUsers() {
|
|
168
|
+
try {
|
|
169
|
+
const response = await fetch(`${API_BASE}/api/presence`);
|
|
170
|
+
const data = await response.json();
|
|
171
|
+
const active = data.active || [];
|
|
172
|
+
const away = data.away || [];
|
|
173
|
+
|
|
174
|
+
// Format: { users: [{handle, status, one_liner}], total: number }
|
|
175
|
+
const users = [
|
|
176
|
+
...active.slice(0, 5).map(u => ({
|
|
177
|
+
handle: u.username || u.handle,
|
|
178
|
+
status: 'active',
|
|
179
|
+
one_liner: u.one_liner || u.status || ''
|
|
180
|
+
})),
|
|
181
|
+
...away.slice(0, 2).map(u => ({
|
|
182
|
+
handle: u.username || u.handle,
|
|
183
|
+
status: 'away',
|
|
184
|
+
one_liner: u.one_liner || u.status || ''
|
|
185
|
+
}))
|
|
186
|
+
].slice(0, 5);
|
|
187
|
+
|
|
188
|
+
return { users, total: active.length + away.length };
|
|
189
|
+
} catch (e) {
|
|
190
|
+
return { users: [], total: 0 };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
164
194
|
/**
|
|
165
195
|
* Open URL in browser
|
|
166
196
|
*/
|
|
@@ -326,7 +356,13 @@ async function setup() {
|
|
|
326
356
|
if (!connected) {
|
|
327
357
|
printStep(3, 'Testing connection...', 'error');
|
|
328
358
|
console.log(`${colors.red} → Could not reach slashvibe.dev${colors.reset}`);
|
|
329
|
-
console.log(
|
|
359
|
+
console.log('');
|
|
360
|
+
console.log(`${colors.bold} Troubleshooting:${colors.reset}`);
|
|
361
|
+
console.log(`${colors.dim} 1. Check your internet connection${colors.reset}`);
|
|
362
|
+
console.log(`${colors.dim} 2. Try: ${colors.cyan}curl -s https://www.slashvibe.dev/api/health${colors.reset}`);
|
|
363
|
+
console.log(`${colors.dim} 3. If that works, try setup again${colors.reset}`);
|
|
364
|
+
console.log('');
|
|
365
|
+
console.log(`${colors.dim} Status page: ${colors.cyan}slashvibe.dev/status${colors.reset}`);
|
|
330
366
|
process.exit(1);
|
|
331
367
|
}
|
|
332
368
|
|
|
@@ -352,14 +388,31 @@ async function setup() {
|
|
|
352
388
|
printStep(4, 'Opening browser for GitHub auth...', 'done');
|
|
353
389
|
console.log(`${colors.dim} → Authenticated as @${authResult.handle}${colors.reset}`);
|
|
354
390
|
|
|
355
|
-
// Success!
|
|
391
|
+
// Success! Show who's online immediately
|
|
392
|
+
const presence = await getOnlineUsers();
|
|
393
|
+
|
|
356
394
|
console.log('');
|
|
357
395
|
console.log(`${colors.green} ✓ Setup complete!${colors.reset}`);
|
|
358
396
|
console.log('');
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
397
|
+
|
|
398
|
+
// Show who's vibing right now
|
|
399
|
+
if (presence.users.length > 0) {
|
|
400
|
+
console.log(`${colors.bold} 🟢 ${presence.total} builders vibing now:${colors.reset}`);
|
|
401
|
+
for (const user of presence.users) {
|
|
402
|
+
const statusIcon = user.status === 'active' ? colors.green + '●' : colors.yellow + '○';
|
|
403
|
+
const liner = user.one_liner ? ` — ${user.one_liner.slice(0, 40)}` : '';
|
|
404
|
+
console.log(` ${statusIcon}${colors.reset} @${user.handle}${colors.dim}${liner}${colors.reset}`);
|
|
405
|
+
}
|
|
406
|
+
if (presence.total > 5) {
|
|
407
|
+
console.log(`${colors.dim} ... and ${presence.total - 5} more${colors.reset}`);
|
|
408
|
+
}
|
|
409
|
+
console.log('');
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
console.log(`${colors.bold} Quick start:${colors.reset}`);
|
|
413
|
+
console.log(`${colors.dim} 1. Restart Claude Code${colors.reset}`);
|
|
414
|
+
console.log(`${colors.dim} 2. Type "who's vibing?" to see everyone${colors.reset}`);
|
|
415
|
+
console.log(`${colors.dim} 3. Type "dm @seth hey!" to send a message${colors.reset}`);
|
|
363
416
|
console.log('');
|
|
364
417
|
console.log(`${colors.cyan} 🚀 Welcome to /vibe, @${authResult.handle}!${colors.reset}`);
|
|
365
418
|
console.log('');
|
|
@@ -379,11 +432,36 @@ async function setup() {
|
|
|
379
432
|
|
|
380
433
|
} catch (err) {
|
|
381
434
|
printStep(4, 'Opening browser for GitHub auth...', 'error');
|
|
382
|
-
|
|
435
|
+
|
|
436
|
+
// Specific error recovery messages
|
|
437
|
+
if (err.message.includes('timed out')) {
|
|
438
|
+
console.log(`${colors.red} → Authentication timed out (2 min limit)${colors.reset}`);
|
|
439
|
+
console.log('');
|
|
440
|
+
console.log(`${colors.yellow} What happened:${colors.reset}`);
|
|
441
|
+
console.log(`${colors.dim} The browser auth wasn't completed in time.${colors.reset}`);
|
|
442
|
+
console.log('');
|
|
443
|
+
console.log(`${colors.bold} Try again:${colors.reset}`);
|
|
444
|
+
console.log(`${colors.cyan} npx slashvibe-mcp setup${colors.reset}`);
|
|
445
|
+
} else if (err.message.includes('port in use')) {
|
|
446
|
+
console.log(`${colors.red} → Auth callback port busy${colors.reset}`);
|
|
447
|
+
console.log('');
|
|
448
|
+
console.log(`${colors.yellow} What happened:${colors.reset}`);
|
|
449
|
+
console.log(`${colors.dim} Another setup or auth process is running.${colors.reset}`);
|
|
450
|
+
console.log('');
|
|
451
|
+
console.log(`${colors.bold} Fix it:${colors.reset}`);
|
|
452
|
+
console.log(`${colors.dim} 1. Wait a minute for it to finish, or${colors.reset}`);
|
|
453
|
+
console.log(`${colors.dim} 2. Kill the process: ${colors.cyan}lsof -ti:9876 | xargs kill${colors.reset}`);
|
|
454
|
+
console.log(`${colors.dim} 3. Try again: ${colors.cyan}npx slashvibe-mcp setup${colors.reset}`);
|
|
455
|
+
} else {
|
|
456
|
+
console.log(`${colors.red} → ${err.message}${colors.reset}`);
|
|
457
|
+
console.log('');
|
|
458
|
+
console.log(`${colors.bold} Try these steps:${colors.reset}`);
|
|
459
|
+
console.log(`${colors.dim} 1. Check internet connection${colors.reset}`);
|
|
460
|
+
console.log(`${colors.dim} 2. Try again: ${colors.cyan}npx slashvibe-mcp setup${colors.reset}`);
|
|
461
|
+
console.log(`${colors.dim} 3. Or in Claude Code, type: ${colors.cyan}add the vibe mcp server${colors.reset}`);
|
|
462
|
+
}
|
|
383
463
|
console.log('');
|
|
384
|
-
console.log(`${colors.
|
|
385
|
-
console.log(`${colors.dim} 1. Run: vibe init${colors.reset}`);
|
|
386
|
-
console.log(`${colors.dim} 2. Complete auth in browser${colors.reset}`);
|
|
464
|
+
console.log(`${colors.dim} Need help? slashvibe.dev/help${colors.reset}`);
|
|
387
465
|
process.exit(1);
|
|
388
466
|
}
|
|
389
467
|
}
|
package/tools/init.js
CHANGED
|
@@ -220,17 +220,17 @@ async function sendWelcomeMessage(handle, one_liner) {
|
|
|
220
220
|
|
|
221
221
|
const definition = {
|
|
222
222
|
name: 'vibe_init',
|
|
223
|
-
description: '
|
|
223
|
+
description: 'Join /vibe social network. Opens browser for GitHub login - NO INPUT NEEDED. Your GitHub username becomes your handle automatically. Just run this and complete the browser auth.',
|
|
224
224
|
inputSchema: {
|
|
225
225
|
type: 'object',
|
|
226
226
|
properties: {
|
|
227
227
|
handle: {
|
|
228
228
|
type: 'string',
|
|
229
|
-
description: '
|
|
229
|
+
description: 'RARELY NEEDED - Override your handle (defaults to GitHub username, which is usually what you want)'
|
|
230
230
|
},
|
|
231
231
|
one_liner: {
|
|
232
232
|
type: 'string',
|
|
233
|
-
description: 'What are you building?
|
|
233
|
+
description: 'OPTIONAL - What are you building? Can set this later.'
|
|
234
234
|
}
|
|
235
235
|
},
|
|
236
236
|
required: []
|
|
@@ -701,7 +701,15 @@ To check messages: \`vibe inbox\``
|
|
|
701
701
|
return {
|
|
702
702
|
display: `## Auth already in progress
|
|
703
703
|
|
|
704
|
-
Another login
|
|
704
|
+
Another login is running. Either:
|
|
705
|
+
1. **Complete it** in your browser, or
|
|
706
|
+
2. **Wait 30 seconds** and try again
|
|
707
|
+
|
|
708
|
+
If stuck, kill the auth server:
|
|
709
|
+
\`\`\`
|
|
710
|
+
lsof -ti:9876 | xargs kill
|
|
711
|
+
\`\`\`
|
|
712
|
+
Then run \`vibe init\` again.`
|
|
705
713
|
};
|
|
706
714
|
}
|
|
707
715
|
|
|
@@ -709,16 +717,26 @@ Another login flow is running. Complete it in your browser or wait a moment and
|
|
|
709
717
|
return {
|
|
710
718
|
display: `## Auth timed out
|
|
711
719
|
|
|
712
|
-
The login
|
|
720
|
+
The browser login wasn't completed within 2 minutes.
|
|
721
|
+
|
|
722
|
+
**Try again:**
|
|
723
|
+
Just say "add the vibe mcp server" and complete the browser auth faster this time.
|
|
724
|
+
|
|
725
|
+
**Tip:** Keep Claude Code visible so you can see when auth completes.`
|
|
713
726
|
};
|
|
714
727
|
}
|
|
715
728
|
|
|
716
729
|
return {
|
|
717
730
|
display: `## Failed to authenticate
|
|
718
731
|
|
|
719
|
-
Error
|
|
732
|
+
**Error:** ${err.message}
|
|
733
|
+
|
|
734
|
+
**Quick fixes:**
|
|
735
|
+
1. Check your internet connection
|
|
736
|
+
2. Try again: just say "vibe init"
|
|
737
|
+
3. Check status: slashvibe.dev/status
|
|
720
738
|
|
|
721
|
-
|
|
739
|
+
**Need help?** DM @seth on Twitter or email seth@slashvibe.dev`
|
|
722
740
|
};
|
|
723
741
|
}
|
|
724
742
|
}
|