Resume Assistant

Assist job seekers by polishing, customizing, scoring, and exporting resumes with detailed checklist reviews and multi-format support.

enoyao

@wscats

What This Skill Does

AI-powered resume and CV assistant that polishes, customizes, scores, and exports resumes with a 40+ point checklist review and multi-format support. It analyzes job descriptions for ATS optimization, provides a 100-point scoring system with improvement plans, and converts resumes to PDF, Word, or other formats.

Replaces manual resume editing, generic templates, and scattered ATS checkers by providing an all-in-one tool for creation, optimization, scoring, and export.

When to Use It

  • Create a tailored resume for a specific job title or role
  • Polish an existing resume by running a 40+ point checklist review
  • Optimize a resume for ATS compatibility with keyword and format adjustments
  • Score a resume on a 100-point scale and get a detailed improvement plan
  • Tailor a resume to match a specific job description with gap analysis
  • Export a resume to PDF, Word, or other professional formats

Install

$ openclaw skills install @wscats/resume-assistant

๐Ÿ“ Resume / CV Assistant

AI-powered clawbot skill for resume & CV polishing, job customization, multi-format export, and professional scoring. Version: 1.0.0 ยท License: MIT ยท Repository: github.com/Wscats/resume-assistant


Overview

Resume / CV Assistant is a clawbot skill that helps job seekers create, refine, and optimize their resumes and CVs, while adding comprehensive checklist review, scoring, and multi-format export that neither project offers alone.


Usage in AI Agent

Quick Start

Resume / CV Assistant is a standard clawbot skill that can be loaded and invoked by any compatible AI Agent. Here are different integration approaches.

๐Ÿ’ฌ Natural Language (Recommended)

You don't need to memorize any commands โ€” simply describe what you need:

๐Ÿ’ฌ "Create a resume for a software engineer position"
๐Ÿ’ฌ "Polish my resume and fix any issues"
๐Ÿ’ฌ "Optimize my resume for ATS"
๐Ÿ’ฌ "Tailor my resume for this job description: [paste JD]"
๐Ÿ’ฌ "Convert my resume to PDF"
๐Ÿ’ฌ "Score my resume and tell me how to improve"
๐Ÿ’ฌ "What's wrong with my resume?"
๐Ÿ’ฌ "Here's my resume, can you help?"

The assistant understands your intent and automatically routes to the right workflow:

You sayAssistant does
"Create a resume for [role]"Asks for your background โ†’ builds a tailored resume
"Polish / Fix / Improve my resume"Runs 40+ checklist review โ†’ returns polished version
"Optimize for ATS"Checks ATS compatibility โ†’ optimizes keywords & format
"Tailor for this JD: ..."Analyzes JD โ†’ gap analysis โ†’ customized resume
"Convert to PDF / Word / ..."Exports to chosen format with professional template
"Score / Rate / Evaluate my resume"100-point scoring โ†’ strengths & improvement plan
"Here's my resume, help?"Scores first โ†’ suggests next steps

Example Conversations

Creating a new resume:

You:   Create a resume for a frontend engineer position at a startup

Bot:   I'd be happy to help! To get started, could you share:
       1. Your work experience (companies, roles, dates, key achievements)
       2. Education background
       3. Technical skills
       4. Any specific job posting you're targeting? (optional)

You:   I have 3 years at Shopify working on React...

Bot:   Here's your tailored resume:
       [generates complete resume]
       
       Would you like me to score, polish, or export it?

Quick improvement:

You:   Here's my resume, what do you think?
       [pastes resume]

Bot:   ๐Ÿ“Š Resume Score: 68/100 (Grade: C)
       Top 3 Issues:
       1. โŒ No quantified achievements
       2. โš ๏ธ Weak action verbs
       3. โš ๏ธ Missing keywords for target role
       
       Would you like me to polish it now?

You:   Yes, polish it

Bot:   [runs full polish with 40+ checklist items]

Job-specific tailoring:

You:   Tailor my resume for this job description:
       Senior Backend Engineer at Stripe
       Requirements: Go, distributed systems, payment APIs...

Bot:   ๐ŸŽฏ Job Analysis Complete
       ๐Ÿ“Š Current Match: 62% โ†’ After Optimization: 89%
       [generates tailored version]

Option 1: Slash Commands via clawbot

For more precise control, use slash commands directly in a clawbot conversation:

/resume polish
Please polish my resume:

John Doe
Senior Frontend Engineer | 5 years experience
Skills: JavaScript, React, Vue, Node.js
...

Option 2: Integration in AI Agent Frameworks

1. Register the Skill

Register this project as a skill in your AI Agent:

{
  "skills": [
    {
      "name": "resume-assistant",
      "path": "./skills/resume-assistant",
      "manifest": "skill.json"
    }
  ]
}

2. Load Prompts

When handling resume-related requests, prompt files are loaded in this order:

1. prompts/system.md      โ† Persona & quality standards (loaded first)
2. prompts/<command>.md    โ† Load per command: specific instructions
3. templates/<style>.md    โ† Load on demand (export command only)

3. Build the Complete Prompt

Example for /resume polish โ€” here's how an AI Agent should construct the prompt:

# Python pseudocode
ROLE_SYS = "system"    # LLM message role constant
ROLE_USR = "user"      # LLM message role constant

def build_prompt(command, args):
    # Step 1: Load the skill persona prompt
    persona_prompt = load_file("prompts/system.md")

    # Step 2: Load command-specific prompt
    command_prompt = load_file(f"prompts/{command}.md")

    # Step 3: Combine prompts into LLM messages
    combined = persona_prompt + "\n\n" + command_prompt
    messages = [
        {"role": ROLE_SYS, "content": combined},
        {"role": ROLE_USR, "content": args["resume_content"]}
    ]

    # Step 4: Add optional parameters to user message
    if args.get("language"):
        messages[1]["content"] += f"\n\nLanguage: {args['language']}"

    return messages
// JavaScript pseudocode
const ROLE_SYS = 'system';  // LLM message role constant
const ROLE_USR = 'user';    // LLM message role constant

async function buildPrompt(command, args) {
  // Step 1: Load the skill persona prompt
  const personaPrompt = await loadFile('prompts/system.md');

  // Step 2: Load command-specific prompt
  const commandPrompt = await loadFile(`prompts/${command}.md`);

  // Step 3: Combine prompts into LLM messages
  const combined = `${personaPrompt}\n\n${commandPrompt}`;
  const messages = [
    { role: ROLE_SYS, content: combined },
    { role: ROLE_USR, content: args.resume_content }
  ];

  // Step 4: Add optional parameters
  if (args.language) {
    messages[1].content += `\n\nLanguage: ${args.language}`;
  }

  return messages;
}

Option 3: REST API

If your AI Agent exposes an HTTP API, invoke via RESTful endpoints:

# Polish a resume
curl -X POST https://your-agent-api.com/skills/resume-assistant/polish \
  -H "Content-Type: application/json" \
  -d '{
    "resume_content": "Your resume content...",
    "language": "en"
  }'

# Score a resume
curl -X POST https://your-agent-api.com/skills/resume-assistant/score \
  -H "Content-Type: application/json" \
  -d '{
    "resume_content": "Your resume content...",
    "target_role": "Senior Frontend Engineer",
    "language": "en"
  }'

# Customize for a job
curl -X POST https://your-agent-api.com/skills/resume-assistant/customize \
  -H "Content-Type: application/json" \
  -d '{
    "resume_content": "Your resume content...",
    "job_description": "Job description...",
    "language": "en"
  }'

# Export to a format
curl -X POST https://your-agent-api.com/skills/resume-assistant/export \
  -H "Content-Type: application/json" \
  -d '{
    "resume_content": "Your resume content...",
    "format": "html",
    "template": "modern"
  }'

Option 4: LangChain / LlamaIndex Integration

from langchain.tools import Tool

# Define tools based on skill.json commands
resume_tools = [
    Tool(
        name="resume_polish",
        description="Polish and improve resume with 40+ checklist items",
        func=lambda input: agent.run_skill(
            "resume-assistant", "polish",
            {"resume_content": input, "language": "en"}
        )
    ),
    Tool(
        name="resume_score",
        description="Score a resume on 100-point scale with improvement suggestions",
        func=lambda input: agent.run_skill(
            "resume-assistant", "score",
            {"resume_content": input, "language": "en"}
        )
    ),
    Tool(
        name="resume_customize",
        description="Customize resume for a specific job position",
        func=lambda input: agent.run_skill(
            "resume-assistant", "customize",
            {"resume_content": input.split("---JD---")[0],
             "job_description": input.split("---JD---")[1],
             "language": "en"}
        )
    ),
    Tool(
        name="resume_export",
        description="Export resume to Word/Markdown/HTML/LaTeX/PDF",
        func=lambda input: agent.run_skill(
            "resume-assistant", "export",
            {"resume_content": input, "format": "html", "template": "modern"}
        )
    ),
]

Command Routing

The AI Agent should route user requests to the correct command:

graph TD
    A["User Input"] --> B{"Contains<br/>slash command?"}
    B -- "Yes" --> C{"Parse command"}
    C -- "/resume polish" --> D["Load polish.md"]
    C -- "/resume customize" --> E["Load customize.md"]
    C -- "/resume export" --> F["Load export.md"]
    C -- "/resume score" --> G["Load score.md"]
    B -- "No" --> H{"Intent detection"}
    H -- "polish/improve/fix" --> D
    H -- "job/apply/match" --> E
    H -- "export/download/convert" --> F
    H -- "score/rate/evaluate" --> G
    D --> I["Build Prompt<br/>Call LLM"]
    E --> I
    F --> I
    G --> I
    I --> J["Return Result"]

Argument Validation

The AI Agent should validate arguments before invocation, referencing skill.json:

def validate_args(command, args):
    """Validate arguments against skill.json schema."""
    schema = load_skill_json()
    cmd_schema = next(c for c in schema["commands"] if c["name"] == command)

    for arg in cmd_schema["arguments"]:
        # Check required fields
        if arg["required"] and arg["name"] not in args:
            raise ValueError(f"Missing required argument: {arg['name']}")

        # Check enum constraints
        if "enum" in arg and arg["name"] in args:
            if args[arg["name"]] not in arg["enum"]:
                raise ValueError(
                    f"Invalid value for {arg['name']}: {args[arg['name']]}. "
                    f"Must be one of: {arg['enum']}"
                )

        # Apply defaults
        if arg["name"] not in args and "default" in arg:
            args[arg["name"]] = arg["default"]

    # Check max resume length
    max_len = schema["config"]["max_resume_length"]
    if len(args.get("resume_content", "")) > max_len:
        raise ValueError(f"Resume exceeds {max_len} character limit")

    return args

Commands

/resume polish

Run a 40+ item checklist across 8 categories and get a fully improved resume.

Arguments:

NameTypeRequiredDefaultDescription
resume_contentstringโœ…โ€”Resume text (plain text or Markdown)
languagestringโ€”enen for English, zh for Chinese

What you get:

  • โœ…/โŒ/โš ๏ธ checklist results for every item (contact, summary, experience, education, skills, grammar, formatting, ATS)
  • Fully polished resume with strong action verbs and quantified results
  • Change summary categorized by priority: ๐Ÿ”ด Critical โ†’ ๐ŸŸก Major โ†’ ๐ŸŸข Minor โ†’ ๐Ÿ’ก Suggestion
  • Action verb reference table and quantification guide

/resume customize

Tailor your resume for a specific job posting with gap analysis and keyword optimization.

Arguments:

NameTypeRequiredDefaultDescription
resume_contentstringโœ…โ€”Resume text
job_descriptionstringโœ…โ€”Target job description or job title
languagestringโ€”enen for English, zh for Chinese

What you get:

  • Job description breakdown (required skills, preferred skills, responsibilities, keywords)
  • Gap analysis matrix mapping every requirement to your resume
  • Customized resume with keywords naturally integrated
  • Keyword coverage report: before vs. after
  • Bonus: cover letter talking points + interview prep notes

/resume export

Convert your resume to Word, Markdown, HTML, LaTeX, or PDF with professional templates.

Arguments:

NameTypeRequiredDefaultDescription
resume_contentstringโœ…โ€”Resume text (Markdown preferred)
formatstringโœ…โ€”word | markdown | html | latex | pdf
templatestringโ€”professionalprofessional | modern | minimal | academic

Templates:

TemplateStyleBest For
professionalNavy, serif headings, classic bordersFinance, consulting, law, healthcare
modernTeal accents, creative layout, emoji iconsTech, startups, product, marketing
minimalMonochrome, ultra-clean, content-denseSenior professionals, engineering
academicFormal serif, multi-page, publicationsFaculty, research, PhD applications

Export details:

  • HTML: Self-contained file with embedded CSS, 4 color themes, @media print optimized
  • LaTeX: Complete compilable .tex with XeLaTeX + CJK support
  • Word: Pandoc-optimized Markdown with YAML front matter + conversion command
  • PDF: Print-optimized HTML with A4 page dimensions + multiple conversion methods
  • Markdown: Clean, structured, version-control friendly

/resume score

Get a 100-point professional evaluation with specific improvement suggestions.

Arguments:

NameTypeRequiredDefaultDescription
resume_contentstringโœ…โ€”Resume text
target_rolestringโ€”โ€”Target role for fit assessment
languagestringโ€”enen for English, zh for Chinese

Scoring dimensions (100 points):

DimensionPointsEvaluates
Content Quality30Achievements, action verbs, relevance, completeness
Structure & Formatting25Layout, consistency, length, section order
Language & Grammar20Grammar, spelling, tone, clarity
ATS Optimization15Keywords, standard headings, format compatibility
Impact & Impression106-second test, career story, professionalism

Grade scale: A+ (95-100) โ†’ A (90-94) โ†’ B+ (85-89) โ†’ B (80-84) โ†’ C+ (75-79) โ†’ C (70-74) โ†’ D (60-69) โ†’ F (<60)

What you get:

  • Score breakdown with per-dimension justification
  • Top 3 strengths with specific examples from your resume
  • Priority-ranked improvements with Before โ†’ After rewrites
  • Role fit assessment (if target_role provided): fit score, competitive percentile, strengths, gaps
  • 5-step action plan with effort estimates

Recommended Workflow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  Recommended Workflow                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                      โ”‚
โ”‚  1. /resume score     โ† Know where you stand         โ”‚
โ”‚     ๐Ÿ’ฌ "Score my resume"                             โ”‚
โ”‚          โ”‚                                           โ”‚
โ”‚          โ–ผ                                           โ”‚
โ”‚  2. /resume polish    โ† Fix all issues               โ”‚
โ”‚     ๐Ÿ’ฌ "Polish my resume"                            โ”‚
โ”‚          โ”‚                                           โ”‚
โ”‚          โ–ผ                                           โ”‚
โ”‚  3. /resume customize โ† Tailor per application       โ”‚
โ”‚     ๐Ÿ’ฌ "Tailor for this JD: ..."                     โ”‚
โ”‚          โ”‚                                           โ”‚
โ”‚          โ–ผ                                           โ”‚
โ”‚  4. /resume export    โ† Generate final files         โ”‚
โ”‚     ๐Ÿ’ฌ "Convert to PDF"                              โ”‚
โ”‚          โ”‚                                           โ”‚
โ”‚          โ–ผ                                           โ”‚
โ”‚  5. /resume score     โ† Verify improvement           โ”‚
โ”‚     ๐Ÿ’ฌ "Score my resume again"                       โ”‚
โ”‚                                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Tips:

  1. Start with score if you have an existing resume โ€” understand your baseline
  2. Polish to fix all fundamentals before customizing for a job
  3. Customize separately for each application โ€” one-size-fits-all doesn't work
  4. Export last โ€” get content perfect, then format
  5. Use Markdown as your working format โ€” it converts cleanly to all others
  6. Score again after polish + customize to measure improvement

Project Structure

resume-assistant/
โ”œโ”€โ”€ skill.json                    # Skill manifest (JSON)
โ”œโ”€โ”€ skill.yaml                    # Skill manifest (YAML)
โ”œโ”€โ”€ SKILL.md                      # This documentation
โ”œโ”€โ”€ prompts/
โ”‚   โ”œโ”€โ”€ system.md                 # Persona definition & quality standards
โ”‚   โ”œโ”€โ”€ polish.md                 # Polish prompt: 40+ item checklist
โ”‚   โ”œโ”€โ”€ customize.md              # Customize prompt: gap analysis & keywords
โ”‚   โ”œโ”€โ”€ export.md                 # Export prompt: 5 formats ร— 4 templates
โ”‚   โ””โ”€โ”€ score.md                  # Score prompt: 100-point rubric
โ”œโ”€โ”€ templates/
โ”‚   โ”œโ”€โ”€ professional.md           # Classic corporate template
โ”‚   โ”œโ”€โ”€ modern.md                 # Contemporary tech/startup template
โ”‚   โ”œโ”€โ”€ minimal.md                # Ultra-clean senior template
โ”‚   โ”œโ”€โ”€ academic.md               # Formal academic CV template
โ”‚   โ””โ”€โ”€ export/
โ”‚       โ”œโ”€โ”€ resume.html           # HTML template (4 CSS themes)
โ”‚       โ””โ”€โ”€ resume.tex            # LaTeX template (XeLaTeX + CJK)
โ””โ”€โ”€ examples/
    โ”œโ”€โ”€ sample-resume-en.md       # English sample (high quality)
    โ”œโ”€โ”€ sample-resume-zh.md       # Chinese sample (high quality)
    โ”œโ”€โ”€ sample-resume-weak.md     # Weak sample (for scoring demo)
    โ””โ”€โ”€ usage.md                  # Usage examples & workflow guide

Language Support

LanguageCodeFeatures
EnglishenFull support, US/UK conventions
ChinesezhFull support, ไธญ่‹ฑๆ–‡ๆททๆŽ’่ง„่Œƒ, CJK export

Configuration

KeyValueDescription
max_resume_length10,000 charsMaximum input length
supported_languagesen, zhAvailable languages
supported_export_formatsword, markdown, html, latex, pdfAvailable export formats
scats

Top skills in this category

description: ๅฐ†็”จๆˆท่ฎฒ็จฟไธ€้”ฎ็”Ÿๆˆไน”ๅธƒๆ–ฏ้ฃŽๆž็ฎ€็ง‘ๆŠ€ๆ„Ÿ็ซ–ๅฑHTMLๆผ”็คบ็จฟใ€‚ๅฝ“็”จๆˆท้œ€่ฆ็”ŸๆˆPPTใ€ๆผ”็คบๆ–‡็จฟใ€Slidesใ€ๅนป็ฏ็‰‡๏ผŒๆˆ–่ฆๆฑ‚็ง‘ๆŠ€้ฃŽ/ๆž็ฎ€้ฃŽ/ไน”ๅธƒๆ–ฏ้ฃŽๆ ผ็š„ๆผ”็คบๆ—ถ่งฆๅ‘ๆญคๆŠ€่ƒฝใ€‚่พ“ๅ‡บไธบๅ•ไธชๅฏ็›ดๆŽฅ่ฟ่กŒ็š„HTMLๆ–‡ไปถใ€‚

@wwlyzzyorg

ๅฐ†่ฎฒ็จฟไธ€้”ฎ็”Ÿๆˆไน”ๅธƒๆ–ฏ้ฃŽๆž็ฎ€็ง‘ๆŠ€ๆ„Ÿ็ซ–ๅฑHTMLๆผ”็คบ็จฟ

8533k

Feishu Evolver Wrapper

@autogame-17

(Depreciated: This skill is no longer maintained; its related functions have been absorbed by the Evolver main body.) Feishu-integrated wrapper for the capability-evolver. Manages the evolution loop lifecycle (start/stop/ensure), sends rich Feishu card reports, and provides...

1073k

Smart Model Switching

@millibus

Auto-route tasks to the cheapest Claude model that works correctly. Three-tier progression: Haiku โ†’ Sonnet โ†’ Opus. Classify before responding. HAIKU (default): factual Q&A, greetings, reminders, status checks, lookups, simple file ops, heartbeats, casual chat, 1-2 sentence tasks. ESCALATE TO SONNET: code >10 lines, analysis, comparisons, planning, reports, multi-step reasoning, tables, long writing >3 paragraphs, summarization, research synthesis, most user conversations. ESCALATE TO OPUS: architecture decisions, complex debugging, multi-file refactoring, strategic planning, nuanced judgment, deep research, critical production decisions. Rule: If a human needs >30 seconds of focused thinking, escalate. If Sonnet struggles with complexity, go to Opus. Save 50-90% on API costs by starting cheap and escalating only when needed.

216.6k

Writing Plans

@zlc000190

Use when you have a spec or requirements for a multi-step task, before touching code

713k

Todo management

@lstpsche

Per-workspace SQLite todo manager (./todo.db) with groups and task statuses (pending/in_progress/done/skipped), operated via {baseDir}/scripts/todo.sh for adding, listing, editing, moving, and removing entries and managing groups.

126.9k