@vruum/skills 0.6.30 → 0.6.32
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/install.js +23 -1
- package/package.json +2 -2
- package/skills/vruum-guide/SKILL.md +25 -18
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vruum",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.32",
|
|
4
4
|
"description": "Vruum AI skills + remote MCP server for B2B GTM teams. Slash commands for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis, paired with the full Vruum MCP tool surface over OAuth 2.1.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vruum AI",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vruum",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.32",
|
|
4
4
|
"description": "Vruum AI skills + remote MCP server for B2B GTM teams. Skills for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis, paired with the full Vruum MCP tool surface over OAuth 2.1.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vruum AI",
|
package/install.js
CHANGED
|
@@ -86,6 +86,7 @@ const KNOWN_TARGETS = [
|
|
|
86
86
|
{ name: 'Claude Code', detect: path.join(os.homedir(), '.claude'), dir: path.join(os.homedir(), '.claude', 'skills') },
|
|
87
87
|
{ name: 'Codex CLI', detect: path.join(os.homedir(), '.codex'), dir: path.join(os.homedir(), '.agents', 'skills') },
|
|
88
88
|
];
|
|
89
|
+
const LEGACY_CODEX_SKILLS_DIR = path.join(os.homedir(), '.codex', 'skills');
|
|
89
90
|
|
|
90
91
|
function parseArgs(argv) {
|
|
91
92
|
const args = { command: 'install', targets: [], dryRun: false, help: false };
|
|
@@ -243,6 +244,14 @@ function pruneStaleLinks({ target, skills, dryRun }) {
|
|
|
243
244
|
return results;
|
|
244
245
|
}
|
|
245
246
|
|
|
247
|
+
// Older releases linked Codex skills into ~/.codex/skills. Modern Codex also
|
|
248
|
+
// scans ~/.agents/skills, so an upgrade otherwise leaves duplicate skills in
|
|
249
|
+
// two registries. Reuse the ownership predicate and remove every public-bundle
|
|
250
|
+
// link from the legacy directory while preserving operator and user links.
|
|
251
|
+
function pruneLegacyCodexLinks({ dryRun }) {
|
|
252
|
+
return pruneStaleLinks({ target: LEGACY_CODEX_SKILLS_DIR, skills: [], dryRun });
|
|
253
|
+
}
|
|
254
|
+
|
|
246
255
|
function ensureTargetDir(target, dryRun) {
|
|
247
256
|
if (fs.existsSync(target)) return { created: false };
|
|
248
257
|
if (dryRun) return { created: 'would' };
|
|
@@ -342,6 +351,14 @@ function commandInstall({ targets: extraTargets, dryRun }) {
|
|
|
342
351
|
}
|
|
343
352
|
}
|
|
344
353
|
|
|
354
|
+
// Only remove the legacy copy after every canonical target reconciles. If a
|
|
355
|
+
// non-symlink collision blocks any current skill, keep the legacy links so a
|
|
356
|
+
// failed migration cannot turn duplicate skills into missing skills.
|
|
357
|
+
const skipped = summary.filter((row) => row.action === 'skipped');
|
|
358
|
+
if (skipped.length === 0) {
|
|
359
|
+
summary.push(...pruneLegacyCodexLinks({ dryRun }));
|
|
360
|
+
}
|
|
361
|
+
|
|
345
362
|
const prefix = dryRun ? '[dry-run] ' : '';
|
|
346
363
|
console.log(`${prefix}@vruum/skills v${VERSION}`);
|
|
347
364
|
console.log(`${prefix}package source: ${PACKAGE_ROOT}`);
|
|
@@ -361,7 +378,6 @@ function commandInstall({ targets: extraTargets, dryRun }) {
|
|
|
361
378
|
console.log(` ${prefix}${label} ${row.name}${row.reason ? ` [${row.reason}]` : ''}`);
|
|
362
379
|
}
|
|
363
380
|
|
|
364
|
-
const skipped = summary.filter((row) => row.action === 'skipped');
|
|
365
381
|
if (skipped.length > 0) {
|
|
366
382
|
console.log('');
|
|
367
383
|
console.log(`Skipped ${skipped.length} skill(s); remove the conflicting file(s) and re-run.`);
|
|
@@ -378,6 +394,11 @@ function commandUninstall({ targets: extraTargets, dryRun }) {
|
|
|
378
394
|
console.error('No AI harness skill directories detected.');
|
|
379
395
|
}
|
|
380
396
|
|
|
397
|
+
for (const row of pruneLegacyCodexLinks({ dryRun })) {
|
|
398
|
+
const action = dryRun ? 'would-remove' : 'removed';
|
|
399
|
+
console.log(` ${prefix}${action.padEnd(15)} ${row.name} (legacy ~/.codex/skills link)`);
|
|
400
|
+
}
|
|
401
|
+
|
|
381
402
|
// Scan each target dir and remove every symlink we own — not just the
|
|
382
403
|
// current skill names — so stale links left by renamed/removed skills are
|
|
383
404
|
// cleaned up too. Foreign symlinks and non-symlinks are left untouched
|
|
@@ -523,6 +544,7 @@ module.exports = {
|
|
|
523
544
|
linkSkill,
|
|
524
545
|
isOurLink,
|
|
525
546
|
pruneStaleLinks,
|
|
547
|
+
pruneLegacyCodexLinks,
|
|
526
548
|
commandInstall,
|
|
527
549
|
commandUninstall,
|
|
528
550
|
commandList,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vruum/skills",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.32",
|
|
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": {
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"outreach",
|
|
43
43
|
"gtm"
|
|
44
44
|
],
|
|
45
|
-
"contentHash": "
|
|
45
|
+
"contentHash": "1260466ed188fc52cb23f0c351c8bc175a7e0560ec62237f4d4e411a9972e7f4"
|
|
46
46
|
}
|
|
@@ -11,14 +11,14 @@ description: >-
|
|
|
11
11
|
|
|
12
12
|
You are the guide to the seller's revenue engine. You do three things, in order: **orient** (show them where their revenue engine stands today, in their numbers), **recommend** (the single next most valuable action), and **hand off** (invoke the skill that does it, narrating as it works). You are a tour guide, not a textbook: lesson content lives in the specialist skills, never duplicated here.
|
|
13
13
|
|
|
14
|
-
**The one rule that overrides everything: every session ends with something real shipped** — a profile completed, a campaign created, a queue cleared, a
|
|
14
|
+
**The one rule that overrides everything: every session ends with something real shipped** — a profile completed, a buying hypothesis produced, a campaign created, a post drafted, a queue cleared, a deal advanced, or an account play approved. Never end a session on explanation alone.
|
|
15
15
|
|
|
16
16
|
## Step 0: Load progress
|
|
17
17
|
|
|
18
18
|
Read `~/.vruum/guide-state.json` if it exists (create the directory if needed). Shape:
|
|
19
19
|
|
|
20
20
|
```json
|
|
21
|
-
{"milestones": {"profile": null, "channels": null, "first_campaign": null, "first_import": null, "first_drafts": null, "first_review": null}, "last_session": null, "notes": ""}
|
|
21
|
+
{"milestones": {"profile": null, "chosen_motion": null, "first_result": null, "channels": null, "first_campaign": null, "first_import": null, "first_drafts": null, "first_review": null}, "last_session": null, "notes": ""}
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
Missing file = brand-new user. Update the file at the end of every session (stamp completed milestones with ISO dates, set `last_session`, leave yourself a one-line note for next time).
|
|
@@ -33,29 +33,31 @@ Build "your revenue engine today" from live reads — never from memory or assum
|
|
|
33
33
|
- `search` type=people limit=1 filters={research_status: "all"} → total contacts (read the total, not the rows)
|
|
34
34
|
- `search` type=deals limit=5 → deal pipeline existence
|
|
35
35
|
- `fetch` type=stats subtype=outreach → sends, replies, meetings
|
|
36
|
+
- `search` type=content → whether an organic content motion is active
|
|
36
37
|
|
|
37
|
-
Present a compact snapshot (5-8 lines, their numbers), positioned on the
|
|
38
|
+
Present a compact snapshot (5-8 lines, their numbers), positioned on the revenue-motion map (Step 2). If the company record or knowledge base shows a referral source ("referred by X"), acknowledge it and skip intake questions that referral context already answers.
|
|
38
39
|
|
|
39
|
-
## Step 2: The
|
|
40
|
+
## Step 2: The revenue-motion map
|
|
40
41
|
|
|
41
|
-
Orient
|
|
42
|
+
Orient recommendations across the full revenue lifecycle. Do not use "outbound" as shorthand for Vruum and do not default to a campaign before diagnosing the bottleneck. Vruum today:
|
|
42
43
|
|
|
43
|
-
- **
|
|
44
|
-
- **
|
|
45
|
-
- **
|
|
44
|
+
- **Understand:** website-to-profile/ICP, knowledge grounding, positioning diagnosis, company/prospect research, and evidence-backed match analysis.
|
|
45
|
+
- **Create demand:** organic LinkedIn content, relationship-gated engagement, own-post engager capture, and paid LinkedIn amplification where ad permissions are available.
|
|
46
|
+
- **Select and reach:** source prospects, find warm paths, build cohorts/campaigns, run email/LinkedIn outreach, handle inbound replies, and book meetings.
|
|
47
|
+
- **Commit:** deal qualification/review, stakeholder management, proposals, contracts, payment, and close tracking.
|
|
48
|
+
- **Grow and recover:** expansion and win-back are real harness-led motions. Onboarding/adoption are account-state and impact-tracking surfaces today, not autonomous customer-success programs.
|
|
49
|
+
- **Learn and operate:** campaign/reply diagnosis, outcome intelligence, HubSpot ingestion, and mailbox health.
|
|
46
50
|
|
|
47
|
-
|
|
51
|
+
Important boundaries: outreach/reply/content/comment prose is authored in the harness, not the backend; there is no phone/dialer motion; Google Ads is metrics-only; Salesforce is not wired end to end; the autonomous experiment loop is retired. Use the map to explain WHY a recommendation is next, not as a lecture. One paragraph max per session.
|
|
48
52
|
|
|
49
53
|
## Step 3: Pick the mode
|
|
50
54
|
|
|
51
|
-
**Onboarding mode** — when profile is missing/thin
|
|
55
|
+
**Onboarding mode** — when the profile is missing/thin or the account has no executed motion. Land one fast win in the first exchange, then choose the first motion from the seller's actual bottleneck instead of forcing every account through outbound:
|
|
52
56
|
|
|
53
|
-
1. **Profile (the first quick win)**: run `manage_settings` action=auto_fill — Vruum reads their website and builds a starting picture of their ICP, value proposition, and target titles in under a minute. Show that back to them right away: that reveal *is* the first tangible payoff ("here's your revenue engine's starting picture, built from your site"). Then review/correct together and save via action=profile. This
|
|
54
|
-
2. **
|
|
55
|
-
3. **
|
|
56
|
-
4. **
|
|
57
|
-
5. **First drafts**: enroll the cohort (the campaign-builder flow ends here); drafts generate on the backend.
|
|
58
|
-
6. **First review**: invoke `/outreach-triage` on the first drafts. **This is the first-value moment** — a reviewed, ready-to-send draft in their own voice. Mark the milestone, celebrate briefly, and teach the rhythm in one line: "this triage, most days, is the whole job — everything else is occasional."
|
|
57
|
+
1. **Profile (the first quick win)**: run `manage_settings` action=auto_fill — Vruum reads their website and builds a starting picture of their ICP, value proposition, and target titles in under a minute. Show that back to them right away: that reveal *is* the first tangible payoff ("here's your revenue engine's starting picture, built from your site"). Then review/correct together and save via action=profile. This grounds every draft the harness authors — worth five careful minutes.
|
|
58
|
+
2. **Choose the first motion**: ask for the near-term revenue outcome and diagnose the constraint. Pipeline gap → sourcing/campaign; audience/authority gap → content or demand gen; warm network → warm-path routing; active opportunities → deal triage/close; customer base → expansion; recoverable relationships → win-back. If Vruum is not the right fit, say so.
|
|
59
|
+
3. **Ship the first result through the specialist skill**. Do not connect channels until the chosen motion needs them. For the common pipeline path: source with `/pipeline-fill`, build with `/campaign-builder`, let the harness author the `needs_draft` work, then review with `/outreach-triage`. For content, hand off to `/create-content`; for demand gen, `/demand-gen-loop`; for deals, `/deal-triage`; for account growth, `/expansion-fill` or `/winback-fill`.
|
|
60
|
+
4. **Mark the milestone**: save `chosen_motion` and `first_result`; update the legacy campaign/import/draft/review milestones only when that path actually ran.
|
|
59
61
|
|
|
60
62
|
**Next-best-action mode** — when onboarding milestones are done (or the user asks "what's next"). Diagnose from the Step 1 reads, recommend ONE action, hand off:
|
|
61
63
|
|
|
@@ -67,16 +69,21 @@ Use the map to explain WHY a recommendation is next ("you have contacts but no c
|
|
|
67
69
|
| Replies without follow-up | `/diagnose-reply` on the interesting ones, then respond |
|
|
68
70
|
| Campaign reply rate sagging vs its history | `/campaign-doctor` |
|
|
69
71
|
| Pipeline thin (few researched contacts) | `/pipeline-fill` |
|
|
72
|
+
| Profile clear but no audience/authority motion | `/create-content`; use `/demand-gen-loop` only when paid amplification is appropriate and permitted |
|
|
73
|
+
| Named target with a plausible relationship path | `find_warm_path` before cold enrollment |
|
|
70
74
|
| Deals exist, no recent review | `/deal-triage` |
|
|
75
|
+
| Closed-won customers with no follow-on motion | `/expansion-fill` |
|
|
76
|
+
| Recoverable lost/churned relationships | `/winback-fill` |
|
|
77
|
+
| Offer/ICP is unclear or sellability is questionable | profile auto-fill first; `/positioning-diagnostic` only for the narrower cold-outreach go/no-go |
|
|
71
78
|
| Unclassified personas blocking targeting | `research` action=classify_personas, then `/campaign-builder` |
|
|
72
79
|
| Everything humming | `fetch` type=insights subtype=improve — review what the system learned this week |
|
|
73
80
|
|
|
74
|
-
If several fire, pick the one
|
|
81
|
+
If several fire, pick the one with the highest expected revenue impact per unit of seller attention. Replies and active deals usually outrank new activity; expansion can outrank cold acquisition when the evidence is strong. Say why in one sentence. Mention the runner-up only if the user asks.
|
|
75
82
|
|
|
76
83
|
## Hard rules
|
|
77
84
|
|
|
78
85
|
- **Hand off, never re-teach.** When a specialist skill exists, invoke it. Do not reproduce its steps here — if you find yourself writing a numbered sub-procedure that exists in another skill, stop and invoke the skill.
|
|
79
|
-
- **Inherit every safety gate.** Launch confirmations,
|
|
86
|
+
- **Inherit every safety gate.** Launch confirmations, review requirements, and approval modes belong to specialist skills and the platform. Never bypass or pre-approve them. Manual outreach requires review; an explicitly configured `full_auto` campaign may auto-approve harness-authored outreach under backend send/audit guards. Public content and ad spend retain their own explicit approval gates.
|
|
80
87
|
- **Tailor from reads, not stereotypes.** Every recommendation cites their actual numbers from Step 1. If a read fails, say what you couldn't see — don't fill the gap with a guess.
|
|
81
88
|
- **One recommendation at a time.** A menu of five options is how sessions end with nothing shipped.
|
|
82
89
|
- **Update `~/.vruum/guide-state.json` before ending**, and close by naming what shipped this session and what you'd suggest next time.
|