@vruum/skills 0.5.2 → 0.6.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 +13 -11
- package/install.js +11 -5
- package/package.json +2 -2
- package/skills/create-content/SKILL.md +40 -11
- package/skills/csv-pipeline-fill/SKILL.md +0 -10
- package/skills/deal-triage/SKILL.md +0 -10
- package/skills/diagnose-reply/SKILL.md +0 -10
- package/skills/engagement-triage/SKILL.md +0 -10
- package/skills/enrich-prospect/SKILL.md +0 -10
- package/skills/expansion-fill/SKILL.md +0 -8
- package/skills/outreach-triage/SKILL.md +0 -10
- package/skills/pipeline-fill/RESEARCH-ENGINE.md +1 -1
- package/skills/pipeline-fill/SKILL.md +5 -15
- package/skills/sales-nav-deep-fill/SKILL.md +0 -10
- package/skills/segment-doctor/SKILL.md +0 -10
- package/skills/winback-fill/SKILL.md +0 -8
- package/skills/yc-pipeline-fill/SKILL.md +0 -10
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ Add to `~/.claude.json`:
|
|
|
13
13
|
```json
|
|
14
14
|
{
|
|
15
15
|
"mcpServers": {
|
|
16
|
-
"vruum
|
|
16
|
+
"vruum": { "type": "http", "url": "https://api.vruum.ai/mcp" }
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
```
|
|
@@ -22,23 +22,25 @@ Slash commands appear automatically once registered. You don't need this npm pac
|
|
|
22
22
|
|
|
23
23
|
### Codex CLI
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
**Plugin (recommended)** — bundles the skills + Vruum MCP in one step:
|
|
26
26
|
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
```bash
|
|
28
|
+
codex plugin marketplace add vruum-gtm/skills
|
|
29
|
+
codex plugin add vruum@vruum-gtm
|
|
30
|
+
codex mcp login vruum
|
|
30
31
|
```
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
**Manual / other harnesses** — register the MCP, then install the skills into the agent-standard skills dir:
|
|
33
34
|
|
|
34
|
-
```
|
|
35
|
-
|
|
35
|
+
```toml
|
|
36
|
+
# ~/.codex/config.toml
|
|
37
|
+
[mcp_servers.vruum]
|
|
38
|
+
url = "https://api.vruum.ai/mcp"
|
|
36
39
|
```
|
|
37
40
|
|
|
38
|
-
Detects `~/.codex/skills/` automatically. For other harnesses without a known path:
|
|
39
|
-
|
|
40
41
|
```bash
|
|
41
|
-
npx @vruum/skills install
|
|
42
|
+
npx @vruum/skills install # detects ~/.agents/skills/
|
|
43
|
+
npx @vruum/skills install --target /path/to/skills/dir # any other harness
|
|
42
44
|
```
|
|
43
45
|
|
|
44
46
|
### Cursor / VS Code Copilot / Cline
|
package/install.js
CHANGED
|
@@ -78,9 +78,13 @@ function injectPrelude(skillDir) {
|
|
|
78
78
|
|
|
79
79
|
// Known harness skill directories. Add a target here when a new harness
|
|
80
80
|
// lands on a stable skill-dir convention.
|
|
81
|
+
// `detect` = the harness's config dir (its presence means the harness is
|
|
82
|
+
// installed); `dir` = where that harness actually reads skills from. Claude
|
|
83
|
+
// Code reads ~/.claude/skills; Codex CLI (and other agents on the
|
|
84
|
+
// agentskills.io standard) read ~/.agents/skills.
|
|
81
85
|
const KNOWN_TARGETS = [
|
|
82
|
-
{ name: 'Claude Code', dir: path.join(os.homedir(), '.claude', 'skills') },
|
|
83
|
-
{ name: 'Codex CLI',
|
|
86
|
+
{ name: 'Claude Code', detect: path.join(os.homedir(), '.claude'), dir: path.join(os.homedir(), '.claude', 'skills') },
|
|
87
|
+
{ name: 'Codex CLI', detect: path.join(os.homedir(), '.codex'), dir: path.join(os.homedir(), '.agents', 'skills') },
|
|
84
88
|
];
|
|
85
89
|
|
|
86
90
|
function parseArgs(argv) {
|
|
@@ -125,7 +129,7 @@ slash commands.
|
|
|
125
129
|
|
|
126
130
|
Supported auto-detection:
|
|
127
131
|
- Claude Code ~/.claude/skills/
|
|
128
|
-
- Codex CLI ~/.
|
|
132
|
+
- Codex CLI ~/.agents/skills/
|
|
129
133
|
|
|
130
134
|
Any other harness: pass --target <its skills directory>.
|
|
131
135
|
|
|
@@ -231,9 +235,11 @@ function linkSkill({ name, srcAbs, target, dryRun }) {
|
|
|
231
235
|
|
|
232
236
|
function detectTargets(extraTargets) {
|
|
233
237
|
const targets = [];
|
|
234
|
-
// Auto-detect only when the
|
|
238
|
+
// Auto-detect only when the harness's config dir exists (the skills dir may
|
|
239
|
+
// not exist yet — e.g. ~/.agents/skills for a fresh Codex user — and gets
|
|
240
|
+
// created at link time).
|
|
235
241
|
for (const known of KNOWN_TARGETS) {
|
|
236
|
-
if (fs.existsSync(known.
|
|
242
|
+
if (fs.existsSync(known.detect)) {
|
|
237
243
|
targets.push({ ...known, autoDetected: true });
|
|
238
244
|
}
|
|
239
245
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vruum/skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
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": {
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"outreach",
|
|
37
37
|
"gtm"
|
|
38
38
|
],
|
|
39
|
-
"contentHash": "
|
|
39
|
+
"contentHash": "5f98cbfea97d8be6ad68c50e12dca22533d20dcae067a0d5558d06e173ac1c72"
|
|
40
40
|
}
|
|
@@ -6,7 +6,6 @@ description: >-
|
|
|
6
6
|
publish. Use when: write a post, draft LinkedIn content, create content, post
|
|
7
7
|
about, content co-production, help me write a post.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
9
|
# /create-content
|
|
11
10
|
|
|
12
11
|
You co-produce a LinkedIn post in the seller's own voice. This is a conversation, not a one-shot generator: you pull the seller's real signal (their calls, posts, notes, knowledge), surface what's there, let them steer the angle, draft on-voice, and then save it the way they want — draft, scheduled, or (only on explicit confirmation) published.
|
|
@@ -21,19 +20,36 @@ Open with a single question if the seller hasn't already said what they want to
|
|
|
21
20
|
|
|
22
21
|
Keep it light. You're not locking a brief yet — you just need a seed string to retrieve relevant signal. Do not call any tool until you have at least a rough topic.
|
|
23
22
|
|
|
24
|
-
## Step 2:
|
|
23
|
+
## Step 2: Resolve the author (whose LinkedIn account)
|
|
24
|
+
|
|
25
|
+
A client can have **multiple people**, each with their own connected LinkedIn account. The post must be drafted from the right person's signal and authored from their account. Before pulling any signal, find out who you're authoring as.
|
|
26
|
+
|
|
27
|
+
Call `get_channel_status` and read `channels.linkedin_accounts` — a list of accounts, each with `account_id`, `account_name`, `user_id`, `user_name`, `user_email`, `status`, `connected`, `has_sales_nav`, and `quota`.
|
|
28
|
+
|
|
29
|
+
Then pick the author **`user_id`** to use:
|
|
30
|
+
|
|
31
|
+
- **`linkedin_accounts` is missing, empty, or the `get_channel_status` call fails** → fall back to the legacy default: omit `author_user_id` entirely on the calls below and proceed. Never block content creation on this lookup.
|
|
32
|
+
- **Exactly one usable account** (one entry with a non-null `user_id`) → silently auto-select that account's `user_id`. Do **not** prompt. **Still pass it explicitly** in Step 3 and Step 5 — do not rely on omitting the param. Omitting it grounds the signal on *you* (the caller) and stores *no* author on the draft, and that single account may belong to a teammate, not you.
|
|
33
|
+
- **More than one usable account** → ask the operator **which person to author as**, presenting each option by `user_name` and `user_email`. The selectable unit is the **person (`user_id`)**, because `author_user_id` is the only selector the signal/draft tools accept — if one person has multiple LinkedIn accounts, this skill can't target them individually (say so if asked). Map the chosen person to their `user_id`.
|
|
34
|
+
- **Skip any account whose `user_id` is null/missing** when counting and presenting options (it isn't addressable as an author).
|
|
35
|
+
|
|
36
|
+
Hold the resolved `user_id` (or the decision to omit it) and use it consistently for both the signal pull and the draft.
|
|
37
|
+
|
|
38
|
+
## Step 3: Pull the seller's signal
|
|
25
39
|
|
|
26
|
-
Call `get_seller_signal_bundle` with the
|
|
40
|
+
Call `get_seller_signal_bundle` with the rough topic as the `draft_brief` argument. **If you resolved an author `user_id` in Step 2, pass it as the `author_user_id` query param** so the signal is *that person's*, not the caller's. (Omit `author_user_id` only in the legacy-fallback case from Step 2.) The brief drives a semantic re-rank, so the more concrete the topic, the more relevant the returned evidence.
|
|
41
|
+
|
|
42
|
+
**Trust boundary — handle 403 honestly.** Authoring as another person is permission-guarded server-side (a non-owner can't author as a teammate). If this call (or the draft call in Step 5) returns **403**, STOP: tell the operator plainly that they aren't entitled to author as that person, and ask them to pick a permitted author or have an owner do it. Do **not** retry with `author_user_id` omitted — that would silently fall back to caller/company-scoped generation under a different identity than was asked for.
|
|
27
43
|
|
|
28
44
|
**Ground on `formatted_evidence`.** It is the EVIDENCE-wrapped rendering prepared for drafting — the surface you should read, quote, and reason over. The backend scrubs prospect names, emails, phone numbers, and URLs out of *everything* it returns (both `formatted_evidence` and the raw `bundle` text), so you don't have to police that yourself — there is no un-redacted surface on the response. Still prefer `formatted_evidence`: it is the prepared, sectioned grounding surface, where `bundle` is just the structured raw material behind it.
|
|
29
45
|
|
|
30
46
|
`formatted_evidence` can be `null`. Null-check it before using it:
|
|
31
|
-
- If `formatted_evidence` is present → use it as the grounding evidence in Step
|
|
47
|
+
- If `formatted_evidence` is present → use it as the grounding evidence in Step 4.
|
|
32
48
|
- If `formatted_evidence` is `null` (a `formatted_evidence_skipped_reason` of `bundle_empty` means there was no signal to draw on yet; any other reason means the evidence was withheld and the `bundle` text is redacted to empty too) → say so plainly and fall back to a **profile-only draft**: write from the company voice profile and the seller's stated topic alone, with no evidence grounding.
|
|
33
49
|
|
|
34
|
-
## Step
|
|
50
|
+
## Step 3.5: Check the calendar (optional)
|
|
35
51
|
|
|
36
|
-
This step is **optional** and **must never gate the loop**. It exists only to make the brief a little smarter, not to add a precondition before drafting. If you skip it, or it returns nothing, or it errors — proceed to Step
|
|
52
|
+
This step is **optional** and **must never gate the loop**. It exists only to make the brief a little smarter, not to add a precondition before drafting. If you skip it, or it returns nothing, or it errors — proceed to Step 4 silently and draft anyway.
|
|
37
53
|
|
|
38
54
|
If a quick read of what's already on the content calendar would help shape the angle, call `get_content_calendar` **once** (the default `days` window is fine — don't loop or page). Treat the returned `posts` (each with `topic_tags`, `status`, and `scheduled_at`/`published_at`) and the `summary` as planning context only, to:
|
|
39
55
|
|
|
@@ -43,7 +59,7 @@ If a quick read of what's already on the content calendar would help shape the a
|
|
|
43
59
|
|
|
44
60
|
Surface anything useful to the seller as a light suggestion ("you posted on this theme last week — want a different angle, or a follow-up?"), never as a blocker. If `posts` is empty, the tool is unavailable, or it errors, say nothing about the calendar and just continue. Do not retry it.
|
|
45
61
|
|
|
46
|
-
## Step
|
|
62
|
+
## Step 4: Surface the evidence and settle the brief
|
|
47
63
|
|
|
48
64
|
If you have `formatted_evidence`, show the seller the relevant points you found, in plain language:
|
|
49
65
|
|
|
@@ -56,19 +72,23 @@ Which of these do you want to anchor the post on? And what's the angle — a les
|
|
|
56
72
|
|
|
57
73
|
Let the seller refine. Iterate in conversation until the brief is **settled** — you and the seller agree on the angle, the anchor evidence, and the tone. Do not generate a draft while the brief is still moving.
|
|
58
74
|
|
|
59
|
-
## Step
|
|
75
|
+
## Step 5: Draft on-voice — once
|
|
76
|
+
|
|
77
|
+
**Only once the brief is settled**, call `generate_linkedin_post`, passing the settled brief as the `topic` argument. **If you resolved an author `user_id` in Step 2, pass the same value as `author_user_id`** so the draft is written from that person's voice/signal and the draft row is stamped with their `author_user_id` (this is what later carries the author through schedule/publish). Pass the *same* `user_id` you used for the signal pull — don't let signal and draft disagree. Omit `author_user_id` only in the legacy-fallback case. The same **403** trust-boundary rule from Step 3 applies here: on 403, STOP and ask for a permitted author — never retry with the param omitted.
|
|
60
78
|
|
|
61
|
-
|
|
79
|
+
The backend writes the draft in the seller's voice and grounds it on their seller signal internally — you do not pass the evidence yourself.
|
|
62
80
|
|
|
63
81
|
`generate_linkedin_post` creates a new draft row every time it runs. Call it **once** per post. Show the seller the returned draft.
|
|
64
82
|
|
|
65
|
-
## Step
|
|
83
|
+
## Step 6: Iterate by editing — never regenerate
|
|
66
84
|
|
|
67
85
|
When the seller wants changes (tighten the hook, change the CTA, fix a line), revise the **existing** draft with `manage_content_post` using `action="edit"`, passing the updated `content`.
|
|
68
86
|
|
|
69
87
|
Never call `generate_linkedin_post` again for a revision — that spawns a duplicate draft row and loses the thread. One post = one draft row, edited in place.
|
|
70
88
|
|
|
71
|
-
|
|
89
|
+
`manage_content_post` operates on the existing draft row, which already carries the `author_user_id` you stamped at generation. You do **not** re-pass the author here — schedule/publish inherit it from the row.
|
|
90
|
+
|
|
91
|
+
## Step 7: Save — draft, schedule, or publish
|
|
72
92
|
|
|
73
93
|
When the seller is happy with the draft, ask how they want to land it. **Default to keeping it as a draft or scheduling it.**
|
|
74
94
|
|
|
@@ -79,6 +99,15 @@ When the seller is happy with the draft, ask how they want to land it. **Default
|
|
|
79
99
|
- Only call `manage_content_post` with `action="publish"` **after** the seller has explicitly confirmed "publish now."
|
|
80
100
|
- Always offer save-as-draft or schedule as the safer fallback when proposing publish.
|
|
81
101
|
|
|
102
|
+
**Author-scoped publish — the backend refuses to fall back to another identity.** Schedule/publish read the author from the draft row. For an author-scoped post (one you authored as a specific person in Step 2, so the draft carries their `author_user_id`), the backend resolves *that person's* LinkedIn account **strictly**: if their account is missing, disconnected, or its `quota` is exhausted at publish time, the publish **fails hard with an `Author account unavailable` error** instead of posting from another connected company account. So an author-scoped post can never silently go out under a *different person's identity* than the one you chose — the server enforces this, including for scheduled posts that publish later at worker execution time (long after this conversation). A legacy / no-author post (you omitted `author_user_id` in Step 2) keeps the old company-wide fallback — there's no specific identity to protect.
|
|
103
|
+
|
|
104
|
+
Because that hard failure lands at publish time — which for a scheduled post can be minutes or hours after you draft it — surface it **early** rather than letting the operator discover a dead, `failed` post later. So before you schedule or publish a post you authored as a specific person, **call `get_channel_status` again — fresh, right now, immediately before the schedule/publish call.** Do **not** trust the Step 2 snapshot: an account can disconnect, change `status`, or exhaust its `quota` during drafting and refinement. Re-read `channels.linkedin_accounts` from this *new* response and find the author's account by the `user_id` you stamped on the draft, then:
|
|
105
|
+
|
|
106
|
+
- If their account is present, `connected`, `status` is healthy, and `quota` is not exhausted **in the fresh response** → proceed with schedule/publish as normal (still behind the explicit "publish now" confirmation above).
|
|
107
|
+
- If their account is **missing, not `connected`, shows a bad `status`, or has an exhausted `quota` in the fresh response** (or the fresh `get_channel_status` call fails / omits `linkedin_accounts`, so you can't confirm the author's account is healthy) → **STOP. Do not schedule or publish.** The backend would reject this author-scoped publish as `Author account unavailable` anyway; tell the operator plainly so they don't end up with a `failed` post. Offer the safe paths: keep it as a draft, reschedule for after that person's account is reconnected / their quota resets, or pick a different permitted author and regenerate. There is no "publish under a different identity" escape hatch for an author-scoped post — the server will not do it; to post from another account the operator must deliberately regenerate the draft under that author (or with no author).
|
|
108
|
+
|
|
109
|
+
For a legacy / no-author post (you omitted `author_user_id` in Step 2) there is no specific author identity to protect, so the standard publish confirmation above is sufficient.
|
|
110
|
+
|
|
82
111
|
If the seller asks to reschedule a post that is **already scheduled**, be aware that rescheduling an already-scheduled post is not currently supported and may return a "not in draft status" error. Tell the seller this plainly rather than retrying blindly, and offer to keep the existing schedule.
|
|
83
112
|
|
|
84
113
|
## Notes
|
|
@@ -6,16 +6,6 @@ description: >-
|
|
|
6
6
|
when: import CSV, paste a CSV, csv import, prospect list from CSV, csv harness
|
|
7
7
|
mode.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
|
-
Never block skill execution on this check.
|
|
18
|
-
|
|
19
9
|
# CSV Pipeline Fill (harness source)
|
|
20
10
|
|
|
21
11
|
You are the CSV harness-mode source for `/pipeline-fill`. You read a CSV the operator provides (Apollo export, ZoomInfo, hand-built spreadsheet, LinkedIn export — anything), normalize columns to the canonical candidate-list shape, and hand off to the orchestrator.
|
|
@@ -6,16 +6,6 @@ description: >-
|
|
|
6
6
|
review deals, triage deals, check pipeline, deal review, morning deals,
|
|
7
7
|
pipeline review, deal health, at-risk deals.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
|
-
Never block skill execution on this check.
|
|
18
|
-
|
|
19
9
|
# Deal Triage
|
|
20
10
|
|
|
21
11
|
You are a deal pipeline orchestrator. Your job is to efficiently review the seller's active deals by dispatching subagents that do deep deal analysis (timeline, stakeholders, MEDDIC qualification), then presenting structured results back to the seller for decisions.
|
|
@@ -5,16 +5,6 @@ description: >-
|
|
|
5
5
|
triggered it. Use when: why did they reply, what worked, diagnose reply, reply
|
|
6
6
|
diagnosis, analyze this reply, what caused this reply, reply analysis.
|
|
7
7
|
---
|
|
8
|
-
|
|
9
|
-
## Auto-update check
|
|
10
|
-
|
|
11
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
12
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
13
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
14
|
-
- Empty → proceed silently.
|
|
15
|
-
|
|
16
|
-
Never block skill execution on this check.
|
|
17
|
-
|
|
18
8
|
# /diagnose-reply
|
|
19
9
|
|
|
20
10
|
You diagnose individual replies to understand what worked (or didn't) in the outreach that preceded them. This turns every reply into a learning event.
|
|
@@ -6,16 +6,6 @@ description: >-
|
|
|
6
6
|
warming comments, review nurture reactions, review marketing comments, review
|
|
7
7
|
content drafts, check engagement queue.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
|
-
Never block skill execution on this check.
|
|
18
|
-
|
|
19
9
|
## MCP smoke test (run early)
|
|
20
10
|
|
|
21
11
|
Before triaging, confirm Vruum MCP is reachable. Call `get_marketing_overview` as a lightweight liveness check. On failure, surface this error and stop:
|
|
@@ -6,16 +6,6 @@ description: >-
|
|
|
6
6
|
profile this person, who is this person, research prospect, diarize prospect,
|
|
7
7
|
prospect briefing.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
|
-
Never block skill execution on this check.
|
|
18
|
-
|
|
19
9
|
# /enrich-prospect
|
|
20
10
|
|
|
21
11
|
You diarize a prospect. Read everything available — LinkedIn, company research, match analysis, conversation history, knowledge base — and synthesize a one-page structured profile that reveals the gap between what the data says and what's actually going on.
|
|
@@ -6,14 +6,6 @@ description: >-
|
|
|
6
6
|
Use when: expand customer, find upsell opportunities, NRR play, expansion
|
|
7
7
|
opportunities, customers ripe for expansion, who can we expand to.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check`. Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention upgrade in one line, offer `/vruum-upgrade`, continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
9
|
# Expansion Fill
|
|
18
10
|
|
|
19
11
|
You are an expansion-side pipeline filler. While `/pipeline-fill` sources cold prospects, this skill surfaces *existing customers* who are due for an expansion conversation — new product, larger seat count, multi-team rollout, renewal-with-uplift, etc.
|
|
@@ -5,16 +5,6 @@ description: >-
|
|
|
5
5
|
when: triage, review queue, morning review, check messages, approve outreach,
|
|
6
6
|
what needs review.
|
|
7
7
|
---
|
|
8
|
-
|
|
9
|
-
## Auto-update check
|
|
10
|
-
|
|
11
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
12
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
13
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
14
|
-
- Empty → proceed silently.
|
|
15
|
-
|
|
16
|
-
Never block skill execution on this check.
|
|
17
|
-
|
|
18
8
|
# Outreach Triage
|
|
19
9
|
|
|
20
10
|
You are an outreach queue orchestrator. Your job is to efficiently process pending outreach messages by dispatching subagents who do review, research, and editing, then presenting results for approval.
|
|
@@ -41,7 +41,7 @@ Before any other Step 3 work, call `get_research_playbook(segment_id=<id>)`. If
|
|
|
41
41
|
|
|
42
42
|
> Vruum MCP not configured as a user-scoped server. Run:
|
|
43
43
|
>
|
|
44
|
-
> Register the Vruum MCP server in your assistant once: Claude Code → `~/.claude.json` `mcpServers.vruum
|
|
44
|
+
> Register the Vruum MCP server in your assistant once: Claude Code → `~/.claude.json` `mcpServers.vruum = {"type":"http","url":"https://api.vruum.ai/mcp"}`; Codex CLI → `~/.codex/config.toml` `[mcp_servers.vruum]` with `url = "https://api.vruum.ai/mcp"`; other assistants → connect to `https://api.vruum.ai/mcp` (HTTP, OAuth via standard MCP flow).
|
|
45
45
|
>
|
|
46
46
|
> and retry. (The cloud `claude.ai Vruum` connector doesn't propagate to subagents — they need `vruum` configured at the user scope in `~/.claude.json`.)
|
|
47
47
|
|
|
@@ -7,16 +7,6 @@ description: >-
|
|
|
7
7
|
gate. Use when: fill pipeline, import prospects, daily imports, need more
|
|
8
8
|
prospects, discover prospects from scratch, deep research before import.
|
|
9
9
|
---
|
|
10
|
-
|
|
11
|
-
## Auto-update check
|
|
12
|
-
|
|
13
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
14
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
15
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
16
|
-
- Empty → proceed silently.
|
|
17
|
-
|
|
18
|
-
Never block skill execution on this check.
|
|
19
|
-
|
|
20
10
|
# Pipeline Fill
|
|
21
11
|
|
|
22
12
|
You are a source-agnostic pipeline filler. You pick segments to fill, pick a source per segment (Sales Nav / YC / CSV / discovery), and orchestrate harness deep research that gates against the segment ICP before saving prospects into the backend pipeline.
|
|
@@ -45,8 +35,8 @@ This skill uses two subagents (defined in `.claude/agents/`):
|
|
|
45
35
|
|
|
46
36
|
Subagents need access to the Vruum MCP server. Register it once in your AI assistant:
|
|
47
37
|
|
|
48
|
-
- **Claude Code**: `~/.claude.json` → `mcpServers.vruum
|
|
49
|
-
- **Codex CLI**: `~/.codex/config.toml` → `[mcp_servers.vruum
|
|
38
|
+
- **Claude Code**: `~/.claude.json` → `mcpServers.vruum` = `{"type": "http", "url": "https://api.vruum.ai/mcp"}`
|
|
39
|
+
- **Codex CLI**: `~/.codex/config.toml` → `[mcp_servers.vruum]` with `url = "https://api.vruum.ai/mcp"`
|
|
50
40
|
- **Other**: connect to `https://api.vruum.ai/mcp` (HTTP, OAuth via standard MCP flow)
|
|
51
41
|
|
|
52
42
|
The orchestrator's MCP precheck at the top of Step 3 (`get_research_playbook` call) catches misconfiguration upfront. Don't skip it.
|
|
@@ -141,9 +131,9 @@ Operator gives a brief like "Series A-C SaaS founders, US, 50-500 ppl" or "direc
|
|
|
141
131
|
2. **Source companies first** — use harness tools to find candidate companies matching the brief:
|
|
142
132
|
- `WebSearch` for funding announcements, news, lists ("Series A SaaS 2026", "TechCrunch Series B SaaS announcements")
|
|
143
133
|
- `WebFetch` on Crunchbase / PitchBook / company directories
|
|
144
|
-
- `
|
|
145
|
-
3. **Source people from each company** — for each candidate company, use `
|
|
146
|
-
4. **Dedup against existing pipeline** — for each discovered person, check `
|
|
134
|
+
- `mcp__vruum__search_linkedin_people` for company-fitting roles when the brief is people-shaped (e.g. "VPs of Eng at Series A SaaS")
|
|
135
|
+
3. **Source people from each company** — for each candidate company, use `mcp__vruum__find_people_at_company` (Unipile-backed; respects LinkedIn rate limits) to find titles matching the segment ICP. Cap at ~5 people per company to spread the discovery surface.
|
|
136
|
+
4. **Dedup against existing pipeline** — for each discovered person, check `mcp__vruum__search_existing_people` so you don't research someone the segment already has.
|
|
147
137
|
5. **Show the discovered list to the operator** before handoff. Format: `Name (title) — Company [linkedin]`. Cap the surface at 2x daily_target so we don't over-source. Get a "go" / "drop X" before continuing.
|
|
148
138
|
|
|
149
139
|
Discovery-path candidates produced in either path use the canonical shape in `RESEARCH-ENGINE.md` and feed into Step 3 the same way.
|
|
@@ -6,16 +6,6 @@ description: >-
|
|
|
6
6
|
/pipeline-fill for deep research and import. Use when: sales nav with deep
|
|
7
7
|
research, sales nav harness mode, in-chat sales nav.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
|
-
Never block skill execution on this check.
|
|
18
|
-
|
|
19
9
|
# Sales Nav Deep Fill (harness source)
|
|
20
10
|
|
|
21
11
|
You are the Sales Nav harness-mode source for `/pipeline-fill`. You produce a candidate list from a Sales Nav saved search and hand off to the orchestrator for deep research, harness gate, and save chain.
|
|
@@ -5,16 +5,6 @@ description: >-
|
|
|
5
5
|
diagnose segment, why is my segment not working, segment health, low reply
|
|
6
6
|
rate, check segments, which segments need help.
|
|
7
7
|
---
|
|
8
|
-
|
|
9
|
-
## Auto-update check
|
|
10
|
-
|
|
11
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
12
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
13
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
14
|
-
- Empty → proceed silently.
|
|
15
|
-
|
|
16
|
-
Never block skill execution on this check.
|
|
17
|
-
|
|
18
8
|
# Segment Doctor
|
|
19
9
|
|
|
20
10
|
You are a segment diagnostics and optimization agent. Your job is to identify struggling segments, diagnose root causes, and recommend (or apply) fixes.
|
|
@@ -7,14 +7,6 @@ description: >-
|
|
|
7
7
|
revive cold deals, 90-day silent revival, lost deal recovery, lost customer
|
|
8
8
|
outreach.
|
|
9
9
|
---
|
|
10
|
-
|
|
11
|
-
## Auto-update check
|
|
12
|
-
|
|
13
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check`. Interpret output:
|
|
14
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention upgrade in one line, offer `/vruum-upgrade`, continue.
|
|
15
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, continue.
|
|
16
|
-
- Empty → proceed silently.
|
|
17
|
-
|
|
18
10
|
# Winback Fill
|
|
19
11
|
|
|
20
12
|
You are a winback-side pipeline filler. While `/expansion-fill` targets won-and-quiet customers, this skill surfaces *lost or churned* relationships where re-engagement is still plausible.
|
|
@@ -6,16 +6,6 @@ description: >-
|
|
|
6
6
|
/pipeline-fill for deep research and import. Use when: YC pipeline fill,
|
|
7
7
|
source from YC, fill segment with YC founders, sales nav dried up, source YC.
|
|
8
8
|
---
|
|
9
|
-
|
|
10
|
-
## Auto-update check
|
|
11
|
-
|
|
12
|
-
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
-
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
-
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
-
- Empty → proceed silently.
|
|
16
|
-
|
|
17
|
-
Never block skill execution on this check.
|
|
18
|
-
|
|
19
9
|
# YC Pipeline Fill (harness source)
|
|
20
10
|
|
|
21
11
|
You are the YCombinator harness-mode source for `/pipeline-fill`. You scrape YC's public directory, extract founder LinkedIn URLs, dedup, and hand a candidate list to the orchestrator. No deep research, no harness gate, no save chain in this skill — that's all in `pipeline-fill/RESEARCH-ENGINE.md`.
|