slashvibe-mcp 0.3.21 → 0.3.22

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 (229) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -47
  3. package/config.js +36 -31
  4. package/crypto.js +1 -6
  5. package/discord.js +19 -19
  6. package/index.js +217 -207
  7. package/intelligence/index.js +2 -9
  8. package/intelligence/infer.js +10 -16
  9. package/intelligence/patterns.js +23 -18
  10. package/intelligence/proactive.js +16 -15
  11. package/intelligence/serendipity.js +57 -20
  12. package/memory.js +13 -8
  13. package/notify.js +39 -14
  14. package/package.json +27 -20
  15. package/presence.js +2 -2
  16. package/prompts.js +5 -9
  17. package/protocol/index.js +123 -87
  18. package/protocol/telegram-commands.js +36 -37
  19. package/store/api.js +358 -529
  20. package/store/local.js +9 -10
  21. package/store/profiles.js +48 -192
  22. package/store/reservations.js +2 -9
  23. package/store/skills.js +69 -71
  24. package/store/sqlite.js +355 -0
  25. package/tools/_actions.js +48 -387
  26. package/tools/_connection-queue.js +45 -56
  27. package/tools/_discovery-enhanced.js +52 -57
  28. package/tools/_discovery.js +87 -185
  29. package/tools/{l2-status.js → _experimental/l2-status.js} +68 -70
  30. package/tools/{shipback.js → _experimental/shipback.js} +4 -3
  31. package/tools/_proactive-discovery.js +60 -73
  32. package/tools/_shared/index.js +41 -64
  33. package/tools/admin-inbox.js +10 -15
  34. package/tools/agents.js +1 -1
  35. package/tools/artifact-create.js +13 -23
  36. package/tools/artifact-view.js +4 -4
  37. package/tools/{_deprecated/back.js → back.js} +1 -1
  38. package/tools/bye.js +3 -5
  39. package/tools/consent.js +2 -2
  40. package/tools/context.js +9 -10
  41. package/tools/crossword.js +3 -2
  42. package/tools/discover.js +94 -356
  43. package/tools/dm.js +27 -86
  44. package/tools/doctor.js +12 -41
  45. package/tools/drawing.js +34 -20
  46. package/tools/echo.js +11 -11
  47. package/tools/feed.js +30 -58
  48. package/tools/follow.js +64 -187
  49. package/tools/{_deprecated/forget.js → forget.js} +4 -7
  50. package/tools/game.js +144 -48
  51. package/tools/handoff.js +6 -8
  52. package/tools/help.js +3 -3
  53. package/tools/idea.js +15 -27
  54. package/tools/inbox.js +121 -293
  55. package/tools/init.js +54 -151
  56. package/tools/invite.js +8 -21
  57. package/tools/migrate.js +27 -24
  58. package/tools/multiplayer-game.js +50 -40
  59. package/tools/{_deprecated/mute.js → mute.js} +4 -3
  60. package/tools/notifications.js +58 -48
  61. package/tools/observe.js +12 -15
  62. package/tools/onboarding.js +8 -11
  63. package/tools/open.js +13 -144
  64. package/tools/party-game.js +23 -12
  65. package/tools/patterns.js +2 -1
  66. package/tools/ping.js +5 -7
  67. package/tools/react.js +28 -30
  68. package/tools/{_deprecated/recall.js → recall.js} +5 -10
  69. package/tools/release.js +4 -2
  70. package/tools/{_deprecated/remember.js → remember.js} +4 -6
  71. package/tools/report.js +2 -2
  72. package/tools/request.js +6 -26
  73. package/tools/reserve.js +1 -1
  74. package/tools/session-fork.js +97 -0
  75. package/tools/session-save.js +109 -0
  76. package/tools/settings.js +30 -99
  77. package/tools/ship.js +74 -56
  78. package/tools/{_deprecated/skills-exchange.js → skills-exchange.js} +38 -39
  79. package/tools/social-inbox.js +22 -28
  80. package/tools/social-post.js +24 -27
  81. package/tools/solo-game.js +54 -46
  82. package/tools/start.js +14 -148
  83. package/tools/status.js +21 -68
  84. package/tools/submit.js +4 -2
  85. package/tools/suggest-tags.js +36 -33
  86. package/tools/summarize.js +19 -16
  87. package/tools/tag-suggestions.js +72 -73
  88. package/tools/test.js +1 -1
  89. package/tools/{_deprecated/tictactoe.js → tictactoe.js} +26 -26
  90. package/tools/token.js +4 -4
  91. package/tools/update.js +1 -2
  92. package/tools/watch.js +132 -112
  93. package/tools/who.js +20 -40
  94. package/tools/{_deprecated/wordassociation.js → wordassociation.js} +23 -20
  95. package/tools/workshop-buddy.js +52 -53
  96. package/tools/x-mentions.js +0 -1
  97. package/tools/x-reply.js +0 -1
  98. package/twitter.js +14 -20
  99. package/version.json +8 -10
  100. package/analytics.js +0 -107
  101. package/auth-store.js +0 -148
  102. package/auto-update.js +0 -130
  103. package/bridges/bridge-monitor.js +0 -388
  104. package/bridges/discord-bot.js +0 -431
  105. package/bridges/farcaster.js +0 -299
  106. package/bridges/telegram.js +0 -261
  107. package/bridges/webhook-health.js +0 -420
  108. package/bridges/webhook-server.js +0 -437
  109. package/bridges/whatsapp.js +0 -441
  110. package/bridges/x-webhook.js +0 -423
  111. package/games/arcade.js +0 -406
  112. package/games/chess.js +0 -451
  113. package/games/colorguess.js +0 -343
  114. package/games/crossword-words.js +0 -171
  115. package/games/crossword.js +0 -461
  116. package/games/drawing.js +0 -347
  117. package/games/gameroulette.js +0 -300
  118. package/games/gamerouter.js +0 -336
  119. package/games/gamestatus.js +0 -337
  120. package/games/guessnumber.js +0 -209
  121. package/games/hangman.js +0 -279
  122. package/games/memory.js +0 -338
  123. package/games/multiplayer-tictactoe.js +0 -389
  124. package/games/pixelart.js +0 -399
  125. package/games/quickduel.js +0 -354
  126. package/games/riddle.js +0 -371
  127. package/games/rockpaperscissors.js +0 -291
  128. package/games/snake.js +0 -406
  129. package/games/storybuilder.js +0 -343
  130. package/games/tictactoe.js +0 -345
  131. package/games/twentyquestions.js +0 -286
  132. package/games/twotruths.js +0 -207
  133. package/games/werewolf.js +0 -508
  134. package/games/wordassociation.js +0 -247
  135. package/games/wordchain.js +0 -135
  136. package/intelligence/interests.js +0 -369
  137. package/notification-emitter.js +0 -77
  138. package/setup.js +0 -480
  139. package/smart-inbox.js +0 -276
  140. package/tools/_deprecated/auto-suggest-connections.js +0 -304
  141. package/tools/_deprecated/bootstrap-skills.js +0 -231
  142. package/tools/_deprecated/bridge-dashboard.js +0 -342
  143. package/tools/_deprecated/bridge-health.js +0 -400
  144. package/tools/_deprecated/bridge-live.js +0 -384
  145. package/tools/_deprecated/bridges.js +0 -383
  146. package/tools/_deprecated/colorguess.js +0 -281
  147. package/tools/_deprecated/discover-insights.js +0 -379
  148. package/tools/_deprecated/discover-momentum.js +0 -256
  149. package/tools/_deprecated/discovery-analytics.js +0 -345
  150. package/tools/_deprecated/discovery-auto-suggest.js +0 -275
  151. package/tools/_deprecated/discovery-bootstrap.js +0 -267
  152. package/tools/_deprecated/discovery-daily.js +0 -375
  153. package/tools/_deprecated/discovery-dashboard.js +0 -385
  154. package/tools/_deprecated/discovery-digest.js +0 -314
  155. package/tools/_deprecated/discovery-hub.js +0 -357
  156. package/tools/_deprecated/discovery-insights.js +0 -384
  157. package/tools/_deprecated/discovery-momentum.js +0 -281
  158. package/tools/_deprecated/discovery-monitor.js +0 -319
  159. package/tools/_deprecated/discovery-proactive.js +0 -300
  160. package/tools/_deprecated/draw.js +0 -317
  161. package/tools/_deprecated/farcaster.js +0 -307
  162. package/tools/_deprecated/games-catalog.js +0 -376
  163. package/tools/_deprecated/games.js +0 -313
  164. package/tools/_deprecated/guessnumber.js +0 -194
  165. package/tools/_deprecated/hangman.js +0 -129
  166. package/tools/_deprecated/multiplayer-tictactoe.js +0 -303
  167. package/tools/_deprecated/riddle.js +0 -240
  168. package/tools/_deprecated/run-bootstrap.js +0 -69
  169. package/tools/_deprecated/skills-analytics.js +0 -349
  170. package/tools/_deprecated/skills-bootstrap.js +0 -301
  171. package/tools/_deprecated/skills-dashboard.js +0 -268
  172. package/tools/_deprecated/skills.js +0 -380
  173. package/tools/_deprecated/smart-intro.js +0 -353
  174. package/tools/_deprecated/storybuilder.js +0 -331
  175. package/tools/_deprecated/telegram-bot.js +0 -183
  176. package/tools/_deprecated/telegram-setup.js +0 -214
  177. package/tools/_deprecated/twentyquestions.js +0 -143
  178. package/tools/_shared.js +0 -234
  179. package/tools/_work-context.js +0 -338
  180. package/tools/_work-context.manual-test.js +0 -199
  181. package/tools/_work-context.test.js +0 -260
  182. package/tools/activity.js +0 -220
  183. package/tools/agent-treasury.js +0 -288
  184. package/tools/analytics.js +0 -191
  185. package/tools/approve.js +0 -197
  186. package/tools/arcade.js +0 -173
  187. package/tools/artifacts-price.js +0 -107
  188. package/tools/ask-expert.js +0 -160
  189. package/tools/available.js +0 -120
  190. package/tools/become-expert.js +0 -150
  191. package/tools/broadcast.js +0 -325
  192. package/tools/chat.js +0 -202
  193. package/tools/collaborative-drawing.js +0 -286
  194. package/tools/connection-status.js +0 -178
  195. package/tools/earnings.js +0 -126
  196. package/tools/friends.js +0 -207
  197. package/tools/genesis.js +0 -233
  198. package/tools/gig-browse.js +0 -206
  199. package/tools/gig-complete.js +0 -144
  200. package/tools/health.js +0 -87
  201. package/tools/leaderboard.js +0 -117
  202. package/tools/lib/git-apply.js +0 -206
  203. package/tools/lib/git-bundle.js +0 -407
  204. package/tools/mint.js +0 -377
  205. package/tools/plan.js +0 -225
  206. package/tools/profile.js +0 -219
  207. package/tools/proof-of-work.js +0 -144
  208. package/tools/pulse.js +0 -218
  209. package/tools/reply.js +0 -166
  210. package/tools/reputation.js +0 -175
  211. package/tools/schedule.js +0 -367
  212. package/tools/search-messages.js +0 -123
  213. package/tools/session.js +0 -467
  214. package/tools/session_price.js +0 -128
  215. package/tools/smart-check.js +0 -201
  216. package/tools/social-processor.js +0 -445
  217. package/tools/streak.js +0 -147
  218. package/tools/stuck.js +0 -297
  219. package/tools/subscribe.js +0 -148
  220. package/tools/subscriptions.js +0 -134
  221. package/tools/tip.js +0 -193
  222. package/tools/wallet.js +0 -269
  223. package/tools/webhook-test.js +0 -388
  224. package/tools/withdraw.js +0 -145
  225. package/tools/work-summary.js +0 -96
  226. package/tools/workshop.js +0 -327
  227. /package/tools/{l2-bridge.js → _experimental/l2-bridge.js} +0 -0
  228. /package/tools/{l2.js → _experimental/l2.js} +0 -0
  229. /package/tools/{_deprecated/away.js → away.js} +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Slash Vibe, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,83 +1,316 @@
1
- # vibe-mcp
1
+ # /vibe MCP Server
2
2
 
3
- Social layer for AI-assisted coding. DMs, presence, and connection between developers.
3
+ [![npm version](https://img.shields.io/npm/v/slashvibe-mcp.svg)](https://www.npmjs.com/package/slashvibe-mcp)
4
+ [![license](https://img.shields.io/npm/l/slashvibe-mcp.svg)](./LICENSE)
5
+ [![node](https://img.shields.io/node/v/slashvibe-mcp.svg)](https://nodejs.org)
6
+ [![CI](https://github.com/VibeCodingInc/vibe-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/VibeCodingInc/vibe-mcp/actions/workflows/ci.yml)
4
7
 
5
- **Works in:** Claude Code Cursor Any MCP-compatible IDE
8
+ The social layer for AI coding. DMs, presence, discovery, and games between developers — without leaving your editor.
6
9
 
7
- ## Quick Start
10
+ Works with Claude Code, Cursor, VS Code, Windsurf, Cline, Continue.dev, JetBrains, and any MCP-compatible client.
8
11
 
9
- **Claude Code:**
12
+ ## Install
13
+
14
+ Add to your MCP config and restart your editor:
15
+
16
+ <details open>
17
+ <summary><strong>Claude Code</strong></summary>
18
+
19
+ Add to `~/.claude.json`:
20
+ ```json
21
+ {
22
+ "mcpServers": {
23
+ "vibe": {
24
+ "command": "npx",
25
+ "args": ["-y", "slashvibe-mcp"]
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ Or via CLI:
10
32
  ```bash
11
- npx slashvibe-mcp setup
33
+ claude mcp add vibe -- npx -y slashvibe-mcp
12
34
  ```
35
+ </details>
13
36
 
14
- **Cursor:** See [Cursor Setup Guide](docs/CURSOR_SETUP.md)
37
+ <details>
38
+ <summary><strong>Cursor</strong></summary>
15
39
 
16
- **Other IDEs:** Any editor supporting MCP protocol can use the manual config below.
40
+ Add to `~/.cursor/mcp.json`:
41
+ ```json
42
+ {
43
+ "mcpServers": {
44
+ "vibe": {
45
+ "command": "npx",
46
+ "args": ["-y", "slashvibe-mcp"]
47
+ }
48
+ }
49
+ }
50
+ ```
51
+ </details>
17
52
 
18
- ## Installation
53
+ <details>
54
+ <summary><strong>VS Code (GitHub Copilot)</strong></summary>
19
55
 
20
- ```bash
21
- # Install globally
22
- npm install -g vibe-mcp
56
+ Add to `.vscode/mcp.json` in your workspace:
57
+ ```json
58
+ {
59
+ "servers": {
60
+ "vibe": {
61
+ "command": "npx",
62
+ "args": ["-y", "slashvibe-mcp"]
63
+ }
64
+ }
65
+ }
66
+ ```
23
67
 
24
- # Or add to Claude Code MCP config
25
- claude mcp add vibe-mcp
68
+ Or add to your `settings.json`:
69
+ ```json
70
+ {
71
+ "mcp": {
72
+ "servers": {
73
+ "vibe": {
74
+ "command": "npx",
75
+ "args": ["-y", "slashvibe-mcp"]
76
+ }
77
+ }
78
+ }
79
+ }
26
80
  ```
81
+ </details>
27
82
 
28
- ## Manual Setup
83
+ <details>
84
+ <summary><strong>Windsurf</strong></summary>
29
85
 
30
- Add to `~/.claude.json`:
86
+ Add to `~/.codeium/windsurf/mcp_config.json`:
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "vibe": {
91
+ "command": "npx",
92
+ "args": ["-y", "slashvibe-mcp"]
93
+ }
94
+ }
95
+ }
96
+ ```
97
+ </details>
98
+
99
+ <details>
100
+ <summary><strong>Cline (VS Code)</strong></summary>
31
101
 
102
+ Open Cline > MCP Servers icon > Configure > Edit JSON, then add:
32
103
  ```json
33
104
  {
34
105
  "mcpServers": {
35
106
  "vibe": {
36
107
  "command": "npx",
37
- "args": ["vibe-mcp"],
38
- "env": {
39
- "VIBE_API_URL": "https://www.slashvibe.dev"
40
- }
108
+ "args": ["-y", "slashvibe-mcp"]
41
109
  }
42
110
  }
43
111
  }
44
112
  ```
113
+ </details>
114
+
115
+ <details>
116
+ <summary><strong>Continue.dev</strong></summary>
117
+
118
+ Create `.continue/mcpServers/vibe.json`:
119
+ ```json
120
+ {
121
+ "command": "npx",
122
+ "args": ["-y", "slashvibe-mcp"]
123
+ }
124
+ ```
125
+ </details>
126
+
127
+ <details>
128
+ <summary><strong>JetBrains (IntelliJ, WebStorm, etc.)</strong></summary>
129
+
130
+ Go to **Settings > Tools > AI Assistant > Model Context Protocol (MCP)** and add a new server:
131
+ - **Command:** `npx`
132
+ - **Arguments:** `-y slashvibe-mcp`
133
+
134
+ Or import from your Claude Code config if you already have one.
135
+ </details>
136
+
137
+ ## Getting Started
138
+
139
+ Once installed, tell Claude:
140
+
141
+ ```
142
+ "let's vibe"
143
+ ```
144
+
145
+ That's it. Claude will authenticate you via GitHub, show who's online, and check your inbox.
146
+
147
+ If you prefer step-by-step:
148
+
149
+ 1. **Authenticate** — `vibe init` opens GitHub OAuth in your browser. Takes 30 seconds.
150
+ 2. **See who's around** — `vibe who` shows online builders and what they're working on.
151
+ 3. **Check messages** — `vibe inbox` shows unread DMs.
152
+ 4. **Send your first message** — `vibe dm @seth hey, just set up /vibe!`
153
+
154
+ ## Tools (39)
155
+
156
+ ### Core — Identity & Session
157
+
158
+ | Tool | What it does |
159
+ |------|-------------|
160
+ | `vibe_start` | Entry point — authenticates, shows who's online, checks inbox |
161
+ | `vibe_init` | Set up your identity via GitHub OAuth |
162
+ | `vibe_bye` | End your session |
163
+
164
+ ### Core — Messaging
165
+
166
+ | Tool | What it does |
167
+ |------|-------------|
168
+ | `vibe_dm` | Send a direct message |
169
+ | `vibe_inbox` | Check your unread messages |
170
+ | `vibe_ping` | Send a quick wave to someone |
171
+ | `vibe_react` | React to a message |
172
+ | `vibe_open` | Open a conversation thread with someone |
173
+
174
+ ### Presence
175
+
176
+ | Tool | What it does |
177
+ |------|-------------|
178
+ | `vibe_who` | See who's online and what they're building |
179
+ | `vibe_status` | Set your mood or what you're working on |
180
+ | `vibe_away` | Set yourself away |
181
+ | `vibe_back` | Return from away |
182
+
183
+ ### Creative — Ship & Share
184
+
185
+ | Tool | What it does |
186
+ |------|-------------|
187
+ | `vibe_ship` | Share with the community: ship (default), idea, or request via `type` param |
188
+ | `vibe_session_save` | Save your coding session — makes it replayable, discoverable, and forkable |
189
+ | `vibe_session_fork` | Fork an existing session to build on it |
190
+ | `vibe_feed` | See what people are shipping and sharing |
191
+ | `vibe_context` | Share what you're working on |
192
+
193
+ ### Discovery
194
+
195
+ | Tool | What it does |
196
+ |------|-------------|
197
+ | `vibe_discover` | Find people, skills, and partners. Subcommands: suggest, search, interests, active, skills, partner |
198
+ | `vibe_invite` | Generate an invite link |
199
+
200
+ ### Memory
201
+
202
+ | Tool | What it does |
203
+ |------|-------------|
204
+ | `vibe_remember` | Save a note about someone for next time |
205
+ | `vibe_recall` | Pull up everything you know about someone |
206
+ | `vibe_forget` | Delete a memory |
207
+
208
+ ### Games — 27 Multiplayer & Solo Games
209
+
210
+ | Tool | What it does |
211
+ |------|-------------|
212
+ | `vibe_game` | All games via one tool. Multiplayer (tictactoe, chess), solo (hangman, rps, memory), party (twotruths, werewolf), AI (tictactoe-ai), collaborative (drawing, crossword, wordassociation, wordchain, storybuilder) |
213
+
214
+ ### Artifacts
215
+
216
+ | Tool | What it does |
217
+ |------|-------------|
218
+ | `vibe_create_artifact` | Create a shareable guide, workspace, or learning |
219
+ | `vibe_view_artifact` | View shared artifacts |
220
+
221
+ ### File Coordination
222
+
223
+ | Tool | What it does |
224
+ |------|-------------|
225
+ | `vibe_reserve` | Reserve files for editing |
226
+ | `vibe_release` | Release file reservations |
227
+ | `vibe_reservations` | List active file reservations |
228
+
229
+ ### Infrastructure
230
+
231
+ | Tool | What it does |
232
+ |------|-------------|
233
+ | `vibe_handoff` | Create an AIRC context handoff for another tool |
234
+ | `vibe_report` | Report issues or inappropriate behavior |
235
+ | `vibe_suggest_tags` | Get tag suggestions for your profile |
236
+
237
+ ### Diagnostics
238
+
239
+ | Tool | What it does |
240
+ |------|-------------|
241
+ | `vibe_help` | Show available commands |
242
+ | `vibe_doctor` | Full health check — API, auth, storage, presence |
243
+ | `vibe_update` | Check for and apply updates |
244
+
245
+ ### Settings
246
+
247
+ | Tool | What it does |
248
+ |------|-------------|
249
+ | `vibe_settings` | Configure preferences |
250
+ | `vibe_notifications` | Configure notification channels |
251
+ | `vibe_presence_agent` | Background presence agent |
252
+ | `vibe_mute` | Mute a user |
253
+ | `vibe_summarize` | Summarize session context |
254
+
255
+ ## How It Works
256
+
257
+ /vibe is an MCP server that connects your editor to [slashvibe.dev](https://slashvibe.dev). Messages sync via a Postgres backend with local SQLite persistence for offline-first speed. Everyone using /vibe is on the same network — regardless of which editor they use.
258
+
259
+ ```
260
+ Your Editor ←→ /vibe MCP (stdio) ←→ slashvibe.dev API ←→ Other users
261
+
262
+ Local SQLite DB
263
+ (~/.vibecodings/sessions.db)
264
+ ```
265
+
266
+ - **Identity** persists via GitHub OAuth — your handle follows you across sessions
267
+ - **Messages** are stored locally first, then synced to the server (optimistic send)
268
+ - **Presence** broadcasts via heartbeat — others see you in real time
269
+ - **Memory** is local — notes you save about people stay on your machine
45
270
 
46
- ## Features
271
+ ## Troubleshooting
47
272
 
48
- - **Presence** - See who's online building with Claude Code
49
- - **DMs** - Direct messages between developers
50
- - **Memory** - Remember context about connections
51
- - **Status** - Share what you're working on
52
- - **Games** - Play tic-tac-toe while coding
273
+ **"I installed but don't see /vibe tools in Claude Code"**
274
+ - Make sure you restarted Claude Code after adding the MCP config
275
+ - Check your config file: `~/.claude.json` or `~/.config/claude-code/mcp.json`
276
+ - Run `vibe doctor` to diagnose issues
53
277
 
54
- ## Commands
278
+ **"Authentication failed or timed out"**
279
+ - The OAuth flow opens a browser window — if it didn't open, go to [slashvibe.dev/login](https://slashvibe.dev/login) manually
280
+ - The auth callback runs on `localhost:9876` — make sure that port is free
281
+ - You have 2 minutes to complete the GitHub login
55
282
 
56
- Once installed, use these in Claude Code:
283
+ **"Messages aren't sending"**
284
+ - Run `vibe doctor` to check API connectivity
285
+ - Check your internet connection
286
+ - Messages are saved locally even if the API is down — they'll sync when you reconnect
57
287
 
58
- | Command | Description |
59
- |---------|-------------|
60
- | `vibe` | Check inbox and see who's online |
61
- | `vibe who` | List online users |
62
- | `vibe dm @handle "message"` | Send a DM |
63
- | `vibe status shipping` | Set your status |
64
- | `vibe remember @handle "note"` | Save a memory |
65
- | `vibe recall @handle` | Recall memories |
288
+ **"I see 'Unknown tool' errors"**
289
+ - You may be running an older version. Run `vibe update` or reinstall: `npm install -g slashvibe-mcp`
66
290
 
67
- ## API
291
+ ## Configuration
68
292
 
69
- The MCP server connects to `slashvibe.dev` for:
70
- - User presence and discovery
71
- - Message routing
72
- - Identity verification
293
+ Config lives at `~/.vibecodings/config.json` (primary) or `~/.vibe/config.json` (legacy fallback).
73
294
 
74
- ## Related
295
+ Local message database: `~/.vibecodings/sessions.db` (SQLite, shared with Vibe Terminal desktop app).
75
296
 
76
- - [GitHub](https://github.com/VibeCodingInc/vibe-mcp) - Source code
77
- - [slashvibe.dev](https://slashvibe.dev) - Web presence
78
- - [Spirit Protocol](https://spiritprotocol.io) - Parent ecosystem
79
- - [AIRC](https://airc.chat) - Agent identity protocol
297
+ ## Contributing
298
+
299
+ We welcome contributions. Please read our [Contributor License Agreement](./CLA.md) before submitting pull requests.
300
+
301
+ - Report bugs via [GitHub Issues](https://github.com/VibeCodingInc/vibe-mcp/issues)
302
+ - Propose features via [Discussions](https://github.com/VibeCodingInc/vibe-mcp/discussions)
80
303
 
81
304
  ## License
82
305
 
83
- MIT
306
+ MIT — see [LICENSE](./LICENSE)
307
+
308
+ ## Links
309
+
310
+ - [slashvibe.dev](https://slashvibe.dev) — The platform
311
+ - [Vibe Terminal](https://github.com/VibeCodingInc/vibe-terminal) — Desktop app
312
+ - [@slashvibe on X](https://twitter.com/slashvibe) — Updates
313
+
314
+ ---
315
+
316
+ Built by [Slash Vibe, Inc.](https://slashvibe.dev)
package/config.js CHANGED
@@ -10,8 +10,8 @@ const path = require('path');
10
10
 
11
11
  const VIBE_DIR = path.join(process.env.HOME, '.vibe');
12
12
  const VIBECODINGS_DIR = path.join(process.env.HOME, '.vibecodings');
13
- const PRIMARY_CONFIG = path.join(VIBECODINGS_DIR, 'config.json'); // Primary
14
- const FALLBACK_CONFIG = path.join(VIBE_DIR, 'config.json'); // Fallback
13
+ const PRIMARY_CONFIG = path.join(VIBECODINGS_DIR, 'config.json'); // Primary
14
+ const FALLBACK_CONFIG = path.join(VIBE_DIR, 'config.json'); // Fallback
15
15
  const CONFIG_FILE = PRIMARY_CONFIG;
16
16
 
17
17
  function ensureDir() {
@@ -70,15 +70,17 @@ function save(config) {
70
70
  // Notification level
71
71
  notifications: config.notifications || existing.notifications || null,
72
72
  // GitHub Activity settings
73
- github_activity_enabled: config.github_activity_enabled !== undefined ? config.github_activity_enabled : existing.github_activity_enabled,
73
+ github_activity_enabled:
74
+ config.github_activity_enabled !== undefined ? config.github_activity_enabled : existing.github_activity_enabled,
74
75
  github_activity_privacy: config.github_activity_privacy || existing.github_activity_privacy || null,
75
- // OAuth token (persisted across MCP process restarts)
76
- authToken: config.authToken || config.privyToken || existing.authToken || existing.privyToken || null,
76
+ // Privy OAuth token (persisted across MCP process restarts)
77
+ privyToken: config.privyToken || existing.privyToken || null,
77
78
  authMethod: config.authMethod || existing.authMethod || null
78
79
  };
79
80
  fs.writeFileSync(PRIMARY_CONFIG, JSON.stringify(data, null, 2));
80
81
  }
81
82
 
83
+ /** @returns {string|null} Current user handle */
82
84
  function getHandle() {
83
85
  // Prefer session-specific handle over shared config
84
86
  const sessionHandle = getSessionHandle();
@@ -88,6 +90,7 @@ function getHandle() {
88
90
  return config.handle || null;
89
91
  }
90
92
 
93
+ /** @returns {string|null} Current user one-liner */
91
94
  function getOneLiner() {
92
95
  // Prefer session-specific one_liner over shared config
93
96
  const sessionOneLiner = getSessionOneLiner();
@@ -97,6 +100,7 @@ function getOneLiner() {
97
100
  return config.one_liner || null;
98
101
  }
99
102
 
103
+ /** @returns {boolean} Whether user identity is set */
100
104
  function isInitialized() {
101
105
  // Check session first, then shared config
102
106
  const sessionHandle = getSessionHandle();
@@ -109,6 +113,7 @@ function isInitialized() {
109
113
  // Now stores full identity (handle + one_liner), not just sessionId
110
114
  const SESSION_FILE = path.join(VIBECODINGS_DIR, `.session_${process.pid}`);
111
115
 
116
+ /** @returns {string} New session ID (sess_*) */
112
117
  function generateSessionId() {
113
118
  return 'sess_' + Date.now().toString(36) + Math.random().toString(36).substring(2, 10);
114
119
  }
@@ -217,52 +222,43 @@ function getAuthToken() {
217
222
 
218
223
  // Fall back to shared config (persisted across MCP process restarts)
219
224
  const cfg = load();
220
- return cfg?.authToken || cfg?.privyToken || null;
225
+ return cfg?.privyToken || null;
221
226
  }
222
227
 
223
228
  /**
224
- * Save auth token (used after browser OAuth flow)
225
- * @param {string} token - JWT access token from GitHub OAuth
229
+ * Save Privy JWT token (used after browser OAuth flow)
230
+ * @param {string} token - Privy access token
226
231
  */
227
- function saveAuthToken(token) {
232
+ function savePrivyToken(token) {
228
233
  // Save to session data
229
234
  const data = getSessionData() || {};
230
235
  saveSessionData({
231
236
  ...data,
232
237
  sessionId: data.sessionId || generateSessionId(),
233
238
  token,
234
- authMethod: 'github' // Track that this is GitHub OAuth
239
+ authMethod: 'privy' // Track that this is a Privy token
235
240
  });
236
241
 
237
242
  // Also save to shared config for persistence across MCP restarts
238
243
  const cfg = load();
239
- cfg.authToken = token;
240
- cfg.authMethod = 'github';
244
+ cfg.privyToken = token;
245
+ cfg.authMethod = 'privy';
241
246
  save(cfg);
242
247
  }
243
248
 
244
- // Backwards compatibility alias
245
- const savePrivyToken = saveAuthToken;
246
-
247
249
  /**
248
- * Check if user has OAuth auth (vs legacy keypair)
249
- * Accepts 'github', 'privy', and 'browser' as valid auth methods (backwards compat)
250
+ * Check if user has Privy auth (vs legacy keypair)
250
251
  */
251
- function hasOAuth() {
252
- const validAuthMethods = ['github', 'privy', 'browser'];
253
-
252
+ function hasPrivyAuth() {
254
253
  const data = getSessionData();
255
- if (validAuthMethods.includes(data?.authMethod) && data?.token) return true;
254
+ if (data?.authMethod === 'privy' && data?.token) return true;
256
255
 
257
256
  const cfg = load();
258
- return validAuthMethods.includes(cfg?.authMethod) && (cfg?.authToken || cfg?.privyToken);
257
+ return cfg?.authMethod === 'privy' && cfg?.privyToken;
259
258
  }
260
259
 
261
- // Backwards compatibility alias
262
- const hasPrivyAuth = hasOAuth;
263
-
264
260
  /**
265
- * Remove keypair after migration to GitHub OAuth
261
+ * Remove keypair after migration to Privy
266
262
  * Clears private key from config (security improvement)
267
263
  */
268
264
  function removeKeypair() {
@@ -368,7 +364,7 @@ function setGithubActivityPrivacy(level) {
368
364
  save(config);
369
365
  }
370
366
 
371
- // API URL central endpoint for all API calls
367
+ /** @returns {string} API base URL */
372
368
  function getApiUrl() {
373
369
  return process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
374
370
  }
@@ -380,10 +376,22 @@ function getApiUrl() {
380
376
  // ─────────────────────────────────────────────────────────────
381
377
  const sessionState = {};
382
378
 
379
+ /**
380
+ * Get ephemeral session state value
381
+ * @param {string} key - State key
382
+ * @param {*} [defaultValue=null] - Default if not set
383
+ * @returns {*} Stored value or default
384
+ */
383
385
  function get(key, defaultValue = null) {
384
386
  return sessionState[key] !== undefined ? sessionState[key] : defaultValue;
385
387
  }
386
388
 
389
+ /**
390
+ * Set ephemeral session state value
391
+ * @param {string} key - State key
392
+ * @param {*} value - Value to store
393
+ * @returns {*} The stored value
394
+ */
387
395
  function set(key, value) {
388
396
  sessionState[key] = value;
389
397
  return value;
@@ -418,10 +426,7 @@ module.exports = {
418
426
  getGithubActivityPrivacy,
419
427
  setGithubActivityPrivacy,
420
428
  getApiUrl,
421
- // OAuth helpers
422
- saveAuthToken,
423
- hasOAuth,
424
- // Backwards compatibility aliases
429
+ // Privy OAuth helpers
425
430
  savePrivyToken,
426
431
  hasPrivyAuth,
427
432
  removeKeypair,
package/crypto.js CHANGED
@@ -106,12 +106,7 @@ function verify(obj, publicKeyBase64) {
106
106
  });
107
107
 
108
108
  // Verify
109
- return crypto.verify(
110
- null,
111
- Buffer.from(canonical, 'utf8'),
112
- publicKey,
113
- Buffer.from(signature, 'base64')
114
- );
109
+ return crypto.verify(null, Buffer.from(canonical, 'utf8'), publicKey, Buffer.from(signature, 'base64'));
115
110
  } catch (e) {
116
111
  console.error('[crypto] Verification failed:', e.message);
117
112
  return false;
package/discord.js CHANGED
@@ -60,7 +60,7 @@ async function post(content, options = {}) {
60
60
  */
61
61
  async function postJoin(handle, oneLiner) {
62
62
  const embed = {
63
- color: 0x6B8FFF, // Spirit blue
63
+ color: 0x6b8fff, // Spirit blue
64
64
  title: `@${handle} joined /vibe`,
65
65
  description: oneLiner || 'Building something',
66
66
  footer: { text: 'slashvibe.dev' },
@@ -74,7 +74,7 @@ async function postJoin(handle, oneLiner) {
74
74
  */
75
75
  async function postActivity(handle, action) {
76
76
  const embed = {
77
- color: 0x2ECC71, // Green
77
+ color: 0x2ecc71, // Green
78
78
  description: `**@${handle}** ${action}`,
79
79
  timestamp: new Date().toISOString()
80
80
  };
@@ -86,17 +86,17 @@ async function postActivity(handle, action) {
86
86
  */
87
87
  async function postStatus(handle, mood, note) {
88
88
  const moodEmoji = {
89
- 'shipping': '🔥',
90
- 'debugging': '🐛',
91
- 'deep': '🧠',
92
- 'afk': '☕',
93
- 'celebrating': '🎉',
94
- 'pairing': '👯'
89
+ shipping: '🔥',
90
+ debugging: '🐛',
91
+ deep: '🧠',
92
+ afk: '☕',
93
+ celebrating: '🎉',
94
+ pairing: '👯'
95
95
  };
96
96
 
97
97
  const emoji = moodEmoji[mood] || '●';
98
98
  const embed = {
99
- color: 0x9B59B6, // Purple
99
+ color: 0x9b59b6, // Purple
100
100
  description: `${emoji} **@${handle}** is ${mood}${note ? `: "${note}"` : ''}`,
101
101
  timestamp: new Date().toISOString()
102
102
  };
@@ -108,7 +108,7 @@ async function postStatus(handle, mood, note) {
108
108
  */
109
109
  async function postAnnouncement(message) {
110
110
  const embed = {
111
- color: 0x6B8FFF,
111
+ color: 0x6b8fff,
112
112
  title: '/vibe',
113
113
  description: message,
114
114
  timestamp: new Date().toISOString()
@@ -120,12 +120,10 @@ async function postAnnouncement(message) {
120
120
  * Post a conversation highlight
121
121
  */
122
122
  async function postHighlight(handle, title, summary, threads = []) {
123
- const threadList = threads.length > 0
124
- ? '\n\n**Open threads:**\n' + threads.map(t => `• ${t}`).join('\n')
125
- : '';
123
+ const threadList = threads.length > 0 ? '\n\n**Open threads:**\n' + threads.map(t => `• ${t}`).join('\n') : '';
126
124
 
127
125
  const embed = {
128
- color: 0xF39C12, // Gold/amber for highlights
126
+ color: 0xf39c12, // Gold/amber for highlights
129
127
  title: `💬 ${title}`,
130
128
  description: summary + threadList,
131
129
  footer: { text: `shared by @${handle} · slashvibe.dev` },
@@ -142,13 +140,15 @@ async function postOnlineList(users) {
142
140
  return post('_Room is quiet..._');
143
141
  }
144
142
 
145
- const list = users.map(u => {
146
- const mood = u.mood ? ` ${u.mood}` : '';
147
- return `• **@${u.handle}**${mood} ${u.one_liner || 'building'}`;
148
- }).join('\n');
143
+ const list = users
144
+ .map(u => {
145
+ const mood = u.mood ? ` ${u.mood}` : '';
146
+ return `• **@${u.handle}**${mood} — ${u.one_liner || 'building'}`;
147
+ })
148
+ .join('\n');
149
149
 
150
150
  const embed = {
151
- color: 0x6B8FFF,
151
+ color: 0x6b8fff,
152
152
  title: `${users.length} online in /vibe`,
153
153
  description: list,
154
154
  footer: { text: 'slashvibe.dev' },