@vruum/skills 0.6.12 → 0.6.14

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.12",
3
+ "version": "0.6.14",
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.12",
3
+ "version": "0.6.14",
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/README.md CHANGED
@@ -71,6 +71,7 @@ npx @vruum/skills install --target /path/to/skills/dir
71
71
  - `/create-content` — Co-produce an on-voice LinkedIn content post — pull your own signal, steer the angle conversationally, draft in your voice, then save as draft, schedule, or publish. Use when: write a post, draft LinkedIn content, create content, post about, content co-production, help me write a post.
72
72
  - `/csv-pipeline-fill` — CSV harness source for /pipeline-fill. Reads a CSV, auto-detects headers, maps columns, hands off to /pipeline-fill for harness deep research and import. Use when: import CSV, paste a CSV, csv import, prospect list from CSV, csv harness mode.
73
73
  - `/deal-triage` — Triage your active deal pipeline. Flags at-risk deals, surfaces stalled-deal alerts, runs MEDDIC qualification, and recommends next actions. Use when: review deals, triage deals, check pipeline, deal review, morning deals, pipeline review, deal health, at-risk deals.
74
+ - `/demand-gen-loop` — Run the full demand-gen motion end to end from your harness — set a goal, build the audience, co-produce the creative, get explicit approval, boost the published post, then monitor engagement and bridge engagers into outreach. Hands off to the specialist skills behind a HARD approval gate. Use when: run demand gen, demand gen loop, goal to boosted post, launch a paid post, boost a post, sponsor a post, full marketing motion, paid amplification.
74
75
  - `/diagnose-reply` — Diagnose why a reply happened — what worked or didn't in the outreach that triggered it. Use when: why did they reply, what worked, diagnose reply, reply diagnosis, analyze this reply, what caused this reply, reply analysis.
75
76
  - `/engagement-triage` — Review and approve your pending LinkedIn engagement drafts and demand-gen content posts. Use when: triage engagements, review engagement queue, review warming comments, review nurture reactions, review marketing comments, review content drafts, check engagement queue.
76
77
  - `/enrich-prospect` — Deep prospect diarization — synthesize everything known about a person into a structured intelligence profile. Use when: enrich prospect, deep research, profile this person, who is this person, research prospect, diarize prospect, prospect briefing.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vruum/skills",
3
- "version": "0.6.12",
3
+ "version": "0.6.14",
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": "17217868c3eeaa5fc934d9acb79850de7c00c4a489fbc3a4a84edd5c4277dd6c"
45
+ "contentHash": "75c65b4c64f80f5bc1f8ed25ae7d41c5c02806cbcb3d80d7224e900002bb2d8c"
46
46
  }
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: demand-gen-loop
3
+ description: >-
4
+ Run the full demand-gen motion end to end from your harness — set a goal,
5
+ build the audience, co-produce the creative, get explicit approval, boost the
6
+ published post, then monitor engagement and bridge engagers into outreach.
7
+ Hands off to the specialist skills behind a HARD approval gate. Use when: run
8
+ demand gen, demand gen loop, goal to boosted post, launch a paid post, boost a
9
+ post, sponsor a post, full marketing motion, paid amplification.
10
+ ---
11
+ # Demand-Gen Loop
12
+
13
+ You guide the seller through the whole demand-gen motion in one session: **goal → audience → creative → approve → boost → monitor**. You are a tour guide, not a textbook — you orient on the seller's real numbers, then **hand off** to the specialist skill that owns each piece. The value here is the *spine* that connects them and the **hard approval gate** that sits in front of any spend, not a re-explanation of work another skill already does.
14
+
15
+ **The rule that overrides everything: nothing spends and nothing publishes until the seller has explicitly approved copy, creative, budget, AND audience.** Default every step to `draft`. The loop can run all the way to "ready to boost" on its own; the seller's money and their public feed are the two things only they can authorize.
16
+
17
+ ## Step 1: Goal intake — ground on who they are
18
+
19
+ Before talking about creative, read the account so the goal is grounded in their real ICP, signal, and history — never from memory:
20
+
21
+ - `fetch` type=seller_signals → what the seller actually has to say (their calls, posts, notes, knowledge). This is the raw material for the angle.
22
+ - `fetch` type=stats subtype=outreach → sends, replies, meetings — the demand baseline this post is trying to move.
23
+ - `fetch` type=settings subtype=profile → company profile / ICP completeness.
24
+
25
+ If `seller_signals` comes back empty (no calls/posts/notes yet), say so plainly and run a **profile-only** goal: build the angle from the company profile and the seller's stated objective alone. Don't invent signal you don't have.
26
+
27
+ Then settle a one-line goal with the seller in plain language: *who* they want to reach and *what* they want them to do (book a call, learn about a launch, hear a point of view). Hold that goal — every later step references it.
28
+
29
+ ## Step 2: Audience — preview the cohort, iterate to the right one
30
+
31
+ Turn the goal into targeting criteria and **preview before committing**:
32
+
33
+ - `search` with `type="people"` and the criteria (include `filters={research_status: "all"}` so stub imports are visible). Read the **total count** and show a **5-row sample** (name, title, company, persona, the attributes that matched).
34
+ - Iterate the criteria conversationally until the cohort is the right size and shape for the goal. An empty preview means the criteria are too tight — loosen and re-run; never proceed to boost on a zero-count audience.
35
+
36
+ This is the same segmentation conversation `/campaign-builder` runs — **do not reproduce its steps here.** If the seller wants to turn this cohort into an outreach campaign too, hand off to **`/campaign-builder`**. For the boost itself you don't need to pre-materialize an audience: the boost in Step 5 accepts the `{criteria}` directly (it builds the matched audience internally), or a `{matched_audience_id}` if one already exists.
37
+
38
+ Hold the settled audience (the `{criteria}` you previewed, or a `matched_audience_id`). It is one of the four things the seller approves in Step 4.
39
+
40
+ ## Step 3: Creative — copy, then the visual
41
+
42
+ **Copy — hand off, don't write it here.** Invoke **`/create-content`** to co-produce the on-voice post. That skill owns author resolution, signal grounding, the steer→draft loop, and the publish guards — narrate it as it works, but never reproduce its drafting procedure. It leaves you a **draft** content post (its id is what Step 5 boosts). Keep the post a draft for now — publish is gated behind the seller's approval in Step 4.
43
+
44
+ **Visual — generate it on your own tokens, then store it as a draft.** Vruum does not host image-generation infra, so *you* (the harness) generate the ad image yourself and hand Vruum the bytes:
45
+
46
+ - Generate the image with your own image tools, guided by the settled goal + the approved copy's angle.
47
+ - Store it as a **draft** creative via `manage_campaign` kind='ad' action='store_creative', payload `{image_base64 (raw base64, no data: URL prefix), generation_prompt, generation_provenance: {model, tool, generated_at, notes}}`. It lands as a draft library asset (zero spend, approval is separate). Pass the real `generation_prompt` and provenance so the asset is auditable.
48
+
49
+ Note the split the platform makes: the **stored creative** is the versioned/library visual asset; the thing the boost actually sponsors is the **published organic post** (Step 5). Attaching the image to the organic post is out of scope for this loop — store it as the creative asset and move on.
50
+
51
+ ## Step 4: HARD approval gate — the money-and-feed checkpoint
52
+
53
+ This is the load-bearing step. **Before any publish or any spend**, lay out all four things together and get the seller's explicit go-ahead on each:
54
+
55
+ 1. **Copy** — the exact post text from `/create-content`.
56
+ 2. **Creative** — the stored visual (generation prompt + provenance).
57
+ 3. **Budget** — the daily/total budget you're about to commit. Budget rides the money-gate: state the number in plain currency and get an explicit "yes, spend this."
58
+ 4. **Audience** — the previewed cohort (count + the criteria or `matched_audience_id`).
59
+
60
+ Invariants — these never bend:
61
+
62
+ - **No spend or publish before approval.** Until the seller has approved all four, you do not call publish and you do not call boost. Period.
63
+ - **Always default to draft.** Both the stored creative and the boost default to `draft`. Draft is the resting state; "live" is something the seller turns on, never something you assume.
64
+ - **Never auto-boost without explicit budget approval.** Do **not** call boost with `approval_mode='auto'` unless the seller has explicitly approved the specific budget in this step. `approval_mode='auto'` is what pushes real paid spend to LinkedIn; absent an explicit budget yes, you pass `approval_mode='draft'` (or omit it — draft is the default) so the campaign lands in the approval queue instead of spending.
65
+
66
+ If the seller hesitates on any of the four, stop at draft and leave the loop resumable — nothing is lost, nothing has spent.
67
+
68
+ ## Step 5: Launch — publish, then boost
69
+
70
+ Only after the Step 4 approvals:
71
+
72
+ 1. **Publish the organic post** — `manage_content action=publish` on the draft from `/create-content`. (This inherits `/create-content`'s author guard: if the chosen author's LinkedIn account isn't connected/healthy, publish fails hard rather than posting under another identity — surface that to the seller, don't retry blindly.) This is the post the boost will sponsor.
73
+ 2. **Boost the published post** — `manage_campaign` kind='ad' action='boost', payload `{content_post_id: <the just-published post id>, budget: {daily_budget_cents | total_budget_cents}, audience: {criteria} OR {matched_audience_id}, duration_days?, approval_mode}`. Use the `approval_mode` the seller authorized in Step 4 — `draft` unless they explicitly approved the budget for `auto`. The boost double-submit case is handled for you (the endpoint is idempotent on the content post), so don't paper over a retry with a second call.
74
+
75
+ Report back what went live: the published post and whether the boost is a draft awaiting approval in the queue or pushed.
76
+
77
+ ## Step 6: Monitor + bridge to outreach
78
+
79
+ The loop doesn't end at "boosted." Teach the operating rhythm:
80
+
81
+ - **Engagement** — `fetch` type=post_analytics (omit the id for all posts, or pass the post id) for impressions / reactions / comments and the per-post `engagers` sample. `fetch` type=ads subtype=attribution for what the paid spend is attributable to.
82
+ - **The bridge** — engagers on your own published/boosted posts are captured automatically and fanned out as activity; the cron bridges warm engagers toward outreach. The seller's job is the rhythm, not the plumbing: check the **outreach queue** for newly-bridged people, and run **`/engagement-triage`** to review and approve the engagement drafts and demand-gen content the post generates. Point them there — don't reproduce its review procedure.
83
+
84
+ Close by naming what shipped this session (post live, boost drafted/pushed, first engagers visible) and what the next check-in should look at.
85
+
86
+ ## Hard rules
87
+
88
+ - **Hand off, never re-teach.** `/create-content` owns copy, `/campaign-builder` owns campaign segmentation, `/engagement-triage` owns engagement review. When one of them owns a step, invoke it and narrate — if you catch yourself writing a numbered sub-procedure that already lives in another skill, stop and hand off.
89
+ - **Inherit every safety gate.** The publish author guard, the boost idempotency, the approval queue — they belong to the platform and the specialist skills. Never bypass, summarize past, or pre-approve through them.
90
+ - **The approval gate is not optional and not summarizable.** Copy + creative + budget + audience, each explicitly approved, before any publish or spend. Default to draft. Never `approval_mode='auto'` without an explicit budget yes.
91
+ - **Tailor from reads, not stereotypes.** Goal, audience, and angle all cite the seller's real numbers from Step 1. If a read fails, say what you couldn't see — don't fill the gap with a guess.
@@ -38,7 +38,7 @@ Keep it short. The user knows their queue — they just need the numbers to deci
38
38
 
39
39
  Once the user says go (or picks a focus area), pull the lightweight message queue via `search` with type=messages, a status=draft filter, and limit=100. This returns message IDs, person names, categories, sequence numbers, and match scores WITHOUT message content. Very cheap on tokens.
40
40
 
41
- **Authoring mode (needs_draft items).** The backend no longer writes outreach prose — touches arrive as `needs_draft` items carrying the decision context (channel, touch number, signals) and no content. These are not rewrites; they are blank pages. For each needs_draft item the subagent AUTHORS the message: check the person's research freshness (research older than ~14 days or missing → research first with WebSearch + the research reads, and persist what you learn via `research` action=save_person so it compounds), then write the touch from scratch in the seller's voice against the same quality standards as any review, then submit it via `manage_messages` action=edit with the content — that transitions the item to a normal draft — and approve only what the user's standing instructions allow. Inbound replies also arrive as needs_draft (category inbound_reply, with the conversation attached): author the reply with full thread context. If a prospect turns out to be a bad fit at authoring time, skip the item and say why — authoring is the second qualification gate, not an obligation to write.
41
+ **Authoring mode (needs_draft items).** The backend no longer writes outreach prose — touches arrive as `needs_draft` items carrying the decision context (channel, touch number, signals) and no content. These are not rewrites; they are blank pages. For each needs_draft item the subagent AUTHORS the message: check the person's research freshness from the review item itself — `person_researched_at` / `company_researched_at` / `research_status` are on the payload, no extra fetch needed (older than ~14 days or missing → research first with WebSearch + the research reads, and persist what you learn via `research` action=save_person, plus action=save_company when you learned something about the company, so it compounds), then write the touch from scratch in the seller's voice against the same quality standards as any review, then submit it via `manage_messages` action=edit with the content — that transitions the item to a normal draft — and approve only what the user's standing instructions allow. Inbound replies also arrive as needs_draft (category inbound_reply, with the conversation attached): author the reply with full thread context. If a prospect turns out to be a bad fit at authoring time, skip the item and say why — authoring is the second qualification gate, not an obligation to write.
42
42
 
43
43
  Categorize into three processing groups:
44
44
 
@@ -4,7 +4,7 @@ You are reviewing and improving outreach messages before they go to a human oper
4
4
 
5
5
  You do NOT approve or send messages. You review, edit if needed, and return a structured summary.
6
6
 
7
- **needs_draft items are authoring jobs, not reviews.** The item arrives with decision context (channel, touch number, signals, prior touches) and NO content — the backend does not write prose. Author the message from scratch: verify research freshness first (missing or >14 days stale → research with WebSearch and the research reads, persist findings via `research` action=save_person), then write the touch in the seller's voice to the same standards below, and submit it with `manage_messages` action=edit (content) — that turns it into a normal draft for the orchestrator's approval flow. If the prospect is a bad fit on fresh evidence, recommend skip with the reason instead of writing.
7
+ **needs_draft items are authoring jobs, not reviews.** The item arrives with decision context (channel, touch number, signals, prior touches) and NO content — the backend does not write prose. Author the message from scratch: verify research freshness first — the review item carries `person_researched_at`, `company_researched_at`, and `research_status`, so no extra fetch is needed (missing or >14 days stale → research with WebSearch and the research reads, persist findings via `research` action=save_person, and action=save_company for company-level findings), then write the touch in the seller's voice to the same standards below, and submit it with `manage_messages` action=edit (content) — that turns it into a normal draft for the orchestrator's approval flow. If the prospect is a bad fit on fresh evidence, recommend skip with the reason instead of writing.
8
8
 
9
9
  ## Step 1: Load your messages
10
10