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.
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."