From career
Send a previously-drafted outreach email. Reads a draft file from drafts/, presents it one final time to the user, requires explicit "yes, send" confirmation, then delegates to the email-skills companion plugin (personal or business sender per draft frontmatter). On send, updates the draft frontmatter to status=sent and appends a row to crm/outreach.md. Never sends without explicit confirmation.
npx claudepluginhub danielrosehill/claude-code-plugins --plugin careerThis skill is limited to using the following tools:
Sends a draft. Always requires explicit user confirmation. Always logs to `crm/outreach.md` on send.
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.
Sends a draft. Always requires explicit user confirmation. Always logs to crm/outreach.md on send.
$ARGUMENTS:
<draft-path> — path (relative to WORKING_FOLDER or absolute) to the draft file. Usually drafts/<YYYY-MM-DD>-<slug>-<contact>.md.--force — bypass the "no recent outreach to this contact" anti-loop check. Still requires final confirm.Read ${CAREER_DATA_DIR}/config.json:
WORKING_FOLDERPREFERRED_EMAIL_SENDER, SECONDARY_EMAIL_SENDERcompanions.email — must be true. If false, bail with instruction to run /career:install-companion-plugins.Read the draft file. Parse frontmatter. Validate:
status: draft (refuse to re-send something already sent).contact.email present and looks like an email.sender: personal | business resolved.Read ${WORKING_FOLDER}/crm/outreach.md. If a row exists for the same contact email with last-touch < 14 days and status sent | replied | meeting-booked: stop and require --force.
| sender field in draft | delegate to |
|---|---|
personal | email-skills:send-personal-email |
business | email-skills:send-business-email |
If draft sender_email is set, pass it through; otherwise let the email skill resolve from its own config.
Show the user:
About to send:
to: <name> <email>
from: <sender_email> (<personal | business>)
subject: <subject>
via: email-skills:<personal|business>
Body:
<body>
Confirm send? (yes / no / edit)
yes → proceed.no → abort, leave draft as-is.edit → exit; user edits the file, re-runs /career:outreach send.Use AskUserQuestion with constrained options.
Invoke the chosen email skill with to, subject, body. Capture the return value (message-id if available).
Set:
status: sentsent_at: <ISO datetime>message_id: <id> (if returned)Append one row to ${WORKING_FOLDER}/crm/outreach.md:
| <YYYY-MM-DD> | <company> | <contact-name> | email | <template> | sent | follow up <YYYY-MM-DD>+7 | <link to draft> |
Notes column: relative path to the draft file so the row links back to the full message.
In ${WORKING_FOLDER}/crm/companies.md, set the company row's status to engaged (unless already active / paused — leave those) and last-touch to today.
sent: <name> <email>
template: <template>
follow-up due: <date+7>
log: crm/outreach.md (row appended)
sent.--force opt-out.email-skills not installed → bail with install instructions.from resolved) → bail; print which env / config the email skill expects.track-status to update first, or --force if intentional re-touch.draft, do not log to outreach.md, surface the error verbatim.sent draft cannot be re-sent without manually flipping status back to draft (deliberate friction).draft after a send error retries cleanly.