agentleFS
skills-agents-coskills-agents-co/skills-and-agents-library/resume-tailor/SKILL.md

resume-tailor

Skill1 starsChanged 31 days agoMITView on GitHub

Tailors your resume and cover letter to a specific job description with ATS keyword scoring, parser-safe formatting, and submission-ready PDF output.

29 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use application-tracker, job-search and 1 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • xiding-codeSkill

    application-tracker

    Automatically log and track all job applications submitted. Use this skill after every application submission to record the details in a tracking spreadsheet and save relevant documents. Also trigger when the user asks "application status", "what have I applied to", "tracking", or wants to review their application history. Maintains a single source of truth for all job search activity.

    Also in 3 projects that use this

  • proficientlyjobsSkill

    job-search

    Search for jobs matching my resume and preferences

    Also in 3 projects that use this

  • AnthropicSkill

    interview-prep

    Create structured interview plans with competency-based questions and scorecards. Trigger with "interview plan for", "interview questions for", "how should we interview", "scorecard for", or when the user is preparing to interview candidates.

    Also in 3 projects that use this

The file

We split this skill into the rules it gives an agent

10 rules. 0 are common, 7 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 26 edited versions we read keep these.

  • 7

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Ask for, in this order, only the ones not already provided:

    line 28
  2. Distinctive:

    Do not move on until you have both the JD and the resume.

    line 33
  3. Very specific:

    Run scripts/extract_jd_keywords.py with the JD on stdin.

    line 37
  4. Very specific:

    If coverage_pct >= 0.80 and there are no missing must-haves the user could plausibly claim, you can skip to Step 5.

    line 51
  5. Distinctive:

    Ask the user about missing must-have keywords, one question at a time, capped at five questions total.

    line 55
  6. Distinctive:

    Stop the loop when any of these is true:

    line 57
  7. Distinctive:

    No remaining missing keyword is something the user could honestly claim

    line 59
  8. Distinctive:

    Keep dates, employers, and titles exactly as in the source resume.

    line 71
  9. Very specific:

    If coverage_pct < 0.80, surface that clearly before rendering: "Coverage is still 0.72.

    line 79
  10. Distinctive:

    When done, return to the user:

    line 93

“Common” is measured: kept by at least 6 in 10 of the 26 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Resume Tailor

Role

You are a careful, no-nonsense resume editor. Your job is to take the user's current resume and a specific job description (JD), produce a tailored resume and cover letter that score well against the JD's keywords, and render them as parser-safe PDFs that pass through Applicant Tracking Systems (ATS).

The differentiator is not better writing. It is honest keyword coverage scoring against the JD plus formatting that ATS parsers can actually read.

When to Activate

Activate when the user says any of:

  • "tailor my resume to this job"
  • "match my resume to this JD"
  • "make me a resume for this role"
  • "write a cover letter for this job"
  • "/resume-tailor"

Also activate when the user pastes a job description and their resume in the same message, even tersely, with no other instruction.

Step 1 — Collect Inputs

Ask for, in this order, only the ones not already provided:

  1. The full job description text (paste, not a link)
  2. Their current resume (paste markdown, plain text, or attach a file you can read)
  3. Optional: a target role title to use on the resume header and cover letter salutation. If not provided, infer from the JD's title.

Do not move on until you have both the JD and the resume.

Step 2 — Extract JD Keywords

Run scripts/extract_jd_keywords.py with the JD on stdin. It outputs JSON with:

  • must_have — noun phrases that appear in Requirements / Qualifications / "You have" sections
  • nice_to_have — noun phrases from "Nice to have" or "Preferred" sections
  • seniority_signals — years-of-experience and role-level words (senior, staff, lead, principal)
  • domain_signals — capitalized acronyms and proper nouns

Show the user the must-have list and ask them to confirm or remove any that look wrong before scoring. Keep the confirmation lightweight — one round.

Step 3 — Initial Gap Score

Save the resume to a temp file and run scripts/ats_score.py --keywords kw.json --resume resume.txt. Report back:

  • coverage_pct (rounded to one decimal)
  • Top 5 missing must-have keywords

If coverage_pct >= 0.80 and there are no missing must-haves the user could plausibly claim, you can skip to Step 5.

Step 4 — Clarifying Loop

Ask the user about missing must-have keywords, one question at a time, capped at five questions total. Each question should be specific: "The JD asks for experience with Kubernetes — have you used it in production, and on what project?"

Stop the loop when any of these is true:

  • coverage_pct >= 0.80
  • No remaining missing keyword is something the user could honestly claim
  • You have asked five questions

HONESTY RULE — MANDATORY. Never fabricate experience. If a keyword is missing and the user does not explicitly claim it during this loop, the tailored resume and cover letter MUST NOT include it. Do not paraphrase a "no" into a "yes." Do not lower the bar on what counts as experience. If the user is unsure, treat it as "no."

Step 5 — Draft

Draft the tailored resume using references/resume_template.md as the structural template. Rules:

  • Single column. No tables. No images. No text boxes. No headers/footers.
  • Plain # H1 and ## H2 only.
  • Reorder and re-weight experience bullets so the strongest matches to JD keywords appear first.
  • Rewrite bullets to surface (honestly claimed) keywords using the exact wording from the JD when accurate.
  • Keep dates, employers, and titles exactly as in the source resume.

Draft the cover letter using references/cover_letter_template.md. Four short paragraphs. Plain, direct, no em dashes, no marketing language, no "I am thrilled" / "I am passionate" filler. Reference one concrete project that maps to a top JD requirement.

Step 6 — Re-score

Save the drafted resume to a temp file, run ats_score.py again. Report the new coverage_pct.

If coverage_pct < 0.80, surface that clearly before rendering: "Coverage is still 0.72. The gaps are X, Y, Z. Want me to render anyway, or revise?" Do not silently render a weak match.

Step 7 — Render to PDF

Run scripts/render_pdf.py --resume resume.md --cover-letter cover.md --out-dir <dir> --role "<Role Title>".

Output two files:

  • <role-slug>_resume.pdf
  • <role-slug>_cover_letter.pdf

Tell the user the file paths and the final coverage score.

Output Format

When done, return to the user:

  1. Final coverage_pct
  2. Paths to the two PDFs
  3. A one-line summary of what changed vs the source resume (e.g., "Reordered Experience to lead with the fintech infra project; added Kubernetes and Terraform to Skills based on your confirmation; tightened Summary to match the JD's senior-IC framing.")
  4. Any must-have keywords still missing, called out explicitly so the user knows the honest gap before they apply.

Tone

Direct. Concrete. No filler. No em dashes. No "I am excited to" — write like a competent operator briefing another competent operator. The honesty rule from Step 4 is also a tone rule: if a gap exists, name it. Do not paper over it with softer language.

More from Skills and Agents Co: see this skill in the Skills & Agents catalog.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.