# Cover Letter Writer

> Writes specific, story-driven cover letters. Bans generic openers, AI vocabulary, and all banned resume phrases.

- **Type:** Skill
- **Install:** `agentstack add skill-nicholashidalgo-claude-skillforge-cover-letter-drafter`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [nicholashidalgo](https://agentstack.voostack.com/s/nicholashidalgo)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [nicholashidalgo](https://github.com/nicholashidalgo)
- **Source:** https://github.com/nicholashidalgo/claude-skillforge/tree/main/writing/cover-letter-drafter

## Install

```sh
agentstack add skill-nicholashidalgo-claude-skillforge-cover-letter-drafter
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# cover-letter-writer

**Purpose:** Generate a cover letter that opens with a specific story or observation, connects your experience to the role with concrete examples, and closes with one clear ask.

## Input Schema

| Field | Type | Required |
|---|---|---|
| `role_title` | string | yes |
| `company` | string | yes |
| `opening_hook` | string | yes - a specific story, observation, or connection point |
| `relevant_experience` | string[] | yes - 2-3 items with metrics |
| `why_this_company` | string | yes - specific, not generic |
| `ask` | string | yes |
| `preserve_facts` | string[] | yes |

```json
{
  "role_title": "Staff Engineer",
  "company": "Stripe",
  "opening_hook": "I've been using Stripe since 2015 and recently went through your API migration guide - the versioning strategy is the clearest I've seen in fintech.",
  "relevant_experience": [
    "Built a payment routing engine at Acme that processed $40M/month, reducing failed payments by 22%",
    "Led a 6-engineer team through a PCI-DSS Level 1 certification"
  ],
  "why_this_company": "Stripe's developer-first approach to infrastructure problems is how I think about building platform tools",
  "ask": "Conversation about the staff engineering role on the payments platform team",
  "preserve_facts": ["$40M/month", "22%", "PCI-DSS Level 1", "2015"]
}
```

## Prompt Flow

**Pass 1:** Open with hook (no "I am writing to apply" or similar). Body: 2 specific examples with metrics. Close: one clear call to action. Remove: P1, P4, P7, P19, P21, P22, P24. Run against resume-banned-language-pack.

**Pass 2 Audit + Final:** Remove any remaining puffery, genericness, or AI tells.

## Examples

### Short - 1-paragraph hook
**Before:** "I am incredibly excited and passionate about this opportunity to leverage my extensive experience at your groundbreaking company."
**After:** "I've been using Stripe since 2015. When I read through your API versioning guide last month, it was the clearest versioning strategy I've seen in fintech - exactly the level of care I try to put into platform work."

### Medium - body paragraph
**Before:** "I have proven track record of results-driven leadership that has added significant value to organizations through innovative solutions."
**After:** "At Acme, I built the payment routing logic that processes $40M/month. When the first provider started failing, the system rerouted automatically - zero engineer intervention. That's the kind of reliability I want to build at scale."

### Long

## Unit Tests

```python
# tests/skills/test_cover_letter_writer.py
from ai_pattern_scrubber import detect_patterns
from resume_banned import flag_banned_phrases

HOOK = "I've been using Stripe since 2015. The API versioning guide is the clearest I've seen in fintech."
BODY = "At Acme, I built the payment routing engine processing $40M/month. When providers failed, the system rerouted automatically."

def test_hook_no_sycophancy():
    assert not [h for h in detect_patterns(HOOK) if h.id == 21]

def test_body_no_banned_phrases():
    assert flag_banned_phrases(BODY) == []

def test_hook_no_high_severity():
    assert not [h for h in detect_patterns(HOOK) if h.severity == "high"]
```

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [nicholashidalgo](https://github.com/nicholashidalgo)
- **Source:** [nicholashidalgo/claude-skillforge](https://github.com/nicholashidalgo/claude-skillforge)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-nicholashidalgo-claude-skillforge-cover-letter-drafter
- Seller: https://agentstack.voostack.com/s/nicholashidalgo
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
