From career
Generate an outreach email draft grounded in ground-truth.md, the company research brief, the target contact, and a chosen template (cold-pitch / warm-followup / consulting-pitch / job-followup / interview-followup). Always saves to drafts/ and presents to the user for review. Never sends. send-outreach is a separate skill that requires explicit confirmation.
npx claudepluginhub danielrosehill/claude-code-plugins --plugin careerThis skill is limited to using the following tools:
Builds an email draft from four inputs:
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Builds an email draft from four inputs:
research/companies/<slug>/).find-contact).Always saves to drafts/ and shows the user for review. Sending is a separate skill (send-outreach).
$ARGUMENTS:
<company> — first positional.--contact-rank=<n> — pick from the most recent find-contact result.--contact="<name> <email>" — supply directly.--template=<cold-pitch|warm-followup|consulting-pitch|job-followup|interview-followup> (default: based on heuristic — cold-pitch for first-touch, warm-followup if prior outreach exists in crm/outreach.md, interview-followup if invoked within 24h of a logged interview event).--lens=<employer|client|partner> (default from CRM row, fallback employer).--brief-as=<personal|business> — overrides ground-truth freelance-brand choice. Affects which sender will be used downstream./career:outreach draft acme --contact-rank=1 --template=cold-pitch
/career:outreach draft snowglobe --contact="Jane Doe jane@snowglobe.ai" --template=consulting-pitch
/career:outreach draft myrofish --contact-rank=2 # template auto-picked
${CAREER_DATA_DIR}/config.json → WORKING_FOLDER, PREFERRED_EMAIL_SENDER, SECONDARY_EMAIL_SENDER.
Compute slug. Confirm:
${WORKING_FOLDER}/ground-truth.md exists and is populated.${WORKING_FOLDER}/research/companies/${slug}/ has at least company-overview.md (warn if not — drafts without research read generic).If --template provided, use it. Otherwise heuristic:
crm/outreach.md row for this company with status in replied | meeting-booked | meeting-done → warm-followup.meetings/ if present) → interview-followup.client → consulting-pitch.cold-pitch.Read the template's EXAMPLE.md (and any user-customised template file beside it — templates/<template>/<custom>.md).
If --contact-rank=<n> and a recent find-contact result exists in conversation, pick that row. Otherwise prompt user for the explicit contact.
--brief-as=business).Fill the template's {{variables}}. Hard rules:
{{specific_observation}} must come from a real, cited fact in the research briefs. If no cite-worthy fact exists, ask the user for one before proceeding.{{your_relevance}} comes from ground-truth, not from generic boilerplate.{{ask}} is single, low-stakes, concrete (e.g. "20 minutes next week").consulting-pitch: {{narrow_offer}} must be a single scope, not a menu.length constraint. If the draft exceeds it, tighten.Path: ${WORKING_FOLDER}/drafts/<YYYY-MM-DD>-<slug>-<contact-slug>.md.
Frontmatter:
---
status: draft
template: <template>
company: <company_name>
slug: <slug>
contact:
name: <name>
email: <email>
lens: <lens>
sender: <personal|business>
sender_email: <resolved from config + brief-as>
created: <ISO datetime>
sent_at: null
---
Body: subject line + email body in plain markdown.
Show the draft to the user with this footer:
Draft saved: drafts/<file>
To send: /career:outreach send drafts/<file>
To edit: open the file directly, then re-run /career:outreach send
Do not auto-invoke send-outreach. Stop here.
/career:ground-truth first; drafts without ground-truth read generic and burn the contact."/career:research-brief overview first or proceed with thin context (user choice).--force.send-outreach reads from disk, not from this skill's output.