@vailent/pulse-mcp 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -53
- package/dist/bin/setup.js +41 -0
- package/dist/server.js +10 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -2,43 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
Pulse MCP server for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). Manage pods, features, workstreams, bugs, and more — all from your terminal.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Setup
|
|
6
6
|
|
|
7
|
-
### 1.
|
|
7
|
+
### 1. npm access (one-time)
|
|
8
8
|
|
|
9
|
+
Create an npm account if you don't have one:
|
|
9
10
|
```bash
|
|
10
11
|
npm adduser
|
|
11
12
|
```
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
### 2. Get added to the Vailent npm org
|
|
16
|
-
|
|
17
|
-
Ask Sal to invite you using your npm username. You'll get an email — accept the invite.
|
|
18
|
-
|
|
19
|
-
### 3. Log in to the Vailent scope
|
|
20
|
-
|
|
14
|
+
Ask Sal to invite you to the Vailent npm org. Accept the email invite, then log in:
|
|
21
15
|
```bash
|
|
22
16
|
npm login --scope=@vailent
|
|
23
17
|
```
|
|
24
18
|
|
|
25
|
-
###
|
|
26
|
-
|
|
27
|
-
Run this once from any directory:
|
|
19
|
+
### 2. Install Pulse MCP
|
|
28
20
|
|
|
29
21
|
```bash
|
|
30
|
-
|
|
22
|
+
npx -p @vailent/pulse-mcp pulse-setup
|
|
31
23
|
```
|
|
32
24
|
|
|
33
|
-
|
|
25
|
+
Restart Claude Code. You're connected.
|
|
26
|
+
|
|
27
|
+
### Verify it works
|
|
34
28
|
|
|
35
|
-
Open Claude Code and ask:
|
|
29
|
+
Open Claude Code in any project and ask:
|
|
36
30
|
|
|
37
31
|
```
|
|
38
32
|
what pods exist?
|
|
39
33
|
```
|
|
40
34
|
|
|
41
|
-
You should see a list of active pods. That's it
|
|
35
|
+
You should see a list of active pods. That's it.
|
|
42
36
|
|
|
43
37
|
## What You Can Do
|
|
44
38
|
|
|
@@ -46,68 +40,68 @@ Talk to Claude naturally — the MCP tools handle the rest.
|
|
|
46
40
|
|
|
47
41
|
| Ask Claude... | What happens |
|
|
48
42
|
|---|---|
|
|
49
|
-
| "What
|
|
50
|
-
| "Show me
|
|
51
|
-
| "Create a
|
|
52
|
-
| "
|
|
53
|
-
| "Show me pending suggestions" | Lists AI suggestions needing review |
|
|
43
|
+
| "What features are in progress this week?" | Lists features by pod and week |
|
|
44
|
+
| "Show me open bugs for Catalyst" | Lists open bugs with priority |
|
|
45
|
+
| "Create a bug: login redirect fails on Safari" | Creates a new bug |
|
|
46
|
+
| "Search for anything about deal creation" | Semantic search across all items |
|
|
54
47
|
| "Give me my daily briefing" | AI-generated focus items for today |
|
|
55
|
-
| "What
|
|
48
|
+
| "What PRs are open for PULSE-142?" | Shows PR status for a feature |
|
|
49
|
+
| "Triage the open requests for my pod" | Lists requests needing review |
|
|
50
|
+
| "What did the team ship last week?" | Searches activity history |
|
|
56
51
|
| "Show the team roster" | Lists team members and pod assignments |
|
|
57
|
-
| "What feature requests came in?" | Lists feature requests by source |
|
|
58
52
|
|
|
59
|
-
### All
|
|
53
|
+
### All Tools
|
|
60
54
|
|
|
61
55
|
| Tool | Description |
|
|
62
56
|
|---|---|
|
|
63
57
|
| `pulse_pods` | List, get, create, update pods |
|
|
64
58
|
| `pulse_pod_members` | Manage pod membership (add, remove, update roles) |
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
70
|
-
| `
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
59
|
+
| `pulse_pod_repos` | Link GitHub repos to pods |
|
|
60
|
+
| `pulse_features` | Manage features with phase/step tracking |
|
|
61
|
+
| `pulse_workstreams` | Manage workstreams (projects), extract features from PRDs |
|
|
62
|
+
| `pulse_milestones` | Manage workstream milestones |
|
|
63
|
+
| `pulse_requests` | Triage feature requests (accept, decline, defer) |
|
|
64
|
+
| `pulse_bugs` | Track bugs (create, update, schedule) |
|
|
65
|
+
| `pulse_suggestions` | Review and approve AI suggestions |
|
|
66
|
+
| `pulse_search` | Semantic similarity search — find duplicates, related items |
|
|
67
|
+
| `pulse_events` | Activity stream, list PRs for a feature |
|
|
68
|
+
| `pulse_history` | Search shipped features, closed requests, resolved bugs |
|
|
69
|
+
| `pulse_briefing` | AI daily briefing adapted to your role |
|
|
70
|
+
| `pulse_team` | View and manage team members |
|
|
74
71
|
|
|
75
72
|
## Troubleshooting
|
|
76
73
|
|
|
77
|
-
###
|
|
74
|
+
### MCP not connecting
|
|
78
75
|
|
|
79
|
-
|
|
76
|
+
Check that it's registered:
|
|
80
77
|
```bash
|
|
81
78
|
claude mcp list
|
|
82
79
|
```
|
|
83
80
|
|
|
84
|
-
You should see `pulse-dev`
|
|
85
|
-
|
|
86
|
-
### "Missing Supabase credentials" error
|
|
87
|
-
|
|
88
|
-
This shouldn't happen — the dev database is preconfigured. If it does, set these env vars:
|
|
89
|
-
|
|
81
|
+
You should see `pulse-dev` with status `Connected`. If not, re-run setup:
|
|
90
82
|
```bash
|
|
91
|
-
|
|
92
|
-
export PULSE_SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVwcHVnY2ZqbHFvdmxhdXlremZlIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQwNTg2NTYsImV4cCI6MjA4OTYzNDY1Nn0.x9u7sSKnSlTFRWCu--D8zt81IuOmoXXHG3fb3kcRvBc
|
|
83
|
+
npx -p @vailent/pulse-mcp pulse-setup
|
|
93
84
|
```
|
|
94
85
|
|
|
95
86
|
### Need to update to the latest version
|
|
96
87
|
|
|
97
88
|
```bash
|
|
98
|
-
npx -
|
|
89
|
+
npx clear-npx-cache
|
|
90
|
+
npx -p @vailent/pulse-mcp pulse-setup
|
|
99
91
|
```
|
|
100
92
|
|
|
101
|
-
|
|
93
|
+
Then restart Claude Code.
|
|
94
|
+
|
|
95
|
+
### Manual setup (if pulse-setup doesn't work)
|
|
96
|
+
|
|
102
97
|
```bash
|
|
103
|
-
|
|
98
|
+
claude mcp add --scope user --transport stdio pulse-dev -- npx -y @vailent/pulse-mcp
|
|
104
99
|
```
|
|
105
100
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
To point at a different Supabase project, set these env vars before running Claude Code:
|
|
101
|
+
Then add the service role key to `~/.claude.json` under the `pulse-dev` server's `env`:
|
|
109
102
|
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
|
|
103
|
+
```json
|
|
104
|
+
"env": {
|
|
105
|
+
"PULSE_SUPABASE_KEY": "ask Sal for the key"
|
|
106
|
+
}
|
|
113
107
|
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// bin/setup.ts
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
5
|
+
import { homedir } from "os";
|
|
6
|
+
import { join } from "path";
|
|
7
|
+
var CLAUDE_JSON = join(homedir(), ".claude.json");
|
|
8
|
+
var SERVER_NAME = "pulse-dev";
|
|
9
|
+
var MCP_CONFIG = {
|
|
10
|
+
type: "stdio",
|
|
11
|
+
command: "npx",
|
|
12
|
+
args: ["-y", "@vailent/pulse-mcp"],
|
|
13
|
+
env: {
|
|
14
|
+
PULSE_SUPABASE_URL: "https://eppugcfjlqovlauykzfe.supabase.co",
|
|
15
|
+
PULSE_SUPABASE_KEY: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVwcHVnY2ZqbHFvdmxhdXlremZlIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3NDA1ODY1NiwiZXhwIjoyMDg5NjM0NjU2fQ.aoFu_uYEy9Rz3tc_I-RjjzVmCRMmjeVMhcOzkqEr0EE"
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
function setup() {
|
|
19
|
+
console.log("\n \x1B[1mPulse MCP Setup\x1B[0m\n");
|
|
20
|
+
let config = {};
|
|
21
|
+
if (existsSync(CLAUDE_JSON)) {
|
|
22
|
+
try {
|
|
23
|
+
config = JSON.parse(readFileSync(CLAUDE_JSON, "utf-8"));
|
|
24
|
+
} catch {
|
|
25
|
+
console.log(" \x1B[31m\u2717\x1B[0m Could not parse ~/.claude.json");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!config.mcpServers || typeof config.mcpServers !== "object") {
|
|
30
|
+
config.mcpServers = {};
|
|
31
|
+
}
|
|
32
|
+
config.mcpServers[SERVER_NAME] = MCP_CONFIG;
|
|
33
|
+
writeFileSync(CLAUDE_JSON, JSON.stringify(config, null, 2) + "\n");
|
|
34
|
+
console.log(" \x1B[32m\u2713\x1B[0m Added \x1B[1mpulse-dev\x1B[0m to ~/.claude.json");
|
|
35
|
+
console.log(" \x1B[32m\u2713\x1B[0m Configured with dev Supabase credentials");
|
|
36
|
+
console.log();
|
|
37
|
+
console.log(" Restart Claude Code to connect. Then try:");
|
|
38
|
+
console.log(' \x1B[2m"what features are in progress this week?"\x1B[0m');
|
|
39
|
+
console.log();
|
|
40
|
+
}
|
|
41
|
+
setup();
|
package/dist/server.js
CHANGED
|
@@ -41722,6 +41722,13 @@ function normalizeWorkItemState(updates, current) {
|
|
|
41722
41722
|
return result;
|
|
41723
41723
|
}
|
|
41724
41724
|
|
|
41725
|
+
// lib/cascade-request-status.ts
|
|
41726
|
+
var TERMINAL_STATUSES = ["shipped", "missed", "killed"];
|
|
41727
|
+
async function cascadeStatusToRequests(supabase, featureId, newStatus) {
|
|
41728
|
+
if (!TERMINAL_STATUSES.includes(newStatus)) return;
|
|
41729
|
+
await supabase.from("work_items").update({ status: newStatus, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("accepted_feature_id", featureId);
|
|
41730
|
+
}
|
|
41731
|
+
|
|
41725
41732
|
// tools/features.ts
|
|
41726
41733
|
async function handleFeatures(params) {
|
|
41727
41734
|
const supabase = getAdminClient();
|
|
@@ -41813,6 +41820,9 @@ async function handleFeatures(params) {
|
|
|
41813
41820
|
const updates = normalizeWorkItemState(raw, current || void 0);
|
|
41814
41821
|
const { error: error2 } = await supabase.from("work_items").update(updates).eq("id", featureId);
|
|
41815
41822
|
if (error2) return err(error2.message);
|
|
41823
|
+
if (updates.status) {
|
|
41824
|
+
await cascadeStatusToRequests(supabase, featureId, updates.status);
|
|
41825
|
+
}
|
|
41816
41826
|
return ok({ id: featureId, ...updates }, `Updated feature ${featureId}`);
|
|
41817
41827
|
}
|
|
41818
41828
|
case "delete": {
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vailent/pulse-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Pulse MCP server — manage pods, features, workstreams, bugs, and more from Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"pulse-mcp": "./dist/server.js"
|
|
7
|
+
"pulse-mcp": "./dist/server.js",
|
|
8
|
+
"pulse-setup": "./dist/bin/setup.js"
|
|
8
9
|
},
|
|
9
10
|
"scripts": {
|
|
10
|
-
"build": "tsup server.ts --format esm --outDir dist --clean",
|
|
11
|
+
"build": "tsup server.ts bin/setup.ts --format esm --outDir dist --clean",
|
|
11
12
|
"prepublishOnly": "npm run build"
|
|
12
13
|
},
|
|
13
14
|
"dependencies": {
|