@vruum/skills 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Vruum AI skills for Claude Code, Codex CLI, and any AI assistant with a skill directory.
4
4
 
5
- Pairs with the Vruum MCP server at [https://api.vruum.ai/mcp](https://api.vruum.ai/mcp). For MCP-native clients (Claude Code, Claude Desktop, Cursor, VS Code Copilot, Cline), connecting to the MCP URL surfaces these skills as native slash commands. This npm package is for assistants that don't yet support MCP prompts (Codex CLI, ChatGPT, Windsurf).
5
+ Pairs with the Vruum MCP server at [https://api.vruum.ai/mcp](https://api.vruum.ai/mcp). The MCP server exposes the `invoke_skill` tool (alongside `list_skills` / `get_skill` / `publish_skill`) so any connected client can run these skills. Skills themselves are distributed via the Claude Code plugin / marketplace; this npm package installs them into the agent-standard skills directory for harnesses without plugin support (Codex CLI, ChatGPT, Windsurf).
6
6
 
7
7
  ## Install
8
8
 
@@ -18,7 +18,7 @@ Add to `~/.claude.json`:
18
18
  }
19
19
  ```
20
20
 
21
- Slash commands appear automatically once registered. You don't need this npm package for Claude Code.
21
+ Install the skills via the Claude Code plugin / marketplace (below); the MCP server provides the `invoke_skill` tool. You don't need this npm package for Claude Code.
22
22
 
23
23
  ### Codex CLI
24
24
 
@@ -45,17 +45,17 @@ npx @vruum/skills install --target /path/to/skills/dir # any other harness
45
45
 
46
46
  ### Cursor / VS Code Copilot / Cline
47
47
 
48
- Register the MCP server via your editor's MCP setup (each one has its own UI / config path). Connect to `https://api.vruum.ai/mcp` (HTTP, OAuth via standard MCP flow). Skills surface as slash commands automatically you don't need this npm package.
48
+ Register the MCP server via your editor's MCP setup (each one has its own UI / config path). Connect to `https://api.vruum.ai/mcp` (HTTP, OAuth via standard MCP flow). The `invoke_skill` tool becomes availableto also install the skill files locally, use this npm package's `install --target` below.
49
49
 
50
50
  ### Claude Desktop / Claude.ai (Cowork)
51
51
 
52
- Install the Vruum plugin via the official plugin directory — bundles the connector and slash commands in one step:
52
+ Install the Vruum plugin via the official plugin directory — bundles the connector and the skills in one step:
53
53
 
54
54
  [github.com/vruum-gtm/skills/releases/latest/download/vruum-plugin.zip](https://github.com/vruum-gtm/skills/releases/latest/download/vruum-plugin.zip)
55
55
 
56
56
  Download and upload via **Settings → Customize → Plugins → "+"**.
57
57
 
58
- ### ChatGPT / Windsurf / other harnesses without MCP prompts
58
+ ### ChatGPT / Windsurf / other harnesses without plugin support
59
59
 
60
60
  ```bash
61
61
  npx @vruum/skills install --target /path/to/skills/dir
package/install.js CHANGED
@@ -2,12 +2,12 @@
2
2
  /**
3
3
  * @vruum/skills installer.
4
4
  *
5
- * For AI assistants that don't natively support MCP prompts (Codex CLI,
5
+ * For AI assistants without Claude Code plugin support (Codex CLI,
6
6
  * ChatGPT, Windsurf) — installs SKILL.md files into the target harness's
7
- * skill directory so slash commands still work. For clients that DO
8
- * support MCP prompts (Claude Code, Claude Desktop, Cursor, VS Code,
9
- * Cline), you don't need this — just connect to https://api.vruum.ai/mcp
10
- * and slash commands appear automatically.
7
+ * skill directory so the skills are available locally. For Claude Code,
8
+ * install the skills via the plugin / marketplace instead; in every case
9
+ * the Vruum MCP server at https://api.vruum.ai/mcp provides the
10
+ * `invoke_skill` tool to run a skill on demand.
11
11
  *
12
12
  * Zero runtime dependencies — stdlib Node only.
13
13
  *
@@ -123,9 +123,9 @@ Usage:
123
123
  npx @vruum/skills uninstall Remove previously-installed symlinks
124
124
  npx @vruum/skills list Show detected targets + what's installed
125
125
 
126
- Pairs with the Vruum MCP server at https://api.vruum.ai/mcp. Connect your AI
127
- assistant to that URL first, then these skills turn common workflows into
128
- slash commands.
126
+ Pairs with the Vruum MCP server at https://api.vruum.ai/mcp, which provides
127
+ the invoke_skill tool. This installer puts the SKILL.md files into a harness's
128
+ local skill directory so the skills are available there too.
129
129
 
130
130
  Supported auto-detection:
131
131
  - Claude Code ~/.claude/skills/
@@ -133,11 +133,10 @@ Supported auto-detection:
133
133
 
134
134
  Any other harness: pass --target <its skills directory>.
135
135
 
136
- Note: Claude Code, Claude Desktop, Cursor, VS Code Copilot, and Cline all
137
- support MCP prompts natively. If you use one of those, you don't need this
138
- installer connecting to https://api.vruum.ai/mcp surfaces slash commands
139
- automatically. This installer is for Codex CLI, ChatGPT, Windsurf, and
140
- other assistants that don't yet support MCP prompts.`);
136
+ Note: for Claude Code, install the skills via the Vruum plugin / marketplace
137
+ instead of this installer. This installer is for Codex CLI, ChatGPT, Windsurf,
138
+ and other assistants without plugin support. In every case the MCP server's
139
+ invoke_skill tool can run a skill on demand.`);
141
140
  }
142
141
 
143
142
  function listAvailableSkills() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vruum/skills",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "Vruum AI skills for Claude Code, Claude Desktop, Codex CLI, and any AI assistant with a skill directory. Slash commands for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis. Pairs with the Vruum MCP server at https://api.vruum.ai/mcp.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,5 +39,5 @@
39
39
  "outreach",
40
40
  "gtm"
41
41
  ],
42
- "contentHash": "753b0d94ad80acaf1986cadaa6502df2a6b6f32a913ec9b39349922331378345"
42
+ "contentHash": "d630c9b27e3423b309b80927c4a24d30372ac614826a3539d8e0a089723d5ca2"
43
43
  }
@@ -5,24 +5,24 @@ description: >-
5
5
  diagnose campaign, why is my campaign not working, campaign health, low reply
6
6
  rate, check campaigns, which campaigns need help.
7
7
  ---
8
- # Segment Doctor
8
+ # Campaign Doctor
9
9
 
10
- You are a segment diagnostics and optimization agent. Your job is to identify struggling segments, diagnose root causes, and recommend (or apply) fixes.
10
+ You are a campaign diagnostics and optimization agent. Your job is to identify struggling campaigns, diagnose root causes, and recommend (or apply) fixes.
11
11
 
12
12
  ## Workflow
13
13
 
14
14
  ### Step 1: Triage — health + trends
15
15
 
16
- Call `get_campaigns` to list all segments. For each segment, dispatch three calls in parallel:
16
+ Call `get_campaigns` to list all campaigns. For each campaign, dispatch three calls in parallel:
17
17
  - `diagnose_campaign(campaign_id=X)` — returns `health_score` (0–100), reply-rate vs company average, and ranked root causes (targeting, messaging, channel, saturation, cadence, timing).
18
18
  - `get_performance_metrics(view='funnel', campaign_id=X, start_date=<today_utc - 6d>, end_date=<today_utc + 1d>)` — current 7-day window (7 full days ending today, inclusive).
19
19
  - `get_performance_metrics(view='funnel', campaign_id=X, start_date=<today_utc - 13d>, end_date=<today_utc - 7d>)` — prior 7-day window (7 full days ending the day before current starts — no shared days).
20
20
 
21
21
  Use **UTC** dates in `YYYY-MM-DD` format. The backend filters use inclusive `gte(start_date)` + `lte(end_date)` against timestamp columns — so passing `end_date = today_utc + 1d` captures all of today's activity (timestamps < tomorrow 00:00 UTC), and the current/prior windows share no days. Example: if today (UTC) is 2026-04-22, current = `(2026-04-16, 2026-04-23)`, prior = `(2026-04-09, 2026-04-15)`.
22
22
 
23
- If `get_campaigns` returns no segments, tell the user "No segments yet — create one in the Vruum app before running diagnosis" and stop.
23
+ If `get_campaigns` returns no campaigns, tell the user "No campaigns yet — create one in the Vruum app before running diagnosis" and stop.
24
24
 
25
- Classify each segment by reply rate (from `diagnose_campaign` output). Reply rate is a **diagnostic triage proxy** here — it cheaply flags which segments to look at. It is not segment health itself: the objective is client revenue, and a segment can post a strong reply rate while producing no deals (or a weak one while closing). Treat the band as "where to point the diagnosis," and in the operator flow always reconcile it against meetings and the downstream signal (Block 14 below) before calling a segment healthy.
25
+ Classify each campaign by reply rate (from `diagnose_campaign` output). Reply rate is a **diagnostic triage proxy** here — it cheaply flags which campaigns to look at. It is not campaign health itself: the objective is client revenue, and a campaign can post a strong reply rate while producing no deals (or a weak one while closing). Treat the band as "where to point the diagnosis," and in the operator flow always reconcile it against meetings and the downstream signal (Block 14 below) before calling a campaign healthy.
26
26
 
27
27
  - **CRITICAL** — 30-day reply rate < 5% with ≥20 sent
28
28
  - **WARNING** — 30-day reply rate 5–10% with ≥20 sent
@@ -30,38 +30,38 @@ Classify each segment by reply rate (from `diagnose_campaign` output). Reply rat
30
30
  - **INSUFFICIENT DATA** — `diagnose_campaign` returned `insufficient_data: true` (fewer than 20 sent in 30d)
31
31
 
32
32
  For WoW delta, compute `(current_reply_rate - prior_reply_rate) / prior_reply_rate`. Guards:
33
- - **Brand-new segment** (prior window sent = 0): show "new segment, WoW N/A".
33
+ - **Brand-new campaign** (prior window sent = 0): show "new campaign, WoW N/A".
34
34
  - **Low-volume** (prior window sent < 5): show "low volume — WoW unreliable" instead of a percentage.
35
35
  - **Zero-baseline** (prior sent ≥ 5 but prior reply_rate = 0, so denominator would be 0): show the absolute change as percentage points, e.g. "0% → 3.2% (first replies this week)" instead of dividing.
36
36
 
37
37
  Present results grouped by urgency:
38
38
 
39
- "Segment health across N segments:
39
+ "Campaign health across N campaigns:
40
40
 
41
41
  CRITICAL:
42
42
  - 'IT Directors' — 2.1% reply rate (30d), 145 sent, 1 reply — WoW: -18%
43
- - 'CFO Northeast' — 3.5% reply rate (30d), 28 sent, 1 reply — new segment, WoW N/A
43
+ - 'CFO Northeast' — 3.5% reply rate (30d), 28 sent, 1 reply — new campaign, WoW N/A
44
44
 
45
45
  WARNING:
46
46
  - 'VP Engineering' — 7.2% reply rate (30d), trending down from 11% (WoW -34%)
47
47
 
48
48
  INSUFFICIENT DATA (< 20 sends in 30d):
49
- - 'New Segment' — only 8 sends. Need 20+ for diagnosis. Run /pipeline-fill to add volume, check back in a few days.
49
+ - 'New Campaign' — only 8 sends. Need 20+ for diagnosis. Run /pipeline-fill to add volume, check back in a few days.
50
50
 
51
51
  HEALTHY:
52
52
  - 'DFW CFOs' — 14.3% reply rate (WoW +4%)
53
53
  - 'Startup Founders' — 18.1% reply rate (low volume — WoW unreliable)
54
54
 
55
- Want me to diagnose the critical and warning segments?"
55
+ Want me to diagnose the critical and warning campaigns?"
56
56
 
57
57
  Key behaviors:
58
- - Never auto-diagnose `insufficient_data` segments. They need more volume first.
59
- - If `get_performance_metrics` returns an empty funnel for the prior window, treat it as "new segment, WoW N/A" (not -100%).
58
+ - Never auto-diagnose `insufficient_data` campaigns. They need more volume first.
59
+ - If `get_performance_metrics` returns an empty funnel for the prior window, treat it as "new campaign, WoW N/A" (not -100%).
60
60
  - If the funnel is empty for the current window too, fall back to the 30-day reply rate from `diagnose_campaign` output — don't show a fake zero.
61
61
 
62
62
  ### Step 2: Diagnose root causes
63
63
 
64
- For each segment the user wants to diagnose, you already have the `diagnose_campaign` output from Step 1's parallel calls. Present the findings:
64
+ For each campaign the user wants to diagnose, you already have the `diagnose_campaign` output from Step 1's parallel calls. Present the findings:
65
65
 
66
66
  "**'IT Directors'** — Health score: 25/100
67
67
 
@@ -69,7 +69,7 @@ Root causes (ranked):
69
69
  1. **TARGETING (high)**: Average match score 58/100. Replied prospects average 82. Targeting is too broad.
70
70
  → Recommendation: Tighten target titles, add industry filters
71
71
 
72
- 2. **MESSAGING (high)**: Reply rate 2.1% vs company average 9.4% — segment performing at 22% of baseline.
72
+ 2. **MESSAGING (high)**: Reply rate 2.1% vs company average 9.4% — campaign performing at 22% of baseline.
73
73
  → Recommendation: Review tone instructions, consider A/B test
74
74
 
75
75
  3. **CHANNEL (medium)**: Email 1.2%, LinkedIn 4.8% — LinkedIn is 4x more effective.
@@ -82,7 +82,7 @@ Want me to apply any of these fixes?"
82
82
 
83
83
  Key behaviors:
84
84
  - If `diagnose_campaign` returned `insufficient_data`, surface the tool's own `message` field verbatim. Don't re-derive the threshold logic.
85
- - When multiple segments share the same root cause dimension (e.g., all have messaging issues), recommend a cross-segment fix first.
85
+ - When multiple campaigns share the same root cause dimension (e.g., all have messaging issues), recommend a cross-campaign fix first.
86
86
 
87
87
  ### Step 3: Apply fixes (with approval)
88
88
 
@@ -105,7 +105,7 @@ Always confirm before applying. Show the exact fields that will change.
105
105
 
106
106
  After all fixes are applied:
107
107
 
108
- "Segment doctor complete:
108
+ "Campaign doctor complete:
109
109
  - 'IT Directors': Tightened target titles (removed 3 generic titles), shifted to LinkedIn-first channel mix
110
110
  - 'VP Engineering': Updated tone instructions
111
111
  - 'CFO Northeast': Suggested broader saved search; run /pipeline-fill once updated
@@ -114,7 +114,7 @@ Monitor results over the next 7 days. Run /campaign-doctor again next week to ch
114
114
 
115
115
  ## Notes
116
116
 
117
- - `diagnose_campaign` requires 20+ sent touches in 30 days for meaningful analysis. For newer segments, wait — do not attempt diagnosis.
117
+ - `diagnose_campaign` requires 20+ sent touches in 30 days for meaningful analysis. For newer campaigns, wait — do not attempt diagnosis.
118
118
  - Reply-rate thresholds for health bands match `diagnose_campaign.health_score` output: <30 ≈ CRITICAL, 30–75 ≈ WARNING, ≥75 ≈ HEALTHY (see `health_score` field).
119
119
  - WoW comparison uses two `get_performance_metrics(view='funnel', campaign_id=X)` calls — **always UTC dates in YYYY-MM-DD**, current = `(today-7d, today)`, prior = `(today-14d, today-7d)`. If prior-window sent < 5, show "low volume — WoW unreliable" instead of a percentage.
120
120
  - Root causes are ranked by severity. Focus on the highest-severity issues first.