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.
Files changed (162) hide show
  1. package/README.md +1 -0
  2. package/analytics.js +107 -0
  3. package/config.js +174 -3
  4. package/index.js +163 -34
  5. package/intelligence/index.js +45 -0
  6. package/intelligence/infer.js +316 -0
  7. package/intelligence/interests.js +369 -0
  8. package/intelligence/patterns.js +651 -0
  9. package/intelligence/proactive.js +358 -0
  10. package/intelligence/serendipity.js +306 -0
  11. package/notification-emitter.js +77 -0
  12. package/notify.js +141 -18
  13. package/package.json +14 -6
  14. package/presence.js +5 -1
  15. package/protocol/index.js +88 -1
  16. package/protocol/telegram-commands.js +199 -0
  17. package/store/api.js +469 -29
  18. package/store/index.js +7 -7
  19. package/store/local.js +67 -11
  20. package/store/profiles.js +435 -0
  21. package/store/reservations.js +321 -0
  22. package/store/skills.js +378 -0
  23. package/tools/_actions.js +491 -22
  24. package/tools/_connection-queue.js +257 -0
  25. package/tools/_discovery-enhanced.js +290 -0
  26. package/tools/_discovery.js +439 -0
  27. package/tools/_proactive-discovery.js +301 -0
  28. package/tools/_shared/index.js +64 -0
  29. package/tools/_work-context.js +338 -0
  30. package/tools/_work-context.manual-test.js +199 -0
  31. package/tools/_work-context.test.js +260 -0
  32. package/tools/admin-inbox.js +218 -0
  33. package/tools/agent-treasury.js +288 -0
  34. package/tools/agents.js +122 -0
  35. package/tools/analytics.js +191 -0
  36. package/tools/approve.js +197 -0
  37. package/tools/arcade.js +173 -0
  38. package/tools/artifact-create.js +247 -0
  39. package/tools/artifact-view.js +174 -0
  40. package/tools/artifacts-price.js +107 -0
  41. package/tools/ask-expert.js +160 -0
  42. package/tools/auto-suggest-connections.js +304 -0
  43. package/tools/away.js +68 -0
  44. package/tools/back.js +51 -0
  45. package/tools/become-expert.js +150 -0
  46. package/tools/bootstrap-skills.js +231 -0
  47. package/tools/bridge-dashboard.js +342 -0
  48. package/tools/bridge-health.js +400 -0
  49. package/tools/bridge-live.js +384 -0
  50. package/tools/bridges.js +383 -0
  51. package/tools/broadcast.js +286 -0
  52. package/tools/bye.js +4 -0
  53. package/tools/chat.js +202 -0
  54. package/tools/collaborative-drawing.js +286 -0
  55. package/tools/colorguess.js +281 -0
  56. package/tools/crossword.js +369 -0
  57. package/tools/discover-insights.js +379 -0
  58. package/tools/discover-momentum.js +256 -0
  59. package/tools/discover.js +675 -0
  60. package/tools/discovery-analytics.js +345 -0
  61. package/tools/discovery-auto-suggest.js +275 -0
  62. package/tools/discovery-bootstrap.js +267 -0
  63. package/tools/discovery-daily.js +375 -0
  64. package/tools/discovery-dashboard.js +385 -0
  65. package/tools/discovery-digest.js +314 -0
  66. package/tools/discovery-hub.js +357 -0
  67. package/tools/discovery-insights.js +384 -0
  68. package/tools/discovery-momentum.js +281 -0
  69. package/tools/discovery-monitor.js +319 -0
  70. package/tools/discovery-proactive.js +300 -0
  71. package/tools/dm.js +84 -14
  72. package/tools/draw.js +317 -0
  73. package/tools/drawing.js +310 -0
  74. package/tools/earnings.js +126 -0
  75. package/tools/echo.js +16 -0
  76. package/tools/farcaster.js +307 -0
  77. package/tools/feed.js +215 -0
  78. package/tools/follow.js +224 -0
  79. package/tools/friends.js +192 -0
  80. package/tools/game.js +218 -110
  81. package/tools/games-catalog.js +376 -0
  82. package/tools/games.js +313 -0
  83. package/tools/genesis.js +233 -0
  84. package/tools/gig-browse.js +206 -0
  85. package/tools/gig-complete.js +139 -0
  86. package/tools/guessnumber.js +194 -0
  87. package/tools/hangman.js +129 -0
  88. package/tools/help.js +269 -0
  89. package/tools/idea.js +217 -0
  90. package/tools/inbox.js +291 -25
  91. package/tools/init.js +657 -33
  92. package/tools/insights.js +123 -0
  93. package/tools/invite.js +142 -21
  94. package/tools/l2-bridge.js +272 -0
  95. package/tools/l2-status.js +217 -0
  96. package/tools/l2.js +206 -0
  97. package/tools/migrate.js +156 -0
  98. package/tools/mint.js +377 -0
  99. package/tools/multiplayer-game.js +275 -0
  100. package/tools/multiplayer-tictactoe.js +303 -0
  101. package/tools/mute.js +97 -0
  102. package/tools/notifications.js +415 -0
  103. package/tools/observe.js +200 -0
  104. package/tools/onboarding.js +147 -0
  105. package/tools/open.js +52 -3
  106. package/tools/party-game.js +314 -0
  107. package/tools/plan.js +225 -0
  108. package/tools/presence-agent.js +167 -0
  109. package/tools/profile.js +219 -0
  110. package/tools/proof-of-work.js +139 -0
  111. package/tools/pulse.js +218 -0
  112. package/tools/react.js +4 -0
  113. package/tools/release.js +83 -0
  114. package/tools/report.js +109 -0
  115. package/tools/reputation.js +175 -0
  116. package/tools/request.js +231 -0
  117. package/tools/reservations.js +116 -0
  118. package/tools/reserve.js +111 -0
  119. package/tools/riddle.js +240 -0
  120. package/tools/run-bootstrap.js +69 -0
  121. package/tools/schedule.js +367 -0
  122. package/tools/session.js +420 -0
  123. package/tools/session_price.js +128 -0
  124. package/tools/settings.js +200 -0
  125. package/tools/ship.js +188 -0
  126. package/tools/shipback.js +326 -0
  127. package/tools/skills-analytics.js +349 -0
  128. package/tools/skills-bootstrap.js +301 -0
  129. package/tools/skills-dashboard.js +268 -0
  130. package/tools/skills-exchange.js +342 -0
  131. package/tools/skills.js +380 -0
  132. package/tools/smart-intro.js +353 -0
  133. package/tools/social-inbox.js +326 -69
  134. package/tools/social-post.js +251 -66
  135. package/tools/social-processor.js +445 -0
  136. package/tools/solo-game.js +390 -0
  137. package/tools/start.js +296 -81
  138. package/tools/status.js +53 -6
  139. package/tools/storybuilder.js +331 -0
  140. package/tools/stuck.js +297 -0
  141. package/tools/subscribe.js +148 -0
  142. package/tools/subscriptions.js +134 -0
  143. package/tools/suggest-tags.js +184 -0
  144. package/tools/tag-suggestions.js +257 -0
  145. package/tools/telegram-bot.js +183 -0
  146. package/tools/telegram-setup.js +214 -0
  147. package/tools/tictactoe.js +155 -0
  148. package/tools/tip.js +120 -0
  149. package/tools/token.js +103 -0
  150. package/tools/twentyquestions.js +143 -0
  151. package/tools/update.js +1 -1
  152. package/tools/wallet.js +127 -0
  153. package/tools/watch.js +157 -0
  154. package/tools/webhook-test.js +388 -0
  155. package/tools/who.js +118 -25
  156. package/tools/withdraw.js +145 -0
  157. package/tools/wordassociation.js +247 -0
  158. package/tools/work-summary.js +96 -0
  159. package/tools/workshop-buddy.js +394 -0
  160. package/tools/workshop.js +327 -0
  161. package/version.json +12 -3
  162. 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 };
@@ -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 };