Ops leadgen skill
OPS on-demand: This skill should be used when the user asks to "leadgen drafts", "cold email approve"…
by Lifecycle-Innovations-Limited·MIT license·★ 543 Stars on the repo·GitHub ↗
npx degit Lifecycle-Innovations-Limited/claude-ops/claude-ops/skills/ops-leadgen#main ~/.claude/skills/ops-leadgenChecked ·commit main
Inside this skill
SKILL.md · the author's own words# ops-leadgen Load `ops-rules` before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If `AskUserQuestion` / `Work… Wraps `my-project-leadgen` CLI for the daily leadgen review-and-send loop. **Repo:** `~/Projects/my-project-b2b-leadgen` **DB:** `~/Projects/my-project-b2b-leadgen/leads.db` (gitignored) **Run with Doppler:** `doppler run --project my-project-b2b-leadgen --config dev -- my-project-leadgen <cmd>` ## Argument routing | Argument | Action | | -------------------- | ------------------------------------------------ | | `review` (default) | Show pending drafts one-by-one, approve or skip | | `send --draft-id N` | Hand one draft to the host's approved outbound gate (Rule 6) |
Word-for-word excerpt, not a result. Read the full SKILL.md ↓
Files of Ops leadgen
Show the full text104 lines
ops-leadgen
Load ops-rules before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If AskUserQuestion / Workflow are missing, follow Rule 10 in ops-rules (Hermes: numbered options / two-turn Telegram card; delegate_task).
Wraps my-project-leadgen CLI for the daily leadgen review-and-send loop.
Repo: ~/Projects/my-project-b2b-leadgen
DB: ~/Projects/my-project-b2b-leadgen/leads.db (gitignored)
Run with Doppler: doppler run --project my-project-b2b-leadgen --config dev -- my-project-leadgen <cmd>
Argument routing
| Argument | Action |
|---|---|
review (default) |
Show pending drafts one-by-one, approve or skip |
send --draft-id N |
Hand one draft to the host's approved outbound gate (Rule 6) |
usage |
Print today's Apollo reveals + Apify runs |
scrape [--limit N] |
Discover new NL HR contacts via Apollo |
enrich |
Run Apify enrichment on unenriched leads |
draft |
Generate Claude NL/EN drafts for undrafted leads |
Review + send flow (Rule 6)
NEVER send multiple drafts in one turn. Each send is a separate staged-draft → approval → send cycle.
- Run
my-project-leadgen review(or fetch pending drafts from DB directly) - For each pending draft, show the user:
- Lead: name, title, company, email
- Language, subject, full body
- Ask:
[Send]/[Skip]/[Stop review] - On
[Send]: one draft, one approval, one send, only through the host's approved outbound gate. a. Pass the exact recipient, subject and full latest body to that gate; it shows the complete text and binds the owner's native yes to those bytes. b. Approval is that native yes on the shown draft only. A typed word, file, token or counter is never consent, and one approval never covers another draft. c. After the gate reports delivery, confirm it on a fresh read of the sent mail, then record the send in the leadgen database. d. If the gate refuses or cannot send this channel, keep the draft pending with the exact diagnostic. Never run a direct sender as a substitute for the gate. - Move to the next draft only after the current one is fully resolved.
Scrape → enrich → draft (pipeline)
# Step 1: discover contacts (costs Apollo reveals — check usage first)
doppler run --project my-project-b2b-leadgen --config dev -- \
my-project-leadgen usage
doppler run --project my-project-b2b-leadgen --config dev -- \
my-project-leadgen scrape --limit 50
# Step 2: enrich with Apify website crawler
doppler run --project my-project-b2b-leadgen --config dev -- \
my-project-leadgen enrich
# Step 3: generate Claude drafts
doppler run --project my-project-b2b-leadgen --config dev -- \
my-project-leadgen draft
# Step 4: review + send (Rule-6 gated, one at a time)
doppler run --project my-project-b2b-leadgen --config dev -- \
my-project-leadgen review
Daily usage cap
- Apollo reveals: 200/day max (tracked in
leads.db daily_usage) - Apify runs: ~$0.02/run (3 pages per domain)
- Always run
usagefirst to check remaining reveals before scraping
DB queries (read-only diagnostics)
# Pending drafts count
sqlite3 ~/Projects/my-project-b2b-leadgen/leads.db \
"SELECT count(*) FROM drafts WHERE status='pending';"
# Today's sends
sqlite3 ~/Projects/my-project-b2b-leadgen/leads.db \
"SELECT d.subject, l.email, s.sent_at FROM sends s
JOIN drafts d ON d.id=s.draft_id
JOIN leads l ON l.id=d.lead_id
WHERE date(s.sent_at)=date('now');"
Rule 6 — no exceptions
Per ops-rules Rule 6: every outbound send is one draft, one approval, one send,
only through the host's approved outbound gate. A local file, shell token or
counter is defense in depth at most, never the owner's consent. Each draft needs its
own native approval on the latest shown text.
| 1 | |
| 2 | name ops-leadgen |
| 3 | description "OPS on-demand: This skill should be used when the user asks to \"leadgen drafts\", \"cold email approve\"…" |
| 4 | argument-hint '[review | send --draft-id N | usage | scrape | draft]' |
| 5 | allowed-tools |
| 6 | - Bash |
| 7 | - Read |
| 8 | effort low |
| 9 | maxTurns 20 |
| 10 | |
| 11 | |
| 12 | # ops-leadgen |
| 13 | |
| 14 | Load `ops-rules` before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If `AskUserQuestion` / `Workflow` are missing, follow Rule 10 in `ops-rules` (Hermes: numbered options / two-turn Telegram card; `delegate_task`). |
| 15 | |
| 16 | Wraps `my-project-leadgen` CLI for the daily leadgen review-and-send loop. |
| 17 | |
| 18 | **Repo:** `~/Projects/my-project-b2b-leadgen` |
| 19 | **DB:** `~/Projects/my-project-b2b-leadgen/leads.db` (gitignored) |
| 20 | **Run with Doppler:** `doppler run --project my-project-b2b-leadgen --config dev -- my-project-leadgen <cmd>` |
| 21 | |
| 22 | ## Argument routing |
| 23 | |
| 24 | | Argument | Action | |
| 25 | | -------------------- | ------------------------------------------------ | |
| 26 | | `review` (default) | Show pending drafts one-by-one, approve or skip | |
| 27 | | `send --draft-id N` | Hand one draft to the host's approved outbound gate (Rule 6) | |
| 28 | | `usage` | Print today's Apollo reveals + Apify runs | |
| 29 | | `scrape [--limit N]` | Discover new NL HR contacts via Apollo | |
| 30 | | `enrich` | Run Apify enrichment on unenriched leads | |
| 31 | | `draft` | Generate Claude NL/EN drafts for undrafted leads | |
| 32 | |
| 33 | ## Review + send flow (Rule 6) |
| 34 | |
| 35 | **NEVER send multiple drafts in one turn. Each send is a separate staged-draft → approval → send cycle.** |
| 36 | |
| 37 | Run `my-project-leadgen review` (or fetch pending drafts from DB directly) |
| 38 | For each pending draft, show the user: |
| 39 | Lead: name, title, company, email |
| 40 | Language, subject, full body |
| 41 | Ask: `[Send]` / `[Skip]` / `[Stop review]` |
| 42 | On `[Send]`: one draft, one approval, one send, only through the host's |
| 43 | approved outbound gate. |
| 44 | a. Pass the exact recipient, subject and full latest body to that gate; it shows |
| 45 | the complete text and binds the owner's native yes to those bytes. |
| 46 | b. Approval is that native yes on the shown draft only. A typed word, file, token |
| 47 | or counter is never consent, and one approval never covers another draft. |
| 48 | c. After the gate reports delivery, confirm it on a fresh read of the sent mail, |
| 49 | then record the send in the leadgen database. |
| 50 | d. If the gate refuses or cannot send this channel, keep the draft pending with the |
| 51 | exact diagnostic. Never run a direct sender as a substitute for the gate. |
| 52 | Move to the next draft only after the current one is fully resolved. |
| 53 | |
| 54 | ## Scrape → enrich → draft (pipeline) |
| 55 | |
| 56 | |
| 57 | # Step 1: discover contacts (costs Apollo reveals — check usage first) |
| 58 | doppler run --project my-project-b2b-leadgen --config dev -- \ |
| 59 | my-project-leadgen usage |
| 60 | |
| 61 | doppler run --project my-project-b2b-leadgen --config dev -- \ |
| 62 | my-project-leadgen scrape --limit 50 |
| 63 | |
| 64 | # Step 2: enrich with Apify website crawler |
| 65 | doppler run --project my-project-b2b-leadgen --config dev -- \ |
| 66 | my-project-leadgen enrich |
| 67 | |
| 68 | # Step 3: generate Claude drafts |
| 69 | doppler run --project my-project-b2b-leadgen --config dev -- \ |
| 70 | my-project-leadgen draft |
| 71 | |
| 72 | # Step 4: review + send (Rule-6 gated, one at a time) |
| 73 | doppler run --project my-project-b2b-leadgen --config dev -- \ |
| 74 | my-project-leadgen review |
| 75 | |
| 76 | |
| 77 | ## Daily usage cap |
| 78 | |
| 79 | Apollo reveals: **200/day** max (tracked in `leads.db daily_usage`) |
| 80 | Apify runs: ~$0.02/run (3 pages per domain) |
| 81 | Always run `usage` first to check remaining reveals before scraping |
| 82 | |
| 83 | ## DB queries (read-only diagnostics) |
| 84 | |
| 85 | |
| 86 | # Pending drafts count |
| 87 | sqlite3 ~/Projects/my-project-b2b-leadgen/leads.db \ |
| 88 | "SELECT count(*) FROM drafts WHERE status='pending';" |
| 89 | |
| 90 | # Today's sends |
| 91 | sqlite3 ~/Projects/my-project-b2b-leadgen/leads.db \ |
| 92 | "SELECT d.subject, l.email, s.sent_at FROM sends s |
| 93 | JOIN drafts d ON d.id=s.draft_id |
| 94 | JOIN leads l ON l.id=d.lead_id |
| 95 | WHERE date(s.sent_at)=date('now');" |
| 96 | |
| 97 | |
| 98 | ## Rule 6 — no exceptions |
| 99 | |
| 100 | Per `ops-rules` Rule 6: every outbound send is one draft, one approval, one send, |
| 101 | only through the host's approved outbound gate. A local file, shell token or |
| 102 | counter is defense in depth at most, never the owner's consent. Each draft needs its |
| 103 | own native approval on the latest shown text. |
| 104 |
Discussion
Browse more free Claude skills.