From career-navigator
Produces a targeted cover letter via a CoverLetterBrief and writer final prose—honest, specific, voice-matched. Saves to the artifact inventory. Fires after tailoring or on request. Also /career-navigator:cover-letter.
npx claudepluginhub tmargolis/career-navigator --plugin career-navigatorThis skill uses the workspace's default tool permissions.
Build a **CoverLetterBrief**, then invoke **`writer`** for final letter prose. Do not write the full letter in this skill—**`writer`** owns send-ready copy.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Builds scalable data pipelines, modern data warehouses, and real-time streaming architectures using Spark, dbt, Airflow, Kafka, and cloud platforms like Snowflake, BigQuery.
Builds production Apache Airflow DAGs with best practices for operators, sensors, testing, and deployment. For data pipelines, workflow orchestration, and batch job scheduling.
Build a CoverLetterBrief, then invoke writer for final letter prose. Do not write the full letter in this skill—writer owns send-ready copy.
Job description — required. If not already in context, ask the user to provide it.
Tailored resume — check {user_dir}/CareerNavigator/artifacts-index.json for a resume artifact for this company and role. If one exists, use it as the primary source for experience framing. If none exists:
"I don't see a tailored resume for this role yet. Want me to tailor one first, or build the brief from your ExperienceLibrary directly?"
Profile — read {user_dir}/CareerNavigator/profile.md for differentiators, tone preferences, and any standing instructions.
Contact context — check tracker.json for any known contacts at the company. If a contact is present, note it for the brief (do not draft named flattery unless accurate).
Before briefing, identify 1–2 specific, verifiable things about the company relevant to fit:
tracker.json or profile about this companyDo not use generic praise. If no specific signals, say so in the brief—writer will omit flattery.
Read {user_dir}/CareerNavigator/voice-profile.md.
## User writing samples or ## User writing samples (launch) (substantive excerpts), ask before building the CoverLetterBrief:"Before I draft your cover letter: paste 2–5 recent LinkedIn posts or other short professional writing so
writercan match your voice. I may already have launch voice harvest hints (résumés/CVs/cover letters scanned during/career-navigator:launch)—LinkedIn still sharpens tone. Reply skip for a neutral tone (low voice match) if you’re fine with harvest-only signal."
## User writing samples section to voice-profile.md (trimmed excerpts + one-line source note).voice_match: low intent into the brief for writer.If either ## User writing samples or ## User writing samples (launch) already has substantive pasted excerpts, skip this ask.
Assemble a structured brief for writer:
## CoverLetterBrief
- **company**: …
- **role**: …
- **opening_hook_facts**: bullet list (why this role+company—facts only)
- **core_case_bullets**: 4–8 bullets mapping EL achievements to JD competencies (each bullet: fact + metric if any)
- **close_intent**: one line (conversation, not desperation)
- **tone**: confident, direct; honest-over-encouraging
- **banned**: padding, unverified claims, generic “innovative leader” phrasing
- **mirrored_jd_terms**: list keywords to include naturally (ATS)
- **length_target**: 3–4 short paragraphs, <400 words
- **optional_contact_reference**: name/role only if in tracker and user confirmed
writer with mode cover-letter. Pass the full CoverLetterBrief and paths to voice-profile.md / profile.md. Retry once on failure.Show the letter from writer in full. Ask:
"Does this look right? I can ask writer to adjust tone, swap examples, or shorten."
After confirmation, save the letter (the writer output).
Filenames (avoid host / MCP validation errors): use ASCII-safe names only—hyphens -, no em dashes or smart quotes. Sanitize company and role: remove \ / : * ? " < > | and newlines; collapse whitespace; limit basename length (~100 chars).
Example: Anthropic-PM-Claude-Code-Cover-Letter-2026-03-24.md
{SanitizedCompany}-{SanitizedRole}-Cover-Letter-{YYYY-MM-DD}.md{user_dir}/ (same path style the host expects—usually relative to the attached job-search folder)artifacts-index.json in a separate call with valid JSON (escape " inside strings).If the file tool fails (e.g. MCP -32602 / invalid args): do not create a file whose name is the error message. Output the full letter in a fenced markdown code block and tell the user to save manually; still update artifacts-index.json only if the file was saved successfully.
{user_dir}/CareerNavigator/artifacts-index.json:{
"id": "{uuid}",
"type": "cover_letter",
"filename": "{filename}",
"path": "{user_dir}/{filename}",
"target_company": "{company}",
"target_role": "{role}",
"date_created": "{today}",
"source": "generated",
"linked_resume": "{filename of tailored resume if used, else null}",
"notes": "Assembled via CoverLetterBrief + writer"
}
If other artifact files (PDF/DOCX) exist in {user_dir}, run the artifact-saved workflow once after saving.
Confirm:
"Saved as {filename}."
If the user has not yet logged an application for this role:
"Ready to track this application? Say 'yes' or
/career-navigator:track-application."