π 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 say | Assistant 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:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
resume_content | string | β | β | Resume text (plain text or Markdown) |
language | string | β | en | en 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:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
resume_content | string | β | β | Resume text |
job_description | string | β | β | Target job description or job title |
language | string | β | en | en 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:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
resume_content | string | β | β | Resume text (Markdown preferred) |
format | string | β | β | word | markdown | html | latex | pdf |
template | string | β | professional | professional | modern | minimal | academic |
Templates:
| Template | Style | Best For |
|---|---|---|
professional | Navy, serif headings, classic borders | Finance, consulting, law, healthcare |
modern | Teal accents, creative layout, emoji icons | Tech, startups, product, marketing |
minimal | Monochrome, ultra-clean, content-dense | Senior professionals, engineering |
academic | Formal serif, multi-page, publications | Faculty, research, PhD applications |
Export details:
- HTML: Self-contained file with embedded CSS, 4 color themes,
@media printoptimized - LaTeX: Complete compilable
.texwith 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:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
resume_content | string | β | β | Resume text |
target_role | string | β | β | Target role for fit assessment |
language | string | β | en | en for English, zh for Chinese |
Scoring dimensions (100 points):
| Dimension | Points | Evaluates |
|---|---|---|
| Content Quality | 30 | Achievements, action verbs, relevance, completeness |
| Structure & Formatting | 25 | Layout, consistency, length, section order |
| Language & Grammar | 20 | Grammar, spelling, tone, clarity |
| ATS Optimization | 15 | Keywords, standard headings, format compatibility |
| Impact & Impression | 10 | 6-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:
- Start with score if you have an existing resume β understand your baseline
- Polish to fix all fundamentals before customizing for a job
- Customize separately for each application β one-size-fits-all doesn't work
- Export last β get content perfect, then format
- Use Markdown as your working format β it converts cleanly to all others
- 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
| Language | Code | Features |
|---|---|---|
| English | en | Full support, US/UK conventions |
| Chinese | zh | Full support, δΈθ±ζζ··ζθ§θ, CJK export |
Configuration
| Key | Value | Description |
|---|---|---|
max_resume_length | 10,000 chars | Maximum input length |
supported_languages | en, zh | Available languages |
supported_export_formats | word, markdown, html, latex, pdf | Available export formats |
| scats |