.claude/skills/format-cover-letter/SKILL.md
Intelligent cover letter formatting with semantic understanding of structure and content (project, gitignored)
npx skillsauth add ajbcoding/claude-skill-eval format-cover-letterInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Format cover letters with intelligent style application and automatic play title italicization. Uses the shared career documents template with 19 semantic styles and learns from your corrections over time.
Format with just body text (metadata auto-inferred):
Format this cover letter: [paste body paragraphs only]
I'll infer contact block, date, recipient, and RE line!
Format with complete JSON:
Format this cover letter: [paste full JSON with metadata]
Format from file:
Format my-cover-letter.txt
Semantic Analysis: I analyze content to understand elements (contact info, recipient address, RE line, body text, etc.)
Style Mapping: Based on context, I assign appropriate styles:
Hybrid Inline Styling: Play/production titles automatically italicized:
Generate Document: Create formatted .docx using template
Visual Preview: Show PDF preview for review
Learn from Corrections: If you correct a style choice, I remember for next time
Paragraph Styles:
Character Styles (inline):
Contact Block (top of page):
ANTHONY BYRNES
T: 213.305.3132
E: [email protected]
Recipient Address:
Colburn School
200 South Grand Avenue
Los Angeles, CA 90012
RE Line (bold orange, same as section headers):
RE: General Manager of Performances & Events Division
Body Text with auto-italicized play titles:
For Louis & Keely: Live at the Sahara, I generated $1.4 million...
→ "Louis & Keely: Live at the Sahara" automatically italicized from dictionary
Signature:
Sincerely,
[signature image]
Anthony Byrnes
You provide: Raw text or minimal JSON (just body paragraphs)
I infer:
Smart Job Description Matching:
career-applications/*/00-job-description.md filesConfirmation Before Formatting:
Inferred Metadata:
Contact: ✓ ANTHONY BYRNES
✓ T: 213.305.3132
✓ E: [email protected]
Date: November 11, 2025
Recipient: UCLA School of Theater, Film and Television
RE: Associate Dean and Chief Administrative Officer [CAO]
Salutation: Dear Search Committee,
Looks correct? (yes/modify/[field name])
Configuration:
~/.claude/skills/format-cover-letter/defaults.yamlStep 1: Analyze Content
I'll parse your content and create JSON structure:
{
"document_metadata": {
"type": "cover-letter",
"author_name": "Anthony Byrnes",
"document_title": "Position Title Cover Letter"
},
"content": [
{"text": "ANTHONY BYRNES", "style": "Contact Name", "type": "paragraph"},
{"text": "RE: Position Title", "style": "RE Line", "type": "paragraph"},
{"text": "Body with play title...", "style": "Body Text", "type": "paragraph"}
]
}
Step 2: Generate Document
I'll call the formatter to create your .docx:
import json
import subprocess
from pathlib import Path
# Save content mapping
mapping_file = "/tmp/cover_letter_mapping.json"
with open(mapping_file, 'w') as f:
json.dump(data, f, indent=2)
# Format document
result = subprocess.run([
"python3",
"format_cv.py",
mapping_file,
output_path,
"--document-type", "cover-letter",
"--preview"
], capture_output=True, text=True, cwd=str(Path.home() / "PycharmProjects/career-lexicon-builder"))
Step 3: Visual Preview
I'll convert to PDF and show you what it looks like using the open command.
Step 4: Review
You can request changes: "That venue should be italic" or "Don't emphasize that number"
Step 5: Learn (if corrections made)
If you made corrections, I'll update learned-preferences.yaml and add new plays to play-titles-dictionary.yaml.
The Problem: Manually marking up every play title is tedious:
{
"text": "For Louis & Keely: Live at the Sahara, I...",
"runs": [
{"text": "For ", "style": null},
{"text": "Louis & Keely: Live at the Sahara", "style": "Play Title"},
{"text": ", I...", "style": null}
]
}
The Solution: Dictionary auto-styling (95% of cases):
{
"text": "For Louis & Keely: Live at the Sahara, I...",
"style": "Body Text"
}
→ "Louis & Keely: Live at the Sahara" automatically italicized from dictionary!
Dictionary Location:
~/.claude/skills/format-cover-letter/play-titles-dictionary.yaml
Example dictionary:
productions:
- "Louis & Keely: Live at the Sahara"
- "Romeo & Juliet"
- "Hamlet"
programs:
- "Experience LA!"
Manual Override (for new/unknown plays):
{
"text": "For My New Play, I generated...",
"style": "Body Text",
"inline_styles": [
{"text": "My New Play", "style": "Play Title"}
]
}
Exclusion (when dictionary shouldn't apply):
{
"text": "We decided NOT to produce Romeo & Juliet.",
"inline_styles": [
{"text": "Romeo & Juliet", "exclude": true}
]
}
You: "Add 'The Tempest' to the dictionary"
Me: ✓ Added to play-titles-dictionary.yaml
Next cover letter: Automatically italicizes "The Tempest" without asking.
Setup signature:
~/.claude/skills/format-cover-letter/signatures/signature.png{"text": "signature", "style": "Signature Image", "type": "image"}If signature missing: System logs warning and continues without image.
Shared template path:
cv_formatting/templates/career-documents-template.docx
Why shared? Same template as format-resume ensures visual consistency across CV and cover letter.
| Aspect | CV (format-resume) | Cover Letter (this skill) | |--------|-------------------|---------------------------| | Organization | Timeline-based sections | Narrative paragraphs | | Section Headers | Orange, 11pt | Orange, 13pt (bug fixed!) | | Main Content | Timeline entries, bullets | Body text paragraphs | | Special Elements | Hanging indent timelines | Contact block, RE line, signature | | Inline Styling | Manual only | Hybrid (dictionary + manual) |
IMPORTANT: Section headers are ALWAYS ORANGE for both CVs and cover letters. Earlier versions incorrectly made cover letter headers black.
Template not found:
Run: python generate_cv_template.py
PDF preview not available:
Install: brew install libreoffice
Image generation skipped:
Install: brew install poppler
career-documents-template.docx - Shared template with 19 semantic stylesformat_cv.py - Main formatting scriptplay-titles-dictionary.yaml - Known plays for auto-italicizationlearned-preferences.yaml - Your accumulated correctionssignatures/ - Directory for signature imagesAfter formatting the cover letter, export structured formatting metadata to enable wrapper application integration.
Write to: cover-letter-formatted-v1.json (increment version if exists)
Implementation:
cover-letter-formatted-v1.json already existscover-letter-formatted-v2.json, cover-letter-formatted-v3.json, etc.Structure:
{
"metadata": {
"created_at": "YYYY-MM-DDTHH:MM:SSZ",
"version": 1,
"skill": "format-cover-letter",
"input_file": "cover-letter-draft.md",
"output_file": "cover-letter-formatted.pdf"
},
"formatting_metadata": {
"template": "career-documents-template.docx",
"template_path": "cv_formatting/templates/career-documents-template.docx",
"font": "Helvetica",
"font_size": 11,
"margins": {
"top": 0.75,
"bottom": 0.75,
"left": 1.0,
"right": 1.0
},
"line_spacing": 1.15,
"paragraph_spacing": 0.15,
"letterhead": true,
"signature": "included"
},
"content_structure": {
"header": {
"name": "ANTHONY BYRNES",
"contact": {
"phone": "213.305.3132",
"email": "[email protected]"
},
"validation": "passed"
},
"date": {
"text": "November 12, 2025",
"format": "MMMM DD, YYYY",
"validation": "passed"
},
"recipient": {
"organization": "UCLA School of Theater, Film and Television",
"address_lines": [
"UCLA School of Theater, Film and Television",
"102 East Melnitz Hall",
"Los Angeles, CA 90095"
],
"validation": "passed"
},
"re_line": {
"text": "RE: Associate Dean and Chief Administrative Officer [CAO]",
"style": "RE Line",
"validation": "passed"
},
"salutation": {
"text": "Dear Search Committee,",
"validation": "passed"
},
"body": [
{
"paragraph": 1,
"purpose": "opening",
"word_count": 85,
"has_play_titles": true,
"inline_styles_applied": 2,
"validation": "passed"
},
{
"paragraph": 2,
"purpose": "body",
"word_count": 120,
"has_play_titles": true,
"inline_styles_applied": 3,
"validation": "passed"
},
{
"paragraph": 3,
"purpose": "body",
"word_count": 95,
"has_play_titles": false,
"inline_styles_applied": 1,
"validation": "passed"
},
{
"paragraph": 4,
"purpose": "closing",
"word_count": 42,
"has_play_titles": false,
"inline_styles_applied": 0,
"validation": "passed"
}
],
"closing": {
"salutation": "Sincerely,",
"signature_space": true,
"signature_image": true,
"name": "Anthony Byrnes",
"validation": "passed"
}
},
"validation_results": {
"total_checks": 12,
"passed": 12,
"failed": 0,
"warnings": 0,
"checks": [
{"check": "header_present", "status": "passed"},
{"check": "date_format_correct", "status": "passed"},
{"check": "recipient_complete", "status": "passed"},
{"check": "re_line_formatted", "status": "passed"},
{"check": "salutation_professional", "status": "passed"},
{"check": "body_paragraphs_present", "status": "passed"},
{"check": "play_titles_italicized", "status": "passed"},
{"check": "inline_styles_applied", "status": "passed"},
{"check": "closing_complete", "status": "passed"},
{"check": "signature_included", "status": "passed"},
{"check": "page_count_valid", "status": "passed"},
{"check": "professional_tone", "status": "passed"}
],
"issues": []
},
"styling_metadata": {
"play_titles_dictionary_used": true,
"dictionary_matches": [
"Louis & Keely: Live at the Sahara",
"Romeo & Juliet"
],
"manual_inline_styles": [
{"text": "The New Play", "style": "Play Title", "reason": "not in dictionary"}
],
"exclusions": [],
"styles_applied": {
"Contact Name": 1,
"Contact Info": 2,
"Date Line": 1,
"Recipient Address": 3,
"RE Line": 1,
"Body Text": 4,
"Play Title": 5,
"Institution": 3,
"Job Title": 2
}
},
"metrics": {
"page_count": 1,
"word_count": 342,
"paragraph_count": 4,
"sentence_count": 18,
"estimated_read_time_seconds": 80,
"average_paragraph_length": 85,
"readability_score": 0.90,
"professionalism_score": 0.93,
"visual_appeal_score": 0.91
},
"output_files": [
{
"type": "docx",
"path": "cover-letter-formatted.docx",
"size_bytes": 87654,
"created_at": "YYYY-MM-DDTHH:MM:SSZ"
},
{
"type": "pdf",
"path": "cover-letter-formatted.pdf",
"size_bytes": 156432,
"created_at": "YYYY-MM-DDTHH:MM:SSZ"
}
],
"learned_preferences": {
"new_plays_added": ["The New Play"],
"style_corrections": [],
"user_feedback": ""
}
}
Present to user:
Formatting complete! Saved to:
- cover-letter-formatted.docx (formatted document)
- cover-letter-formatted.pdf (visual preview)
- cover-letter-formatted-v1.json (structured metadata)
Document metrics:
- Pages: 1
- Word count: 342
- Paragraphs: 4
- Validation: 12/12 checks passed
- Readability score: 0.90
All play titles automatically italicized from dictionary. Ready for review!
~/.claude/skills/format-resume/skill.mddocs/handoffs/2025-11-11-cover-letter-formatting-implementation-complete.mdpython generate_cv_template.pyReady to format your cover letter?
Just say: "Format this cover letter: [your content]"
content-media
Download YouTube video transcripts when user provides a YouTube URL or asks to download/get/fetch a transcript from YouTube. Also use when user wants to transcribe or get captions/subtitles from a YouTube video.
development
Transform learning content (like YouTube transcripts, articles, tutorials) into actionable implementation plans using the Ship-Learn-Next framework. Use when user wants to turn advice, lessons, or educational content into concrete action steps, reps, or a learning quest.
tools
Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
tools
Replace with description of the skill and when Claude should use it.