slashvibe-mcp 0.3.21 → 0.3.23

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 (235) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -47
  3. package/auto-update.js +10 -15
  4. package/config.js +36 -31
  5. package/crypto.js +1 -6
  6. package/debug.js +12 -0
  7. package/discord.js +19 -19
  8. package/eslint.config.js +54 -0
  9. package/index.js +217 -207
  10. package/intelligence/index.js +2 -9
  11. package/intelligence/infer.js +10 -16
  12. package/intelligence/patterns.js +23 -18
  13. package/intelligence/proactive.js +16 -15
  14. package/intelligence/serendipity.js +57 -20
  15. package/memory.js +13 -8
  16. package/migrate-v2.js +72 -0
  17. package/notification-emitter.js +2 -2
  18. package/notify.js +39 -14
  19. package/package.json +28 -29
  20. package/post-install.js +141 -0
  21. package/presence.js +2 -2
  22. package/prompts.js +5 -9
  23. package/protocol/index.js +123 -87
  24. package/protocol/telegram-commands.js +36 -37
  25. package/store/api.js +358 -529
  26. package/store/local.js +9 -10
  27. package/store/profiles.js +48 -192
  28. package/store/reservations.js +2 -9
  29. package/store/skills.js +69 -71
  30. package/store/sqlite.js +355 -0
  31. package/test-skills-bootstrap.js +20 -0
  32. package/test-v2-integration.js +385 -0
  33. package/tools/_actions.js +48 -387
  34. package/tools/_connection-queue.js +45 -56
  35. package/tools/_discovery-enhanced.js +52 -57
  36. package/tools/_discovery.js +87 -185
  37. package/tools/{l2-status.js → _experimental/l2-status.js} +68 -70
  38. package/tools/{shipback.js → _experimental/shipback.js} +4 -3
  39. package/tools/_proactive-discovery.js +60 -73
  40. package/tools/_shared/index.js +41 -64
  41. package/tools/admin-inbox.js +10 -15
  42. package/tools/agents.js +1 -1
  43. package/tools/artifact-create.js +13 -23
  44. package/tools/artifact-view.js +4 -4
  45. package/tools/{_deprecated/back.js → back.js} +1 -1
  46. package/tools/bye.js +3 -5
  47. package/tools/consent.js +2 -2
  48. package/tools/context.js +9 -10
  49. package/tools/crossword.js +3 -2
  50. package/tools/discover.js +94 -356
  51. package/tools/dm.js +27 -86
  52. package/tools/doctor.js +12 -41
  53. package/tools/drawing.js +34 -20
  54. package/tools/echo.js +11 -11
  55. package/tools/feed.js +30 -58
  56. package/tools/follow.js +64 -187
  57. package/tools/{_deprecated/forget.js → forget.js} +4 -7
  58. package/tools/game.js +144 -48
  59. package/tools/handoff.js +6 -8
  60. package/tools/help.js +3 -3
  61. package/tools/idea.js +15 -27
  62. package/tools/inbox.js +121 -293
  63. package/tools/init.js +54 -151
  64. package/tools/invite.js +8 -21
  65. package/tools/migrate.js +27 -24
  66. package/tools/multiplayer-game.js +50 -40
  67. package/tools/{_deprecated/mute.js → mute.js} +4 -3
  68. package/tools/notifications.js +58 -48
  69. package/tools/observe.js +12 -15
  70. package/tools/onboarding.js +8 -11
  71. package/tools/open.js +13 -144
  72. package/tools/party-game.js +23 -12
  73. package/tools/patterns.js +2 -1
  74. package/tools/ping.js +5 -7
  75. package/tools/react.js +28 -30
  76. package/tools/{_deprecated/recall.js → recall.js} +5 -10
  77. package/tools/release.js +4 -2
  78. package/tools/{_deprecated/remember.js → remember.js} +4 -6
  79. package/tools/report.js +2 -2
  80. package/tools/request.js +6 -26
  81. package/tools/reserve.js +1 -1
  82. package/tools/session-fork.js +97 -0
  83. package/tools/session-save.js +109 -0
  84. package/tools/settings.js +30 -99
  85. package/tools/ship.js +74 -56
  86. package/tools/{_deprecated/skills-exchange.js → skills-exchange.js} +38 -39
  87. package/tools/social-inbox.js +22 -28
  88. package/tools/social-post.js +24 -27
  89. package/tools/solo-game.js +54 -46
  90. package/tools/start.js +14 -148
  91. package/tools/status.js +21 -68
  92. package/tools/submit.js +4 -2
  93. package/tools/suggest-tags.js +36 -33
  94. package/tools/summarize.js +19 -16
  95. package/tools/tag-suggestions.js +72 -73
  96. package/tools/test.js +1 -1
  97. package/tools/{_deprecated/tictactoe.js → tictactoe.js} +26 -26
  98. package/tools/token.js +4 -4
  99. package/tools/update.js +1 -2
  100. package/tools/watch.js +132 -112
  101. package/tools/who.js +20 -40
  102. package/tools/{_deprecated/wordassociation.js → wordassociation.js} +23 -20
  103. package/tools/workshop-buddy.js +52 -53
  104. package/tools/x-mentions.js +0 -1
  105. package/tools/x-reply.js +0 -1
  106. package/twitter.js +14 -20
  107. package/version.json +8 -10
  108. package/webhook-runner.js +132 -0
  109. package/auth-store.js +0 -148
  110. package/bridges/bridge-monitor.js +0 -388
  111. package/bridges/discord-bot.js +0 -431
  112. package/bridges/farcaster.js +0 -299
  113. package/bridges/telegram.js +0 -261
  114. package/bridges/webhook-health.js +0 -420
  115. package/bridges/webhook-server.js +0 -437
  116. package/bridges/whatsapp.js +0 -441
  117. package/bridges/x-webhook.js +0 -423
  118. package/games/arcade.js +0 -406
  119. package/games/chess.js +0 -451
  120. package/games/colorguess.js +0 -343
  121. package/games/crossword-words.js +0 -171
  122. package/games/crossword.js +0 -461
  123. package/games/drawing.js +0 -347
  124. package/games/gameroulette.js +0 -300
  125. package/games/gamerouter.js +0 -336
  126. package/games/gamestatus.js +0 -337
  127. package/games/guessnumber.js +0 -209
  128. package/games/hangman.js +0 -279
  129. package/games/memory.js +0 -338
  130. package/games/multiplayer-tictactoe.js +0 -389
  131. package/games/pixelart.js +0 -399
  132. package/games/quickduel.js +0 -354
  133. package/games/riddle.js +0 -371
  134. package/games/rockpaperscissors.js +0 -291
  135. package/games/snake.js +0 -406
  136. package/games/storybuilder.js +0 -343
  137. package/games/tictactoe.js +0 -345
  138. package/games/twentyquestions.js +0 -286
  139. package/games/twotruths.js +0 -207
  140. package/games/werewolf.js +0 -508
  141. package/games/wordassociation.js +0 -247
  142. package/games/wordchain.js +0 -135
  143. package/intelligence/interests.js +0 -369
  144. package/setup.js +0 -480
  145. package/smart-inbox.js +0 -276
  146. package/tools/_deprecated/auto-suggest-connections.js +0 -304
  147. package/tools/_deprecated/bootstrap-skills.js +0 -231
  148. package/tools/_deprecated/bridge-dashboard.js +0 -342
  149. package/tools/_deprecated/bridge-health.js +0 -400
  150. package/tools/_deprecated/bridge-live.js +0 -384
  151. package/tools/_deprecated/bridges.js +0 -383
  152. package/tools/_deprecated/colorguess.js +0 -281
  153. package/tools/_deprecated/discover-insights.js +0 -379
  154. package/tools/_deprecated/discover-momentum.js +0 -256
  155. package/tools/_deprecated/discovery-analytics.js +0 -345
  156. package/tools/_deprecated/discovery-auto-suggest.js +0 -275
  157. package/tools/_deprecated/discovery-bootstrap.js +0 -267
  158. package/tools/_deprecated/discovery-daily.js +0 -375
  159. package/tools/_deprecated/discovery-dashboard.js +0 -385
  160. package/tools/_deprecated/discovery-digest.js +0 -314
  161. package/tools/_deprecated/discovery-hub.js +0 -357
  162. package/tools/_deprecated/discovery-insights.js +0 -384
  163. package/tools/_deprecated/discovery-momentum.js +0 -281
  164. package/tools/_deprecated/discovery-monitor.js +0 -319
  165. package/tools/_deprecated/discovery-proactive.js +0 -300
  166. package/tools/_deprecated/draw.js +0 -317
  167. package/tools/_deprecated/farcaster.js +0 -307
  168. package/tools/_deprecated/games-catalog.js +0 -376
  169. package/tools/_deprecated/games.js +0 -313
  170. package/tools/_deprecated/guessnumber.js +0 -194
  171. package/tools/_deprecated/hangman.js +0 -129
  172. package/tools/_deprecated/multiplayer-tictactoe.js +0 -303
  173. package/tools/_deprecated/riddle.js +0 -240
  174. package/tools/_deprecated/run-bootstrap.js +0 -69
  175. package/tools/_deprecated/skills-analytics.js +0 -349
  176. package/tools/_deprecated/skills-bootstrap.js +0 -301
  177. package/tools/_deprecated/skills-dashboard.js +0 -268
  178. package/tools/_deprecated/skills.js +0 -380
  179. package/tools/_deprecated/smart-intro.js +0 -353
  180. package/tools/_deprecated/storybuilder.js +0 -331
  181. package/tools/_deprecated/telegram-bot.js +0 -183
  182. package/tools/_deprecated/telegram-setup.js +0 -214
  183. package/tools/_deprecated/twentyquestions.js +0 -143
  184. package/tools/_shared.js +0 -234
  185. package/tools/_work-context.js +0 -338
  186. package/tools/_work-context.manual-test.js +0 -199
  187. package/tools/_work-context.test.js +0 -260
  188. package/tools/activity.js +0 -220
  189. package/tools/agent-treasury.js +0 -288
  190. package/tools/analytics.js +0 -191
  191. package/tools/approve.js +0 -197
  192. package/tools/arcade.js +0 -173
  193. package/tools/artifacts-price.js +0 -107
  194. package/tools/ask-expert.js +0 -160
  195. package/tools/available.js +0 -120
  196. package/tools/become-expert.js +0 -150
  197. package/tools/broadcast.js +0 -325
  198. package/tools/chat.js +0 -202
  199. package/tools/collaborative-drawing.js +0 -286
  200. package/tools/connection-status.js +0 -178
  201. package/tools/earnings.js +0 -126
  202. package/tools/friends.js +0 -207
  203. package/tools/genesis.js +0 -233
  204. package/tools/gig-browse.js +0 -206
  205. package/tools/gig-complete.js +0 -144
  206. package/tools/health.js +0 -87
  207. package/tools/leaderboard.js +0 -117
  208. package/tools/lib/git-apply.js +0 -206
  209. package/tools/lib/git-bundle.js +0 -407
  210. package/tools/mint.js +0 -377
  211. package/tools/plan.js +0 -225
  212. package/tools/profile.js +0 -219
  213. package/tools/proof-of-work.js +0 -144
  214. package/tools/pulse.js +0 -218
  215. package/tools/reply.js +0 -166
  216. package/tools/reputation.js +0 -175
  217. package/tools/schedule.js +0 -367
  218. package/tools/search-messages.js +0 -123
  219. package/tools/session.js +0 -467
  220. package/tools/session_price.js +0 -128
  221. package/tools/smart-check.js +0 -201
  222. package/tools/social-processor.js +0 -445
  223. package/tools/streak.js +0 -147
  224. package/tools/stuck.js +0 -297
  225. package/tools/subscribe.js +0 -148
  226. package/tools/subscriptions.js +0 -134
  227. package/tools/tip.js +0 -193
  228. package/tools/wallet.js +0 -269
  229. package/tools/webhook-test.js +0 -388
  230. package/tools/withdraw.js +0 -145
  231. package/tools/work-summary.js +0 -96
  232. package/tools/workshop.js +0 -327
  233. /package/tools/{l2-bridge.js → _experimental/l2-bridge.js} +0 -0
  234. /package/tools/{l2.js → _experimental/l2.js} +0 -0
  235. /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/auto-update.js CHANGED
@@ -3,14 +3,16 @@
3
3
  * Checks for updates and prompts user to update
4
4
  */
5
5
 
6
- const { exec } = require('child_process');
7
- const { promisify } = require('util');
8
- const fs = require('fs').promises;
9
- const path = require('path');
6
+ import { exec } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import fs from 'fs/promises';
9
+ import path from 'path';
10
+ import { fileURLToPath } from 'url';
10
11
 
11
12
  const execAsync = promisify(exec);
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
14
 
13
- async function checkForUpdates() {
15
+ export async function checkForUpdates() {
14
16
  try {
15
17
  // Read local version
16
18
  const versionPath = path.join(__dirname, 'version.json');
@@ -45,7 +47,7 @@ async function checkForUpdates() {
45
47
  }
46
48
  }
47
49
 
48
- async function performUpdate() {
50
+ export async function performUpdate() {
49
51
  try {
50
52
  const repoPath = path.join(__dirname, '..');
51
53
 
@@ -82,7 +84,7 @@ async function performUpdate() {
82
84
  }
83
85
  }
84
86
 
85
- function compareVersions(v1, v2) {
87
+ export function compareVersions(v1, v2) {
86
88
  const parts1 = v1.split('.').map(Number);
87
89
  const parts2 = v2.split('.').map(Number);
88
90
 
@@ -94,7 +96,7 @@ function compareVersions(v1, v2) {
94
96
  return 0;
95
97
  }
96
98
 
97
- function formatUpdateNotification(update) {
99
+ export function formatUpdateNotification(update) {
98
100
  if (!update) return null;
99
101
 
100
102
  let message = `\n${'='.repeat(60)}\n`;
@@ -121,10 +123,3 @@ function formatUpdateNotification(update) {
121
123
 
122
124
  return message;
123
125
  }
124
-
125
- module.exports = {
126
- checkForUpdates,
127
- performUpdate,
128
- compareVersions,
129
- formatUpdateNotification
130
- };
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/debug.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Debug logging — conditional on VIBE_DEBUG env var
3
+ *
4
+ * @param {...*} args Arguments to log
5
+ */
6
+ function debug(...args) {
7
+ if (process.env.VIBE_DEBUG === 'true') {
8
+ console.error(...args);
9
+ }
10
+ }
11
+
12
+ module.exports = debug;