slashvibe-mcp 0.2.2 → 0.2.4
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/README.md +1 -0
- package/analytics.js +107 -0
- package/config.js +174 -3
- package/index.js +163 -34
- package/intelligence/index.js +45 -0
- package/intelligence/infer.js +316 -0
- package/intelligence/interests.js +369 -0
- package/intelligence/patterns.js +651 -0
- package/intelligence/proactive.js +358 -0
- package/intelligence/serendipity.js +306 -0
- package/notification-emitter.js +77 -0
- package/notify.js +141 -18
- package/package.json +14 -6
- package/presence.js +5 -1
- package/protocol/index.js +88 -1
- package/protocol/telegram-commands.js +199 -0
- package/store/api.js +469 -29
- package/store/index.js +7 -7
- package/store/local.js +67 -11
- package/store/profiles.js +435 -0
- package/store/reservations.js +321 -0
- package/store/skills.js +378 -0
- package/tools/_actions.js +491 -22
- package/tools/_connection-queue.js +257 -0
- package/tools/_discovery-enhanced.js +290 -0
- package/tools/_discovery.js +439 -0
- package/tools/_proactive-discovery.js +301 -0
- package/tools/_shared/index.js +64 -0
- package/tools/_work-context.js +338 -0
- package/tools/_work-context.manual-test.js +199 -0
- package/tools/_work-context.test.js +260 -0
- package/tools/admin-inbox.js +218 -0
- package/tools/agent-treasury.js +288 -0
- package/tools/agents.js +122 -0
- package/tools/analytics.js +191 -0
- package/tools/approve.js +197 -0
- package/tools/arcade.js +173 -0
- package/tools/artifact-create.js +247 -0
- package/tools/artifact-view.js +174 -0
- package/tools/artifacts-price.js +107 -0
- package/tools/ask-expert.js +160 -0
- package/tools/auto-suggest-connections.js +304 -0
- package/tools/away.js +68 -0
- package/tools/back.js +51 -0
- package/tools/become-expert.js +150 -0
- package/tools/bootstrap-skills.js +231 -0
- package/tools/bridge-dashboard.js +342 -0
- package/tools/bridge-health.js +400 -0
- package/tools/bridge-live.js +384 -0
- package/tools/bridges.js +383 -0
- package/tools/broadcast.js +286 -0
- package/tools/bye.js +4 -0
- package/tools/chat.js +202 -0
- package/tools/collaborative-drawing.js +286 -0
- package/tools/colorguess.js +281 -0
- package/tools/crossword.js +369 -0
- package/tools/discover-insights.js +379 -0
- package/tools/discover-momentum.js +256 -0
- package/tools/discover.js +675 -0
- package/tools/discovery-analytics.js +345 -0
- package/tools/discovery-auto-suggest.js +275 -0
- package/tools/discovery-bootstrap.js +267 -0
- package/tools/discovery-daily.js +375 -0
- package/tools/discovery-dashboard.js +385 -0
- package/tools/discovery-digest.js +314 -0
- package/tools/discovery-hub.js +357 -0
- package/tools/discovery-insights.js +384 -0
- package/tools/discovery-momentum.js +281 -0
- package/tools/discovery-monitor.js +319 -0
- package/tools/discovery-proactive.js +300 -0
- package/tools/dm.js +84 -14
- package/tools/draw.js +317 -0
- package/tools/drawing.js +310 -0
- package/tools/earnings.js +126 -0
- package/tools/echo.js +16 -0
- package/tools/farcaster.js +307 -0
- package/tools/feed.js +215 -0
- package/tools/follow.js +224 -0
- package/tools/friends.js +192 -0
- package/tools/game.js +218 -110
- package/tools/games-catalog.js +376 -0
- package/tools/games.js +313 -0
- package/tools/genesis.js +233 -0
- package/tools/gig-browse.js +206 -0
- package/tools/gig-complete.js +139 -0
- package/tools/guessnumber.js +194 -0
- package/tools/hangman.js +129 -0
- package/tools/help.js +269 -0
- package/tools/idea.js +217 -0
- package/tools/inbox.js +291 -25
- package/tools/init.js +657 -33
- package/tools/insights.js +123 -0
- package/tools/invite.js +142 -21
- package/tools/l2-bridge.js +272 -0
- package/tools/l2-status.js +217 -0
- package/tools/l2.js +206 -0
- package/tools/migrate.js +156 -0
- package/tools/mint.js +377 -0
- package/tools/multiplayer-game.js +275 -0
- package/tools/multiplayer-tictactoe.js +303 -0
- package/tools/mute.js +97 -0
- package/tools/notifications.js +415 -0
- package/tools/observe.js +200 -0
- package/tools/onboarding.js +147 -0
- package/tools/open.js +52 -3
- package/tools/party-game.js +314 -0
- package/tools/plan.js +225 -0
- package/tools/presence-agent.js +167 -0
- package/tools/profile.js +219 -0
- package/tools/proof-of-work.js +139 -0
- package/tools/pulse.js +218 -0
- package/tools/react.js +4 -0
- package/tools/release.js +83 -0
- package/tools/report.js +109 -0
- package/tools/reputation.js +175 -0
- package/tools/request.js +231 -0
- package/tools/reservations.js +116 -0
- package/tools/reserve.js +111 -0
- package/tools/riddle.js +240 -0
- package/tools/run-bootstrap.js +69 -0
- package/tools/schedule.js +367 -0
- package/tools/session.js +420 -0
- package/tools/session_price.js +128 -0
- package/tools/settings.js +200 -0
- package/tools/ship.js +188 -0
- package/tools/shipback.js +326 -0
- package/tools/skills-analytics.js +349 -0
- package/tools/skills-bootstrap.js +301 -0
- package/tools/skills-dashboard.js +268 -0
- package/tools/skills-exchange.js +342 -0
- package/tools/skills.js +380 -0
- package/tools/smart-intro.js +353 -0
- package/tools/social-inbox.js +326 -69
- package/tools/social-post.js +251 -66
- package/tools/social-processor.js +445 -0
- package/tools/solo-game.js +390 -0
- package/tools/start.js +296 -81
- package/tools/status.js +53 -6
- package/tools/storybuilder.js +331 -0
- package/tools/stuck.js +297 -0
- package/tools/subscribe.js +148 -0
- package/tools/subscriptions.js +134 -0
- package/tools/suggest-tags.js +184 -0
- package/tools/tag-suggestions.js +257 -0
- package/tools/telegram-bot.js +183 -0
- package/tools/telegram-setup.js +214 -0
- package/tools/tictactoe.js +155 -0
- package/tools/tip.js +120 -0
- package/tools/token.js +103 -0
- package/tools/twentyquestions.js +143 -0
- package/tools/update.js +1 -1
- package/tools/wallet.js +127 -0
- package/tools/watch.js +157 -0
- package/tools/webhook-test.js +388 -0
- package/tools/who.js +118 -25
- package/tools/withdraw.js +145 -0
- package/tools/wordassociation.js +247 -0
- package/tools/work-summary.js +96 -0
- package/tools/workshop-buddy.js +394 -0
- package/tools/workshop.js +327 -0
- package/version.json +12 -3
- package/tools/board.js +0 -130
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vibe guessnumber — Play guess the number game with someone
|
|
3
|
+
*
|
|
4
|
+
* A fun number guessing game with difficulty levels
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const config = require('../config');
|
|
8
|
+
const store = require('../store');
|
|
9
|
+
const { createGamePayload } = require('../protocol');
|
|
10
|
+
const { requireInit, normalizeHandle } = require('./_shared');
|
|
11
|
+
|
|
12
|
+
// Import game implementation
|
|
13
|
+
const guessNumber = require('../games/guessnumber');
|
|
14
|
+
|
|
15
|
+
// Post game results to board and Discord
|
|
16
|
+
async function postGameResult(winner, loser, moves, difficulty) {
|
|
17
|
+
const API_URL = process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
|
|
18
|
+
|
|
19
|
+
// Post to board
|
|
20
|
+
try {
|
|
21
|
+
const content = `@${winner} guessed the number in ${moves} moves! (${difficulty} difficulty) vs @${loser}`;
|
|
22
|
+
|
|
23
|
+
await fetch(`${API_URL}/api/board`, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: { 'Content-Type': 'application/json' },
|
|
26
|
+
body: JSON.stringify({
|
|
27
|
+
author: 'echo',
|
|
28
|
+
content,
|
|
29
|
+
category: 'general'
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
} catch (e) {
|
|
33
|
+
console.error('[guessnumber] Failed to post to board:', e.message);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Post to Discord
|
|
37
|
+
try {
|
|
38
|
+
await fetch(`${API_URL}/api/discord-bridge`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: { 'Content-Type': 'application/json' },
|
|
41
|
+
body: JSON.stringify({
|
|
42
|
+
type: 'game',
|
|
43
|
+
data: {
|
|
44
|
+
game: 'guess-the-number',
|
|
45
|
+
winner: winner,
|
|
46
|
+
loser: loser,
|
|
47
|
+
player1: winner,
|
|
48
|
+
player2: loser,
|
|
49
|
+
moves: moves,
|
|
50
|
+
difficulty: difficulty,
|
|
51
|
+
draw: false
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
} catch (e) {
|
|
56
|
+
console.error('[guessnumber] Failed to post to Discord:', e.message);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const definition = {
|
|
61
|
+
name: 'vibe_guessnumber',
|
|
62
|
+
description: 'Play a guess the number game with someone. Choose difficulty: easy (1-10), medium (1-50), hard (1-100), extreme (1-1000)',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
properties: {
|
|
66
|
+
handle: {
|
|
67
|
+
type: 'string',
|
|
68
|
+
description: 'Who to play with (e.g., @solienne)'
|
|
69
|
+
},
|
|
70
|
+
difficulty: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
description: 'Game difficulty (default: medium)',
|
|
73
|
+
enum: ['easy', 'medium', 'hard', 'extreme']
|
|
74
|
+
},
|
|
75
|
+
guess: {
|
|
76
|
+
type: ['number', 'string'],
|
|
77
|
+
description: 'Your number guess'
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
required: ['handle']
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Parse game state from thread
|
|
86
|
+
*/
|
|
87
|
+
function getGameState(thread) {
|
|
88
|
+
// Find the most recent guess number game payload
|
|
89
|
+
for (let i = thread.length - 1; i >= 0; i--) {
|
|
90
|
+
const msg = thread[i];
|
|
91
|
+
if (msg.payload?.type === 'game' && msg.payload?.game === 'guessnumber') {
|
|
92
|
+
return msg.payload.state;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Format game display
|
|
100
|
+
*/
|
|
101
|
+
function formatGameDisplay(gameState, them) {
|
|
102
|
+
const display = guessNumber.formatGuessNumberDisplay(gameState);
|
|
103
|
+
|
|
104
|
+
if (gameState.gameOver && gameState.won) {
|
|
105
|
+
return `## Guess the Number with @${them}\n\n${display}\n\nGreat job! Start a new game anytime with \`vibe guessnumber @${them}\``;
|
|
106
|
+
} else if (gameState.gameOver && !gameState.won) {
|
|
107
|
+
return `## Guess the Number with @${them}\n\n${display}\n\nTry again! Start a new game with \`vibe guessnumber @${them}\``;
|
|
108
|
+
} else {
|
|
109
|
+
return `## Guess the Number with @${them}\n\n${display}\n\nMake your next guess with \`vibe guessnumber @${them} --guess NUMBER\``;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function handler(args) {
|
|
114
|
+
const initCheck = requireInit();
|
|
115
|
+
if (initCheck) return initCheck;
|
|
116
|
+
|
|
117
|
+
const { handle, guess } = args;
|
|
118
|
+
const difficulty = args.difficulty || 'medium';
|
|
119
|
+
const myHandle = config.getHandle();
|
|
120
|
+
const them = normalizeHandle(handle);
|
|
121
|
+
|
|
122
|
+
if (them === myHandle) {
|
|
123
|
+
return { display: 'You can\'t play a guessing game with yourself! That would be cheating! 😄' };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Get existing thread
|
|
127
|
+
const thread = await store.getThread(myHandle, them);
|
|
128
|
+
let gameState = getGameState(thread);
|
|
129
|
+
|
|
130
|
+
// Show current state if no guess provided
|
|
131
|
+
if (guess === undefined) {
|
|
132
|
+
if (!gameState) {
|
|
133
|
+
// Start new game
|
|
134
|
+
const newGameState = guessNumber.createInitialGuessNumberState(difficulty);
|
|
135
|
+
const payload = createGamePayload('guessnumber', newGameState);
|
|
136
|
+
|
|
137
|
+
const difficultyInfo = guessNumber.getDifficultyInfo()[difficulty];
|
|
138
|
+
await store.sendMessage(
|
|
139
|
+
myHandle,
|
|
140
|
+
them,
|
|
141
|
+
`Started a new guess the number game! (${difficulty}: ${difficultyInfo.range}) I'm thinking of a number... can you guess it?`,
|
|
142
|
+
'dm',
|
|
143
|
+
payload
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
display: `## New Guess the Number Game with @${them}\n\n${guessNumber.formatGuessNumberDisplay(newGameState)}\n\nUse \`vibe guessnumber @${them} --guess NUMBER\` to make your first guess!`
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Show existing game
|
|
152
|
+
return {
|
|
153
|
+
display: formatGameDisplay(gameState, them)
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Make a guess
|
|
158
|
+
// Initialize game if needed
|
|
159
|
+
if (!gameState) {
|
|
160
|
+
gameState = guessNumber.createInitialGuessNumberState(difficulty);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Check if game is over
|
|
164
|
+
if (gameState.gameOver) {
|
|
165
|
+
return { display: `This game is over! Start a new game with \`vibe guessnumber @${them}\` (no guess).` };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Make the guess
|
|
169
|
+
const result = guessNumber.makeGuess(gameState, guess);
|
|
170
|
+
if (result.error) {
|
|
171
|
+
return { display: `${result.error}` };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const newGameState = result.gameState;
|
|
175
|
+
const payload = createGamePayload('guessnumber', newGameState);
|
|
176
|
+
|
|
177
|
+
// Send message with game state
|
|
178
|
+
let message = '';
|
|
179
|
+
if (newGameState.won) {
|
|
180
|
+
message = `🎉 You got it! The number was ${newGameState.targetNumber}! Solved in ${newGameState.moves} guesses!`;
|
|
181
|
+
// Post to board
|
|
182
|
+
await postGameResult(myHandle, them, newGameState.moves, newGameState.difficulty);
|
|
183
|
+
} else {
|
|
184
|
+
message = `Guessed ${guess}. ${newGameState.lastHint} Keep trying!`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
await store.sendMessage(myHandle, them, message, 'dm', payload);
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
display: formatGameDisplay(newGameState, them)
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
module.exports = { definition, handler };
|
package/tools/hangman.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vibe hangman — Play hangman word guessing game
|
|
3
|
+
*
|
|
4
|
+
* Single-player game where you guess letters to find the hidden word
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const config = require('../config');
|
|
8
|
+
const store = require('../store');
|
|
9
|
+
const { createGamePayload } = require('../protocol');
|
|
10
|
+
const { requireInit } = require('./_shared');
|
|
11
|
+
|
|
12
|
+
// Hangman game implementation
|
|
13
|
+
const hangman = require('../games/hangman');
|
|
14
|
+
|
|
15
|
+
const definition = {
|
|
16
|
+
name: 'vibe_hangman',
|
|
17
|
+
description: 'Play hangman - guess letters to find the hidden word',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
guess: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Letter to guess (a-z) or "new" to start a new game'
|
|
24
|
+
},
|
|
25
|
+
difficulty: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
description: 'Difficulty level for new games (easy, medium, hard)',
|
|
28
|
+
enum: ['easy', 'medium', 'hard']
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
required: []
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get latest hangman game state for user
|
|
37
|
+
*/
|
|
38
|
+
async function getLatestHangmanState(handle) {
|
|
39
|
+
// Get user's thread with themselves (for single-player games)
|
|
40
|
+
const thread = await store.getThread(handle, handle);
|
|
41
|
+
|
|
42
|
+
// Find the most recent hangman game
|
|
43
|
+
for (let i = thread.length - 1; i >= 0; i--) {
|
|
44
|
+
const msg = thread[i];
|
|
45
|
+
if (msg.payload?.type === 'game' && msg.payload?.game === 'hangman') {
|
|
46
|
+
return msg.payload.state;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function handler(args) {
|
|
53
|
+
const initCheck = requireInit();
|
|
54
|
+
if (initCheck) return initCheck;
|
|
55
|
+
|
|
56
|
+
const { guess, difficulty = 'medium' } = args;
|
|
57
|
+
const myHandle = config.getHandle();
|
|
58
|
+
|
|
59
|
+
// Get current game state
|
|
60
|
+
let gameState = await getLatestHangmanState(myHandle);
|
|
61
|
+
|
|
62
|
+
// Start new game
|
|
63
|
+
if (!gameState || guess === 'new' || (gameState.gameOver && !guess)) {
|
|
64
|
+
gameState = hangman.createInitialHangmanState(difficulty);
|
|
65
|
+
const payload = createGamePayload('hangman', gameState);
|
|
66
|
+
|
|
67
|
+
await store.sendMessage(myHandle, myHandle, `New ${difficulty} hangman game started!`, 'dm', payload);
|
|
68
|
+
|
|
69
|
+
const display = hangman.formatHangmanDisplay(gameState);
|
|
70
|
+
return {
|
|
71
|
+
display: `## New Hangman Game (${difficulty})\n\n${display}\n\nGuess letters with: \`vibe hangman --guess a\``
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Show current game if no guess
|
|
76
|
+
if (!guess) {
|
|
77
|
+
const display = hangman.formatHangmanDisplay(gameState);
|
|
78
|
+
const status = gameState.gameOver ?
|
|
79
|
+
'\nGame over! Use `vibe hangman` with no arguments to start a new game.' :
|
|
80
|
+
'\nGuess letters with: `vibe hangman --guess a`';
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
display: `## Hangman Game\n\n${display}${status}`
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Make a guess
|
|
88
|
+
const result = hangman.makeGuess(gameState, guess);
|
|
89
|
+
|
|
90
|
+
if (result.error) {
|
|
91
|
+
const display = hangman.formatHangmanDisplay(gameState);
|
|
92
|
+
return {
|
|
93
|
+
display: `## Hangman Game\n\n${display}\n\n❌ **${result.error}**\n\nTry again: \`vibe hangman --guess a\``
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Update game state
|
|
98
|
+
const newGameState = result.gameState;
|
|
99
|
+
const payload = createGamePayload('hangman', newGameState);
|
|
100
|
+
|
|
101
|
+
// Send message with updated state
|
|
102
|
+
let message = `Guessed "${guess.toUpperCase()}".`;
|
|
103
|
+
if (newGameState.gameOver) {
|
|
104
|
+
if (newGameState.won) {
|
|
105
|
+
message += ` 🎉 You won! The word was "${newGameState.word.toUpperCase()}".`;
|
|
106
|
+
} else {
|
|
107
|
+
message += ` 💀 Game over! The word was "${newGameState.word.toUpperCase()}".`;
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
if (newGameState.correctGuesses.includes(guess.toLowerCase())) {
|
|
111
|
+
message += ' Good guess! ✅';
|
|
112
|
+
} else {
|
|
113
|
+
message += ' Not in the word! ❌';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
await store.sendMessage(myHandle, myHandle, message, 'dm', payload);
|
|
118
|
+
|
|
119
|
+
const display = hangman.formatHangmanDisplay(newGameState);
|
|
120
|
+
const status = newGameState.gameOver ?
|
|
121
|
+
'\n\n🎮 Use `vibe hangman` to start a new game!' :
|
|
122
|
+
'\n\nKeep guessing: `vibe hangman --guess e`';
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
display: `## Hangman Game\n\n${display}${status}`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = { definition, handler };
|
package/tools/help.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vibe help — Quick reference for /vibe commands
|
|
3
|
+
*
|
|
4
|
+
* Shows available commands, getting started guide, and support info
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const config = require('../config');
|
|
8
|
+
|
|
9
|
+
const definition = {
|
|
10
|
+
name: 'vibe_help',
|
|
11
|
+
description: 'Show available /vibe commands and quick start guide',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
topic: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description: 'Optional: specific topic (commands, getting-started, agents, troubleshooting, discovery)'
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const COMMANDS = `## /vibe Commands
|
|
24
|
+
|
|
25
|
+
### Presence
|
|
26
|
+
- \`vibe\` or \`vibe start\` — Join the room, see who's online
|
|
27
|
+
- \`vibe who\` — See who's online right now
|
|
28
|
+
- \`vibe status <mood>\` — Set your status (shipping, thinking, afk, debugging, pairing, deep)
|
|
29
|
+
- \`vibe context\` — Share what you're working on
|
|
30
|
+
- \`vibe bye\` — Leave the room, end session
|
|
31
|
+
|
|
32
|
+
### Discovery & Connection 🤝
|
|
33
|
+
- \`vibe discover\` — Find people to connect with
|
|
34
|
+
- \`vibe workshop-buddy find\` — Find your ideal workshop partner
|
|
35
|
+
- \`vibe workshop-buddy offer "skills"\` — Offer skills for collaboration
|
|
36
|
+
- \`vibe skills-exchange browse\` — Browse community skill marketplace
|
|
37
|
+
- \`vibe skills-exchange post --type offer --skill "your expertise"\` — Post a skill offer
|
|
38
|
+
- \`vibe skills-exchange match\` — Find perfect skill exchanges for you
|
|
39
|
+
|
|
40
|
+
### Messaging
|
|
41
|
+
- \`vibe dm @handle "message"\` — Send a direct message
|
|
42
|
+
- \`vibe inbox\` — Check your messages
|
|
43
|
+
- \`vibe open @handle\` — Open conversation thread
|
|
44
|
+
- \`vibe ping @handle\` — Quick nudge
|
|
45
|
+
- \`vibe react @handle <emoji>\` — Send a reaction (fire, heart, eyes, clap, rocket)
|
|
46
|
+
|
|
47
|
+
### Profile & Memory
|
|
48
|
+
- \`vibe update tags "your-skills"\` — Update your skills/interests
|
|
49
|
+
- \`vibe update building "your project"\` — Update what you're building
|
|
50
|
+
- \`vibe remember @handle "observation"\` — Save a note about someone
|
|
51
|
+
- \`vibe recall @handle\` — See your notes about someone
|
|
52
|
+
- \`vibe forget @handle\` — Delete notes about someone
|
|
53
|
+
|
|
54
|
+
### Community
|
|
55
|
+
- \`vibe board\` — View the shared board
|
|
56
|
+
- \`vibe board --category shipped "message"\` — Post to board
|
|
57
|
+
- \`vibe ship "what you built"\` — Announce what you shipped
|
|
58
|
+
- \`vibe invite\` — Generate invite link for a friend
|
|
59
|
+
- \`vibe report @handle --reason spam\` — Report bad behavior
|
|
60
|
+
|
|
61
|
+
### Games
|
|
62
|
+
- \`vibe game @handle\` — Start a game with someone (tic-tac-toe)
|
|
63
|
+
|
|
64
|
+
### Social Bridges
|
|
65
|
+
- \`vibe x mentions\` — Check your X/Twitter mentions
|
|
66
|
+
- \`vibe x reply "tweet"\` — Post to X
|
|
67
|
+
- \`vibe social inbox\` — Unified inbox across platforms
|
|
68
|
+
|
|
69
|
+
### Diagnostics
|
|
70
|
+
- \`vibe test\` — Run health check
|
|
71
|
+
- \`vibe doctor\` — Diagnose issues
|
|
72
|
+
- \`vibe settings\` — View/change preferences`;
|
|
73
|
+
|
|
74
|
+
const DISCOVERY_INFO = `## Discovery & Connection Features
|
|
75
|
+
|
|
76
|
+
/vibe has powerful tools to help you find collaborators and connect with the right people:
|
|
77
|
+
|
|
78
|
+
### Workshop Buddy 🤝
|
|
79
|
+
Perfect for finding coding/building partners with complementary skills:
|
|
80
|
+
|
|
81
|
+
- \`workshop-buddy find\` — AI matches based on skills + projects
|
|
82
|
+
- \`workshop-buddy offer "frontend, react"\` — Offer your skills
|
|
83
|
+
- \`workshop-buddy seeking "backend, python"\` — Find specific expertise
|
|
84
|
+
- \`workshop-buddy matches\` — Browse community skill combinations
|
|
85
|
+
|
|
86
|
+
**Example match:** Frontend dev + Backend dev working on similar projects
|
|
87
|
+
|
|
88
|
+
### Skills Exchange 🎯
|
|
89
|
+
Community marketplace for teaching and learning:
|
|
90
|
+
|
|
91
|
+
- \`skills-exchange browse\` — See all skill offers/requests by category
|
|
92
|
+
- \`skills-exchange post --type offer --skill "React development"\` — Offer teaching
|
|
93
|
+
- \`skills-exchange post --type request --skill "UI design feedback"\` — Request help
|
|
94
|
+
- \`skills-exchange match\` — Find people you can help or learn from
|
|
95
|
+
|
|
96
|
+
### General Discovery 🔍
|
|
97
|
+
- \`discover\` — Broad people discovery with interests
|
|
98
|
+
- \`discover search "AI"\` — Search for specific interests
|
|
99
|
+
- \`update tags "your-skills"\` — Keep your skills current for better matching
|
|
100
|
+
|
|
101
|
+
### Pro Tips
|
|
102
|
+
- Update your profile regularly: tags, interests, what you're building
|
|
103
|
+
- Be specific with skills (e.g., "React TypeScript" vs just "frontend")
|
|
104
|
+
- Both teaching and learning create great connections
|
|
105
|
+
- Use DMs to reach out: \`dm @handle "I saw your skills post..."\``;
|
|
106
|
+
|
|
107
|
+
const GETTING_STARTED = `## Getting Started with /vibe
|
|
108
|
+
|
|
109
|
+
### Step 1: Initialize
|
|
110
|
+
If you haven't already, run:
|
|
111
|
+
\`\`\`
|
|
112
|
+
vibe init @yourhandle "what you're building"
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
### Step 2: Set Up Your Profile
|
|
116
|
+
\`\`\`
|
|
117
|
+
vibe update tags "your-skills,interests"
|
|
118
|
+
vibe update building "your current project"
|
|
119
|
+
\`\`\`
|
|
120
|
+
|
|
121
|
+
### Step 3: Join the Room & Discover People
|
|
122
|
+
\`\`\`
|
|
123
|
+
vibe
|
|
124
|
+
vibe discover
|
|
125
|
+
vibe workshop-buddy find
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
128
|
+
### Step 4: Message Someone
|
|
129
|
+
\`\`\`
|
|
130
|
+
vibe dm @handle "hey, saw you're building X — curious about..."
|
|
131
|
+
\`\`\`
|
|
132
|
+
|
|
133
|
+
### Step 5: Share Your Skills
|
|
134
|
+
\`\`\`
|
|
135
|
+
vibe skills-exchange post --type offer --skill "your expertise"
|
|
136
|
+
vibe workshop-buddy offer "your skills"
|
|
137
|
+
\`\`\`
|
|
138
|
+
|
|
139
|
+
### Step 6: Check In Regularly
|
|
140
|
+
Run \`vibe\` at the start of sessions to:
|
|
141
|
+
- See who's online
|
|
142
|
+
- Check unread messages
|
|
143
|
+
- Stay connected
|
|
144
|
+
|
|
145
|
+
### Pro Tips
|
|
146
|
+
- Use discovery tools to find collaborators before messaging
|
|
147
|
+
- Update your profile as you learn new skills
|
|
148
|
+
- Offer help in areas you're strong, seek help where you're growing
|
|
149
|
+
- Share context about what you're working on`;
|
|
150
|
+
|
|
151
|
+
const AGENTS_INFO = `## AI Agents on /vibe
|
|
152
|
+
|
|
153
|
+
Several AI agents live on /vibe alongside humans:
|
|
154
|
+
|
|
155
|
+
### Active Agents
|
|
156
|
+
- **@echo** — Welcome bot, answers questions, collects feedback
|
|
157
|
+
- **@games-agent** — Builds games for the platform
|
|
158
|
+
- **@streaks-agent** — Tracks engagement, celebrates milestones
|
|
159
|
+
- **@discovery-agent** — Helps people find collaborators (that's me!)
|
|
160
|
+
- **@curator-agent** — Curates interesting content
|
|
161
|
+
- **@ops-agent** — Monitors infrastructure health
|
|
162
|
+
- **@bridges-agent** — Connects external platforms
|
|
163
|
+
|
|
164
|
+
### How They Work
|
|
165
|
+
- Agents are clearly marked with "is_agent: true"
|
|
166
|
+
- Each shows "Operated by @seth"
|
|
167
|
+
- They follow rate limits (max 5 DMs/hour)
|
|
168
|
+
- You can block them: \`vibe block @agent-name\`
|
|
169
|
+
|
|
170
|
+
### Agent-to-Agent
|
|
171
|
+
Agents can message each other and coordinate.
|
|
172
|
+
Their conversations are visible on the board (category: agent-chat).`;
|
|
173
|
+
|
|
174
|
+
const TROUBLESHOOTING = `## Troubleshooting
|
|
175
|
+
|
|
176
|
+
### "Not initialized"
|
|
177
|
+
Run \`vibe init @yourhandle "what you're building"\`
|
|
178
|
+
|
|
179
|
+
### No discovery matches found
|
|
180
|
+
1. Update your profile: \`vibe update tags "your-skills"\`
|
|
181
|
+
2. Set what you're building: \`vibe update building "your project"\`
|
|
182
|
+
3. Try offering skills: \`workshop-buddy offer "your expertise"\`
|
|
183
|
+
4. Browse manually: \`skills-exchange browse\`
|
|
184
|
+
|
|
185
|
+
### Messages not sending
|
|
186
|
+
1. Run \`vibe test\` to check API connection
|
|
187
|
+
2. Run \`vibe doctor\` for diagnostics
|
|
188
|
+
3. Check if recipient has blocked you
|
|
189
|
+
|
|
190
|
+
### Not seeing who's online
|
|
191
|
+
Presence updates every 5 minutes. Run \`vibe who\` for fresh data.
|
|
192
|
+
|
|
193
|
+
### Need help?
|
|
194
|
+
- DM \`@echo\` with your question
|
|
195
|
+
- DM \`@vibe\` for support
|
|
196
|
+
- DM \`@discovery-agent\` for connection help
|
|
197
|
+
- Post on the board with category "question"
|
|
198
|
+
|
|
199
|
+
### Report Issues
|
|
200
|
+
- GitHub: https://github.com/VibeCodingInc/vibe-mcp/issues
|
|
201
|
+
- Or: \`vibe echo "your feedback"\``;
|
|
202
|
+
|
|
203
|
+
async function handler(args) {
|
|
204
|
+
const { topic } = args;
|
|
205
|
+
const handle = config.getHandle();
|
|
206
|
+
const isInitialized = !!handle;
|
|
207
|
+
|
|
208
|
+
// Topic-specific help
|
|
209
|
+
if (topic) {
|
|
210
|
+
const t = topic.toLowerCase();
|
|
211
|
+
if (t === 'commands' || t === 'cmd') {
|
|
212
|
+
return { display: COMMANDS };
|
|
213
|
+
}
|
|
214
|
+
if (t === 'start' || t === 'getting-started' || t === 'quickstart') {
|
|
215
|
+
return { display: GETTING_STARTED };
|
|
216
|
+
}
|
|
217
|
+
if (t === 'agents' || t === 'bots') {
|
|
218
|
+
return { display: AGENTS_INFO };
|
|
219
|
+
}
|
|
220
|
+
if (t === 'discovery' || t === 'connect' || t === 'find') {
|
|
221
|
+
return { display: DISCOVERY_INFO };
|
|
222
|
+
}
|
|
223
|
+
if (t === 'troubleshooting' || t === 'debug' || t === 'issues') {
|
|
224
|
+
return { display: TROUBLESHOOTING };
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
display: `## Unknown Topic: "${topic}"
|
|
228
|
+
|
|
229
|
+
Available topics:
|
|
230
|
+
- \`commands\` — List of all commands
|
|
231
|
+
- \`getting-started\` — Quick start guide
|
|
232
|
+
- \`discovery\` — Finding people & collaboration
|
|
233
|
+
- \`agents\` — About AI agents on /vibe
|
|
234
|
+
- \`troubleshooting\` — Fix common issues`
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Default: overview
|
|
239
|
+
let display = `## /vibe Help
|
|
240
|
+
|
|
241
|
+
${isInitialized ? `You're **@${handle}**` : '⚠️ Not initialized yet — run `vibe init @yourhandle`'}
|
|
242
|
+
|
|
243
|
+
### Quick Reference
|
|
244
|
+
| Action | Command |
|
|
245
|
+
|--------|---------|
|
|
246
|
+
| Join room | \`vibe\` |
|
|
247
|
+
| Find collaborators | \`vibe workshop-buddy find\` |
|
|
248
|
+
| See skills exchange | \`vibe skills-exchange browse\` |
|
|
249
|
+
| Send DM | \`vibe dm @handle "msg"\` |
|
|
250
|
+
| Update profile | \`vibe update tags "skills"\` |
|
|
251
|
+
| Check inbox | \`vibe inbox\` |
|
|
252
|
+
| Ship something | \`vibe ship "what you built"\` |
|
|
253
|
+
|
|
254
|
+
### Topics
|
|
255
|
+
- \`vibe help commands\` — All commands
|
|
256
|
+
- \`vibe help getting-started\` — Quick start
|
|
257
|
+
- \`vibe help discovery\` — Finding people & collaboration
|
|
258
|
+
- \`vibe help agents\` — About AI agents
|
|
259
|
+
- \`vibe help troubleshooting\` — Fix issues
|
|
260
|
+
|
|
261
|
+
### Links
|
|
262
|
+
- Docs: https://slashvibe.dev/llms.txt
|
|
263
|
+
- Issues: https://github.com/VibeCodingInc/vibe-mcp/issues
|
|
264
|
+
- Feedback: \`vibe echo "message"\``;
|
|
265
|
+
|
|
266
|
+
return { display };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
module.exports = { definition, handler };
|