@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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vruum",
3
- "version": "0.6.30",
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.30",
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.30",
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": "edb317856c2825036b1d3d8017b14b908386a977b3d0f05efc61e0db0cee7762"
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 first draft reviewed. Never end a session on explanation alone.
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 bowtie 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
+ 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 bowtie map
40
+ ## Step 2: The revenue-motion map
40
41
 
41
- Orient every capability on the revenue bowtie awareness education selection **commit** onboard adoption expansion. Vruum today:
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
- - **Left side (acquisition) — fully run by Vruum:** sourcing (`/pipeline-fill`, CSV import), campaign targeting (`/campaign-builder`), multi-channel outreach with send-time drafting, reply handling, meeting booking, warming + content (`/engagement-triage`, `/create-content`).
44
- - **Commit:** deal pipeline + MEDDIC review (`/deal-triage`), proposals, close tracking.
45
- - **Right side (onboard / adopt / expand):** Vruum is your **system of record** here today (accounts, impact events, the bowtie scoreboard via `fetch` type=scoreboard subtype=bowtie); the autonomous engine for these stages is on the roadmap. Say this honestly — do not imply the right side runs itself.
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
- Use the map to explain WHY a recommendation is next ("you have contacts but no campaign that's the selection stage sitting idle"), not as a lecture. One paragraph max per session.
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 OR no campaigns exist. This is a freshly connected account: land one fast win in the very first exchange, then walk the sequence to the first reviewed draft, one milestone per exchange, handing off at each step:
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 powers every draft Vruum writes — worth five careful minutes.
54
- 2. **Channels**: check channel_status; for any disconnected channel send them the exact settings URL to connect LinkedIn/email (connection happens in the web plumbing, not the harness). Don't block the session on it continue and circle back.
55
- 3. **First contacts**: their CSV (`import_prospects`, offer custom-column mapping + list mirroring) or sourced fresh (`/pipeline-fill`).
56
- 4. **First campaign**: invoke `/campaign-builder` and narrate.
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 closest to revenue (replies > queue > enrollment > sourcing) and say why in one sentence. Mention the runner-up only if the user asks.
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, draft approvals, and queue reviews belong to the specialist skills and the platform. Never bypass, summarize past, or pre-approve through them. Nothing sends without the seller's explicit review.
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.