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.
- package/LICENSE +21 -0
- package/README.md +280 -47
- package/auto-update.js +10 -15
- package/config.js +36 -31
- package/crypto.js +1 -6
- package/debug.js +12 -0
- package/discord.js +19 -19
- package/eslint.config.js +54 -0
- package/index.js +217 -207
- package/intelligence/index.js +2 -9
- package/intelligence/infer.js +10 -16
- package/intelligence/patterns.js +23 -18
- package/intelligence/proactive.js +16 -15
- package/intelligence/serendipity.js +57 -20
- package/memory.js +13 -8
- package/migrate-v2.js +72 -0
- package/notification-emitter.js +2 -2
- package/notify.js +39 -14
- package/package.json +28 -29
- package/post-install.js +141 -0
- package/presence.js +2 -2
- package/prompts.js +5 -9
- package/protocol/index.js +123 -87
- package/protocol/telegram-commands.js +36 -37
- package/store/api.js +358 -529
- package/store/local.js +9 -10
- package/store/profiles.js +48 -192
- package/store/reservations.js +2 -9
- package/store/skills.js +69 -71
- package/store/sqlite.js +355 -0
- package/test-skills-bootstrap.js +20 -0
- package/test-v2-integration.js +385 -0
- package/tools/_actions.js +48 -387
- package/tools/_connection-queue.js +45 -56
- package/tools/_discovery-enhanced.js +52 -57
- package/tools/_discovery.js +87 -185
- package/tools/{l2-status.js → _experimental/l2-status.js} +68 -70
- package/tools/{shipback.js → _experimental/shipback.js} +4 -3
- package/tools/_proactive-discovery.js +60 -73
- package/tools/_shared/index.js +41 -64
- package/tools/admin-inbox.js +10 -15
- package/tools/agents.js +1 -1
- package/tools/artifact-create.js +13 -23
- package/tools/artifact-view.js +4 -4
- package/tools/{_deprecated/back.js → back.js} +1 -1
- package/tools/bye.js +3 -5
- package/tools/consent.js +2 -2
- package/tools/context.js +9 -10
- package/tools/crossword.js +3 -2
- package/tools/discover.js +94 -356
- package/tools/dm.js +27 -86
- package/tools/doctor.js +12 -41
- package/tools/drawing.js +34 -20
- package/tools/echo.js +11 -11
- package/tools/feed.js +30 -58
- package/tools/follow.js +64 -187
- package/tools/{_deprecated/forget.js → forget.js} +4 -7
- package/tools/game.js +144 -48
- package/tools/handoff.js +6 -8
- package/tools/help.js +3 -3
- package/tools/idea.js +15 -27
- package/tools/inbox.js +121 -293
- package/tools/init.js +54 -151
- package/tools/invite.js +8 -21
- package/tools/migrate.js +27 -24
- package/tools/multiplayer-game.js +50 -40
- package/tools/{_deprecated/mute.js → mute.js} +4 -3
- package/tools/notifications.js +58 -48
- package/tools/observe.js +12 -15
- package/tools/onboarding.js +8 -11
- package/tools/open.js +13 -144
- package/tools/party-game.js +23 -12
- package/tools/patterns.js +2 -1
- package/tools/ping.js +5 -7
- package/tools/react.js +28 -30
- package/tools/{_deprecated/recall.js → recall.js} +5 -10
- package/tools/release.js +4 -2
- package/tools/{_deprecated/remember.js → remember.js} +4 -6
- package/tools/report.js +2 -2
- package/tools/request.js +6 -26
- package/tools/reserve.js +1 -1
- package/tools/session-fork.js +97 -0
- package/tools/session-save.js +109 -0
- package/tools/settings.js +30 -99
- package/tools/ship.js +74 -56
- package/tools/{_deprecated/skills-exchange.js → skills-exchange.js} +38 -39
- package/tools/social-inbox.js +22 -28
- package/tools/social-post.js +24 -27
- package/tools/solo-game.js +54 -46
- package/tools/start.js +14 -148
- package/tools/status.js +21 -68
- package/tools/submit.js +4 -2
- package/tools/suggest-tags.js +36 -33
- package/tools/summarize.js +19 -16
- package/tools/tag-suggestions.js +72 -73
- package/tools/test.js +1 -1
- package/tools/{_deprecated/tictactoe.js → tictactoe.js} +26 -26
- package/tools/token.js +4 -4
- package/tools/update.js +1 -2
- package/tools/watch.js +132 -112
- package/tools/who.js +20 -40
- package/tools/{_deprecated/wordassociation.js → wordassociation.js} +23 -20
- package/tools/workshop-buddy.js +52 -53
- package/tools/x-mentions.js +0 -1
- package/tools/x-reply.js +0 -1
- package/twitter.js +14 -20
- package/version.json +8 -10
- package/webhook-runner.js +132 -0
- package/auth-store.js +0 -148
- package/bridges/bridge-monitor.js +0 -388
- package/bridges/discord-bot.js +0 -431
- package/bridges/farcaster.js +0 -299
- package/bridges/telegram.js +0 -261
- package/bridges/webhook-health.js +0 -420
- package/bridges/webhook-server.js +0 -437
- package/bridges/whatsapp.js +0 -441
- package/bridges/x-webhook.js +0 -423
- package/games/arcade.js +0 -406
- package/games/chess.js +0 -451
- package/games/colorguess.js +0 -343
- package/games/crossword-words.js +0 -171
- package/games/crossword.js +0 -461
- package/games/drawing.js +0 -347
- package/games/gameroulette.js +0 -300
- package/games/gamerouter.js +0 -336
- package/games/gamestatus.js +0 -337
- package/games/guessnumber.js +0 -209
- package/games/hangman.js +0 -279
- package/games/memory.js +0 -338
- package/games/multiplayer-tictactoe.js +0 -389
- package/games/pixelart.js +0 -399
- package/games/quickduel.js +0 -354
- package/games/riddle.js +0 -371
- package/games/rockpaperscissors.js +0 -291
- package/games/snake.js +0 -406
- package/games/storybuilder.js +0 -343
- package/games/tictactoe.js +0 -345
- package/games/twentyquestions.js +0 -286
- package/games/twotruths.js +0 -207
- package/games/werewolf.js +0 -508
- package/games/wordassociation.js +0 -247
- package/games/wordchain.js +0 -135
- package/intelligence/interests.js +0 -369
- package/setup.js +0 -480
- package/smart-inbox.js +0 -276
- package/tools/_deprecated/auto-suggest-connections.js +0 -304
- package/tools/_deprecated/bootstrap-skills.js +0 -231
- package/tools/_deprecated/bridge-dashboard.js +0 -342
- package/tools/_deprecated/bridge-health.js +0 -400
- package/tools/_deprecated/bridge-live.js +0 -384
- package/tools/_deprecated/bridges.js +0 -383
- package/tools/_deprecated/colorguess.js +0 -281
- package/tools/_deprecated/discover-insights.js +0 -379
- package/tools/_deprecated/discover-momentum.js +0 -256
- package/tools/_deprecated/discovery-analytics.js +0 -345
- package/tools/_deprecated/discovery-auto-suggest.js +0 -275
- package/tools/_deprecated/discovery-bootstrap.js +0 -267
- package/tools/_deprecated/discovery-daily.js +0 -375
- package/tools/_deprecated/discovery-dashboard.js +0 -385
- package/tools/_deprecated/discovery-digest.js +0 -314
- package/tools/_deprecated/discovery-hub.js +0 -357
- package/tools/_deprecated/discovery-insights.js +0 -384
- package/tools/_deprecated/discovery-momentum.js +0 -281
- package/tools/_deprecated/discovery-monitor.js +0 -319
- package/tools/_deprecated/discovery-proactive.js +0 -300
- package/tools/_deprecated/draw.js +0 -317
- package/tools/_deprecated/farcaster.js +0 -307
- package/tools/_deprecated/games-catalog.js +0 -376
- package/tools/_deprecated/games.js +0 -313
- package/tools/_deprecated/guessnumber.js +0 -194
- package/tools/_deprecated/hangman.js +0 -129
- package/tools/_deprecated/multiplayer-tictactoe.js +0 -303
- package/tools/_deprecated/riddle.js +0 -240
- package/tools/_deprecated/run-bootstrap.js +0 -69
- package/tools/_deprecated/skills-analytics.js +0 -349
- package/tools/_deprecated/skills-bootstrap.js +0 -301
- package/tools/_deprecated/skills-dashboard.js +0 -268
- package/tools/_deprecated/skills.js +0 -380
- package/tools/_deprecated/smart-intro.js +0 -353
- package/tools/_deprecated/storybuilder.js +0 -331
- package/tools/_deprecated/telegram-bot.js +0 -183
- package/tools/_deprecated/telegram-setup.js +0 -214
- package/tools/_deprecated/twentyquestions.js +0 -143
- package/tools/_shared.js +0 -234
- package/tools/_work-context.js +0 -338
- package/tools/_work-context.manual-test.js +0 -199
- package/tools/_work-context.test.js +0 -260
- package/tools/activity.js +0 -220
- package/tools/agent-treasury.js +0 -288
- package/tools/analytics.js +0 -191
- package/tools/approve.js +0 -197
- package/tools/arcade.js +0 -173
- package/tools/artifacts-price.js +0 -107
- package/tools/ask-expert.js +0 -160
- package/tools/available.js +0 -120
- package/tools/become-expert.js +0 -150
- package/tools/broadcast.js +0 -325
- package/tools/chat.js +0 -202
- package/tools/collaborative-drawing.js +0 -286
- package/tools/connection-status.js +0 -178
- package/tools/earnings.js +0 -126
- package/tools/friends.js +0 -207
- package/tools/genesis.js +0 -233
- package/tools/gig-browse.js +0 -206
- package/tools/gig-complete.js +0 -144
- package/tools/health.js +0 -87
- package/tools/leaderboard.js +0 -117
- package/tools/lib/git-apply.js +0 -206
- package/tools/lib/git-bundle.js +0 -407
- package/tools/mint.js +0 -377
- package/tools/plan.js +0 -225
- package/tools/profile.js +0 -219
- package/tools/proof-of-work.js +0 -144
- package/tools/pulse.js +0 -218
- package/tools/reply.js +0 -166
- package/tools/reputation.js +0 -175
- package/tools/schedule.js +0 -367
- package/tools/search-messages.js +0 -123
- package/tools/session.js +0 -467
- package/tools/session_price.js +0 -128
- package/tools/smart-check.js +0 -201
- package/tools/social-processor.js +0 -445
- package/tools/streak.js +0 -147
- package/tools/stuck.js +0 -297
- package/tools/subscribe.js +0 -148
- package/tools/subscriptions.js +0 -134
- package/tools/tip.js +0 -193
- package/tools/wallet.js +0 -269
- package/tools/webhook-test.js +0 -388
- package/tools/withdraw.js +0 -145
- package/tools/work-summary.js +0 -96
- package/tools/workshop.js +0 -327
- /package/tools/{l2-bridge.js → _experimental/l2-bridge.js} +0 -0
- /package/tools/{l2.js → _experimental/l2.js} +0 -0
- /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
|
|
1
|
+
# /vibe MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/slashvibe-mcp)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
[](https://github.com/VibeCodingInc/vibe-mcp/actions/workflows/ci.yml)
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
The social layer for AI coding. DMs, presence, discovery, and games between developers — without leaving your editor.
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
Works with Claude Code, Cursor, VS Code, Windsurf, Cline, Continue.dev, JetBrains, and any MCP-compatible client.
|
|
8
11
|
|
|
9
|
-
|
|
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
|
|
33
|
+
claude mcp add vibe -- npx -y slashvibe-mcp
|
|
12
34
|
```
|
|
35
|
+
</details>
|
|
13
36
|
|
|
14
|
-
|
|
37
|
+
<details>
|
|
38
|
+
<summary><strong>Cursor</strong></summary>
|
|
15
39
|
|
|
16
|
-
|
|
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
|
-
|
|
53
|
+
<details>
|
|
54
|
+
<summary><strong>VS Code (GitHub Copilot)</strong></summary>
|
|
19
55
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
83
|
+
<details>
|
|
84
|
+
<summary><strong>Windsurf</strong></summary>
|
|
29
85
|
|
|
30
|
-
Add to `~/.
|
|
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": ["
|
|
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
|
-
##
|
|
271
|
+
## Troubleshooting
|
|
47
272
|
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
291
|
+
## Configuration
|
|
68
292
|
|
|
69
|
-
|
|
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
|
-
|
|
295
|
+
Local message database: `~/.vibecodings/sessions.db` (SQLite, shared with Vibe Terminal desktop app).
|
|
75
296
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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');
|
|
14
|
-
const FALLBACK_CONFIG = path.join(VIBE_DIR, 'config.json');
|
|
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:
|
|
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
|
-
|
|
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?.
|
|
225
|
+
return cfg?.privyToken || null;
|
|
221
226
|
}
|
|
222
227
|
|
|
223
228
|
/**
|
|
224
|
-
* Save
|
|
225
|
-
* @param {string} token -
|
|
229
|
+
* Save Privy JWT token (used after browser OAuth flow)
|
|
230
|
+
* @param {string} token - Privy access token
|
|
226
231
|
*/
|
|
227
|
-
function
|
|
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: '
|
|
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.
|
|
240
|
-
cfg.authMethod = '
|
|
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
|
|
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
|
|
252
|
-
const validAuthMethods = ['github', 'privy', 'browser'];
|
|
253
|
-
|
|
252
|
+
function hasPrivyAuth() {
|
|
254
253
|
const data = getSessionData();
|
|
255
|
-
if (
|
|
254
|
+
if (data?.authMethod === 'privy' && data?.token) return true;
|
|
256
255
|
|
|
257
256
|
const cfg = load();
|
|
258
|
-
return
|
|
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
|
|
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
|
-
|
|
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