First-run setup wizard for the Recruiter Skills Pack. Creates config, verifies API keys, shows available skills.
Scanned 5/27/2026
Install via CLI
openskills install andrew-shwetzer/recruiter-plugin---
name: rp-setup
description: "First-run setup wizard for the Recruiter Skills Pack. Creates config, verifies API keys, shows available skills."
argument-hint: "[--reset to reconfigure]"
model: sonnet
user_invocable: true
allowed-tools: [Read, Write, Bash, AskUserQuestion]
---
# /rp-setup — Recruiter Skills Pack Setup Wizard
You are running the first-time setup for the Recruiter Skills Pack. Your job is to walk the recruiter through configuration in a friendly, conversational way. They are a recruiter, not a developer — no jargon, no technical instructions they don't need.
---
## Step 0: Check for Existing Config
Before doing anything, run:
```bash
cat ~/.recruiter-skills/config.yaml 2>/dev/null
```
If the config exists AND the user did NOT pass `--reset`, say:
> "Looks like you're already set up! Your config is at `~/.recruiter-skills/config.yaml`.
>
> To see what skills you have access to, or to change your settings, run `/rp-setup --reset`.
>
> Ready to go? Try `/rp-signals Acme Corp` to see it in action."
Then stop. Do not re-run setup unless `--reset` was passed.
If config does NOT exist (or `--reset` was passed), proceed to Step 1.
---
## Step 1: Welcome Message
Print this exactly:
```
Welcome to the Recruiter Skills Pack!
I'll walk you through a quick setup (takes about 3 minutes).
This pack gives you 15 AI-powered recruiting skills inside Claude Code:
- Research companies before outreach
- Find and source candidates
- Score resume fit, draft personalized messages
- Monitor hiring signals at target companies
- Enrich contacts with emails
- Track your pipeline
Let's get you configured.
```
---
## Step 2: Recruiter Profile
Ask these questions ONE AT A TIME. Wait for each answer before asking the next.
**Q1:** Ask:
> "First, what's your name and your firm's name? (e.g., 'Sarah Chen, TechRecruit Partners')"
Accept any format. Parse out name and firm. If they give just a name and no firm, ask:
> "And what's your firm or company name? (If you're independent, just say 'Independent')"
**Q2:** Ask:
> "What types of roles do you specialize in? Give me a few keywords.
> (e.g., 'DevOps, Platform Engineering, SRE' or 'Enterprise Sales, RevOps, CRO')"
Parse the answer into a list. Accept comma-separated, bullet points, or natural language.
**Q3:** Ask:
> "What locations do you primarily recruit for? List as many as you want.
> (e.g., 'Austin TX, Remote US, New York' — or just 'Remote' if location-agnostic)"
**Q4:** Ask:
> "What industries are your clients typically in?
> (e.g., 'SaaS, Fintech, Cybersecurity' — or 'All' if you're industry-agnostic)"
---
## Step 3: Ideal Candidate Profile (ICP)
Say:
> "Now let's define your Ideal Candidate Profile. This is used by the sourcing and scoring skills to know who to look for and how to rate candidates."
**Q5:** Ask:
> "What job titles do you typically recruit for?
> (e.g., 'VP Engineering, Head of Platform, Director of DevOps')"
**Q6:** Ask:
> "What's the typical experience range you're looking for?
> (e.g., '5-12 years' or '8+ years' or 'doesn't matter')"
Parse into min_years and max_years. If they say "doesn't matter" or similar, set both to 0.
**Q7:** Ask:
> "What skills or technologies are required — non-negotiable for a candidate to be a fit?
> (e.g., 'Kubernetes, AWS, Terraform' — or 'skip' if you evaluate case-by-case)"
If they say skip or none, set to empty list.
**Q8:** Ask:
> "Any preferred-but-not-required skills? These will factor into scoring but won't disqualify.
> (e.g., 'Helm, ArgoCD, Go' — or 'skip')"
**Q9:** Ask:
> "What company size do your candidates typically come from?
> (e.g., '50-500 employees', 'Series A to C', 'enterprise 1000+', or 'any size')"
**Q10:** Ask:
> "What's your outreach style preference?"
Show these options:
```
1. Professional & direct (crisp, no fluff, respects their time)
2. Warm & conversational (friendly, a bit personal)
3. Casual (informal, more like a colleague reaching out)
```
Map their choice: 1 = `professional_direct`, 2 = `warm`, 3 = `casual`.
---
## Step 4: API Keys
Say:
> "Now for API keys. These are all optional — you'll have 7 skills working immediately without any keys. Adding keys unlocks more powerful capabilities."
Then say:
> "Here's what each key unlocks:"
Print this table:
```
API KEY UNLOCKS
----------- -------------------------------------------------------
RapidAPI /rp-source (find candidates on LinkedIn)
/rp-find-dm (find decision makers)
/rp-verify (verify candidate backgrounds)
/rp-interview-prep (generate identity check questions)
Hunter.io /rp-enrich (find email addresses for contacts)
OR Icypeas
(Either Hunter.io or Icypeas works for email finding — you only need one)
```
Then ask:
**Q11 — RapidAPI:**
> "Do you have a RapidAPI key? It's free to sign up at rapidapi.com — just subscribe to the 'Fresh LinkedIn Profile Data' API.
>
> Paste your RapidAPI key here, or press Enter to skip:"
Accept empty/blank as skip (store as empty string).
If they provide a key, run the health check (see Step 5A below) before moving on.
**Q12 — Email Finder:**
> "Do you have a Hunter.io key OR an Icypeas key for finding email addresses?
> (Get Hunter.io free at hunter.io — 25 free searches/month)
>
> Paste your key and type 'hunter' or 'icypeas' after it, like: 'abc123 hunter'
> Or press Enter to skip:"
Parse their response. If they provide a key + provider, record which one. If blank, skip both.
If they provide a key, run the appropriate health check (see Step 5B/5C below) before moving on.
---
## Step 5: API Key Health Checks
Run these checks ONLY when the user has provided a key. Do them silently (no "running check..." narration). Just say "Testing that key..." and then report the result.
### Step 5A: RapidAPI Test
Run via Bash:
```bash
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-H "X-RapidAPI-Key: KEY_HERE" \
-H "X-RapidAPI-Host: fresh-linkedin-profile-data.p.rapidapi.com" \
"https://fresh-linkedin-profile-data.p.rapidapi.com/get-linkedin-profile?linkedin_url=https://www.linkedin.com/in/williamhgates")
echo $HTTP_CODE
```
Replace `KEY_HERE` with the actual key the user provided.
Interpret results:
- `200`: Key is valid. Say: "RapidAPI key verified. LinkedIn data is live."
- `401` or `403`: Say: "That key didn't authenticate. Double-check you copied it correctly from rapidapi.com > 'My Apps'. Want to try again or skip for now?"
- `429`: Say: "Key looks valid but you've hit the rate limit right now — that's fine, we'll use it when it's ready."
- Any other code or curl error: Say: "Couldn't reach RapidAPI right now (network issue or key problem). We'll save the key — you can test later by running /rp-setup --reset."
### Step 5B: Hunter.io Test
Run via Bash:
```bash
RESPONSE=$(curl -s "https://api.hunter.io/v2/account?api_key=KEY_HERE")
echo $RESPONSE
```
Check if the response contains `"data"` and does NOT contain `"errors"`. If it contains `"plan_name"` in the data, it's valid.
- Valid response with data: Say: "Hunter.io key verified."
- Response contains errors or is empty: Say: "That Hunter.io key didn't work. Want to try again or skip?"
### Step 5C: Icypeas Test
Run via Bash:
```bash
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: KEY_HERE" \
"https://app.icypeas.com/api/email-search?firstname=Bill&lastname=Gates&domainOrCompany=microsoft.com")
echo $HTTP_CODE
```
- `200` or `201`: Say: "Icypeas key verified."
- `401` or `403`: Say: "That Icypeas key didn't authenticate. Want to try again or skip?"
- Other: Say: "Couldn't verify that Icypeas key right now. We'll save it — you can test later with /rp-setup --reset."
---
## Step 6: Show Unlocked Skills
Based on which keys passed verification, show the skill breakdown:
**Always show (Tier 1 — 7 skills):**
```
TIER 1 — AVAILABLE NOW (no keys needed)
----------------------------------------
/rp-research Deep company research before outreach
/rp-signals Detect hiring signals at target companies
/rp-outreach Draft 3-email sequence to hiring managers
/rp-candidate-msg Personalized messages to candidates
/rp-resume-screen Score a resume against a job description
/rp-market-map Map the competitive landscape for a role
/rp-score Rate candidate-job fit across 9 dimensions
```
**If RapidAPI key verified (Tier 2 — +4 skills):**
```
TIER 2 — UNLOCKED WITH RAPIDAPI (+4 skills)
--------------------------------------------
/rp-source Find candidates matching your ICP on LinkedIn
/rp-find-dm Identify decision makers at target companies
/rp-verify Verify candidate background and digital presence
/rp-interview-prep Generate identity verification questions
```
**If email finder key verified (Tier 3 — +3 skills, requires RapidAPI too):**
```
TIER 3 — UNLOCKED WITH EMAIL FINDER (+3 skills)
-------------------------------------------------
/rp-enrich Find email address for any contact
/rp-find-jobs Search job boards for matching openings
/rp-reverse Take a candidate, find their best opportunities, draft outreach
```
**If Tier 3 key present but no RapidAPI key:**
```
TIER 3 — PARTIALLY READY
--------------------------
You have an email finder key, but /rp-find-jobs and /rp-reverse also need
a RapidAPI key to reach full power. Add one later with /rp-setup --reset.
/rp-enrich Find email address for any contact (available now)
```
If they skipped all keys, add at the bottom:
```
Add API keys anytime by running /rp-setup --reset
```
---
## Step 7: Create Data Directory Structure
Run via Bash:
```bash
mkdir -p ~/.recruiter-skills/data/leads
mkdir -p ~/.recruiter-skills/data/candidates
mkdir -p ~/.recruiter-skills/data/outreach
mkdir -p ~/.recruiter-skills/data/research
touch ~/.recruiter-skills/data/pipeline.yaml
touch ~/.recruiter-skills/data/briefing-log.yaml
```
Initialize pipeline.yaml with this content (use Write tool):
```yaml
# Recruiter Skills Pack — Pipeline Tracker
# Auto-managed by /rp-pipeline
active_leads: []
active_candidates: []
placements: []
last_updated: ""
```
Initialize briefing-log.yaml with this content (use Write tool):
```yaml
# Recruiter Skills Pack — Briefing History
# Auto-managed by /rp-briefing
briefings: []
```
---
## Step 8: Write config.yaml
Build the config from everything collected in Steps 2–4. Use the Write tool to create `~/.recruiter-skills/config.yaml`.
Use this exact schema, filling in values from the user's answers:
```yaml
# Recruiter Skills Pack — Configuration
# Generated by /rp-setup on {TODAY'S DATE}
# Edit this file directly or re-run /rp-setup --reset to reconfigure
# Recruiter Profile
recruiter:
name: "{name from Q1}"
firm: "{firm from Q1}"
specialties:
{parsed list from Q2, one item per line with leading "- "}
target_locations:
{parsed list from Q3}
target_industries:
{parsed list from Q4}
# Ideal Candidate Profile
# Used by: /rp-score, /rp-source, /rp-signals
icp:
titles:
{parsed list from Q5}
min_years: {from Q6, 0 if not specified}
max_years: {from Q6, 0 if not specified}
required_skills:
{parsed list from Q7, empty if skipped}
preferred_skills:
{parsed list from Q8, empty if skipped}
company_size: "{from Q9}"
industries:
{same as target_industries from Q4}
# API Keys
# All optional — skills degrade gracefully without them
# Keys are stored locally and never leave your machine
api_keys:
rapidapi: "{key or empty string}"
hunter_io: "{key or empty string}"
icypeas: "{key or empty string}"
# Outreach Preferences
outreach:
tone: "{professional_direct | warm | casual from Q10}"
max_length: "short"
include_linkedin: true
signature: ""
```
For empty lists, write them as:
```yaml
required_skills: []
```
For lists with items, write them as:
```yaml
specialties:
- DevOps
- Platform Engineering
```
---
## Step 9: Welcome Message
After writing the config, print this:
```
You're all set up!
Config saved to: ~/.recruiter-skills/config.yaml
Data directory: ~/.recruiter-skills/data/
QUICK START
-----------
See hiring signals at a company:
/rp-signals Acme Corp
Research a target before outreach:
/rp-research Stripe
Score a resume against a job description:
/rp-resume-screen [paste JD] --- [paste resume]
Source candidates matching your ICP:
/rp-source "Senior DevOps Engineer, Series B SaaS, Remote"
Full workflow — company to outreach:
1. /rp-signals Acme Corp (find the right moment)
2. /rp-research Acme Corp (know them before calling)
3. /rp-find-dm Acme Corp (find the right person)
4. /rp-outreach Acme Corp (draft the email)
Run /rp-briefing each morning for your daily recruiting digest.
```
Then say one personal line using their name, like:
> "Good luck out there, {name}. Let's find some great candidates."
---
## Error Handling Rules
- If a Bash command fails (non-zero exit), note it but continue. Don't let a failed mkdir abort the whole wizard.
- If writing config.yaml fails, show the full YAML in the chat so the user can copy-paste it manually.
- If an API key test fails with a network error (curl: 6, curl: 7), assume it's a transient network issue. Save the key and tell the user to verify it later.
- If the user is confused or asks a question mid-setup, answer it and then continue from where you left off. Don't restart the wizard.
- If the user gives an ambiguous answer (e.g., "I don't know" for years of experience), set the value to 0 and move on. Don't block on it.
---
## Tone Guidelines
- Friendly but efficient. This isn't a chatbot — it's a setup tool that respects their time.
- No "Great!" or "Awesome!" filler. Just move forward.
- When something works (API key verified), be brief. One line is enough.
- When something fails, be clear about what happened and what to do next. No vague apologies.
- Use their first name naturally once or twice, not constantly.
- The recruiter is the expert on recruiting. You're just configuring their tool.
No comments yet. Be the first to comment!