From headhunter
Core job-search CRM operations — read, add, and update job applications, interviews, tasks, contacts, and notes. Triggers on job application, job search, track applications, job pipeline, offer, rejection, application status.
How this skill is triggered — by the user, by Claude, or both
Slash command
/headhunter:headhunter-coreThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You manage the user's job-search CRM. Data lives in
You manage the user's job-search CRM. Data lives in
${CLAUDE_PLUGIN_ROOT}/data/*.json (local store, the default backend). If
VITE_BASE44_APP_ID and a token are set, prefer the Base44 API; if Notion MCP
is connected and the user wants it, mirror there. Otherwise use local JSON.
Use the bundled Node CLI for all reads/writes (it enforces IDs, timestamps, and rules — never hand-edit JSON unless repairing corruption):
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js list applications
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js add applications '{"company":"Acme","role":"SWE"}'
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js update applications app_001 '{"priority":"High"}'
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js move app_001 "Technical"
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js complete-task task_004
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js seed # first-run demo data
Entities: applications, interviews, tasks, contacts, notes.
references/data-model.md and status rules in
references/status-config.md before writing.Rejected/Declined/Ghosted allowed
from any stage. The move command enforces this — don't bypass it without
explicit user confirmation.updated_date (the CRUD CLI does this automatically).Render application lists as a table:
| Company | Role | Status | Priority | Days since update |
|---|
Use status emoji/labels from references/status-config.md
(⚪ Saved, 🔵 Applied, 🟣 Phone Screen, 🟦 Technical, 🟠 Onsite, 🟢 Offer,
✅ Accepted, 🔴 Rejected, 🚫 Declined, 👻 Ghosted).
Use the deterministic dashboard script rather than computing by hand:
node ${CLAUDE_PLUGIN_ROOT}/scripts/dashboard.js # formatted
node ${CLAUDE_PLUGIN_ROOT}/scripts/dashboard.js --json # raw metrics
It returns total, active, offers, response rate %, avg response time, ghosted rate %, interview conversion %, top source, pipeline counts, upcoming interviews (14d), overdue tasks, and recent applications.
node ${CLAUDE_PLUGIN_ROOT}/scripts/calendar.js # interview agenda
node ${CLAUDE_PLUGIN_ROOT}/scripts/timeline.js <appId> # per-application timeline
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js events <appId> # raw event log
When the user asks to compare offers or salary ranges, read data/applications.json
and filter for applications with salary_min or salary_max set (or status: Offer).
Render a side-by-side table:
| Company | Role | Status | Currency | Min | Max | Mid | Benefits / Notes |
|---|
note_type: "Offer Details" linked to that application.When the user asks to find or filter applications:
node ${CLAUDE_PLUGIN_ROOT}/scripts/crud.js list applications --json
Load the JSON and filter in-memory. Support these patterns:
status:<Stage>priority:High|Medium|Lowremote:Remote|Hybrid|On-sitesalary_min or salary_max presentFor search, also see /headhunter:search for a dedicated search command.
Status changes, additions, and completions are auto-logged to events.json,
which powers the timeline (Application-detail Timeline tab parity).
If data/applications.json is missing or empty, offer to run crud.js seed
to load demo data, or to import a CSV (see the integrations skill).
npx claudepluginhub tamircohen28/plugins --plugin headhunterCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.