Resume — One Source, Many Tailored Resumes
A complete resume management system: structured experience data → AI-tailored LaTeX → PDF.
experiences/ → /cv generate → resume.tex → make en → output/Name-Title.pdf
(素材) (AI 定制化) (LaTeX源) (编译) (输出)
Subcommand Routing
Parse $ARGUMENTS to determine which workflow to run:
init [text] → Init Workflow
generate [job title or JD file] or gen [...] → Generate Workflow
add [description] → Add Experience Workflow
- Empty or unrecognized → Show available subcommands and ask user what they want to do
Prerequisites Check
Before any workflow, verify the environment:
- Check if
resume.cls exists in the current working directory. If not, copy from ${CLAUDE_SKILL_DIR}/assets/resume.cls
- Check if
Makefile exists. If not, copy from ${CLAUDE_SKILL_DIR}/assets/Makefile
- Create directories if missing:
experiences/work/, jobs/, output/, .history/
- Check if
xelatex is available: which xelatex. If not, warn the user: "XeLaTeX is required. Install with: brew install --cask mactex"
Init Workflow (/cv init [text])
Initialize the experience data library from scratch.
Mode Detection
Based on $ARGUMENTS (after stripping "init"):
- User pasted large text (resume, work history, LinkedIn export) → Import Mode
- Empty or short description → Q&A Mode
- File path provided (PDF/Markdown) → Read file, then Import Mode
Import Mode
- Parse the provided content, extracting: personal info, education, work history (company, period, department, role, projects, metrics), personal projects, skills, honors
- Confirm with user — show structured result, ask about missing info or inaccurate metrics
- Generate files into
experiences/:
profile.md — personal info + education
work/<company>.md — one file per company
projects.md — personal projects
skills.md — skill inventory
honors.md — honors + quantified metrics
Q&A Mode
Walk through one question at a time. Never ask multiple questions at once.
- Basic info → name, email, phone, wechat (optional), blog/github (optional) → write
experiences/profile.md
- Education → school, degree, major, period, highlights → append to
experiences/profile.md
- Work history (loop) → company, department, role, period, projects, metrics, tech stack → write
experiences/work/<company>.md. After each: "Any more work experience?" Continue or move on.
- Personal projects → name, link, description, tech stack, highlights → write
experiences/projects.md
- Skills → auto-generate from collected tech stacks, show for confirmation → write
experiences/skills.md
- Honors → extract quantified metrics from work history + user additions → write
experiences/honors.md
File Format Reference
profile.md:
---
name: Name / English Name
email: email@example.com
phone: "+86 xxx"
wechat: xxx
blog: https://...
github: https://...
---
## Education
### School · College | Degree (Period)
- Major, highlights
work/<company>.md:
---
company: Company Name
company_en: English Name
url: https://...
location: City
period: YYYY/MM -- YYYY/MM
department: Department
role: Role
tags: [tag1, tag2, ...]
---
# Project Name
> Timeline | Role
## Background
...
## Key Work
...
## Metrics
...
## Tech Stack
...
Key principles:
- Keep raw details in experiences — trimming happens at generation time
- Tags should cover core tech and business domain keywords
- Metrics must include specific numbers
- One file per company, filename in lowercase English (e.g.,
bytedance.md)
Generate Workflow (/cv generate [target])
Generate a tailored resume for a specific job target.
Step 1: Read All Materials
Read all files:
experiences/profile.md
- All
.md files under experiences/work/
experiences/projects.md
experiences/skills.md
experiences/honors.md
Read ${CLAUDE_SKILL_DIR}/assets/resume-example.tex to understand the LaTeX structure and available commands.
If the argument is a file path, also read that JD file.
Step 2: Analyze Job Requirements
Based on JD or job title, determine:
- Core technical requirements — what skills matter most
- Experience priority — which work experiences are most relevant
- Framing angle — how to present the same experience differently for this role
- Content selection — include/omit personal projects section, which experiences to trim
Step 3: Present the Plan
Before generating .tex, show the user:
- Target positioning (one sentence)
- Content selection (which experiences to include/omit)
- Key differentiation (how this resume differs from a generic one)
Wait for user confirmation before proceeding.
Step 4: Generate LaTeX
Generate resume.tex following these rules:
Use resume.cls commands strictly:
\name{}, \basicInfo{}, \email{}, \phone{}, \wechat{}, \homepage[]{}
\section{}, \datedsubsection{}{}, \role{}{}, \rolewithdate{}{}{}
itemize with [parsep=0.25ex]
Keep to 1 page (critical for Chinese version):
- 5-6 sections: positioning, education, work, (projects), skills, honors
- 3-5 bullet points per project
- Trim early internships to 1-2 lines each
- If too long, cut early internships and low-relevance bullets first
LaTeX header for Chinese:
\documentclass{resume}
\usepackage{xeCJK}
\setCJKmainfont{SourceHanSerifSC-Medium}
\setCJKsansfont{SourceHanSerifSC-Medium}
\setCJKmonofont{SourceHanSerifSC-Medium}
For English version: remove the three xeCJK lines.
Formatting:
- Use
\textbf{【keyword】} to mark each bullet's keyword
- Escape:
& → \&, % → \%
- Use
\href{url}{text} for hyperlinks
Step 5: Build
- Backup current
resume.tex to .history/resume_$(date +%Y%m%d%H%M%S).tex
- Write generated content to
resume.tex
- Run
make en to build PDF
- Copy PDF to
output/ with job-specific name
Step 6: English Version (if requested)
- Remove xeCJK lines
- Translate all content to English
- Build PDF
Add Experience Workflow (/cv add [description])
Add or update experience data incrementally.
Step 1: Classify Input
Determine what the user is adding:
- New work experience → create/update
experiences/work/*.md
- New personal project → update
experiences/projects.md
- New skill → update
experiences/skills.md
- New honor/certification → update
experiences/honors.md
- Personal info change → update
experiences/profile.md
Step 2: Read Existing File
Read the target file to understand current content and format.
Step 3: Update
Apply updates following the file format conventions above. Keep raw details — don't trim prematurely.
Step 4: Confirm
Show the diff to the user, confirm before writing.
Step 5: Remind
After updating: "Experience updated. Run /cv generate [target] to regenerate your resume."
1---2name: cv3description: AI-powered resume system. Manages structured experience data and generates tailored LaTeX resumes for different job targets. Use when user says 'cv', 'generate resume', 'make resume', 'init resume', 'add experience', '简历', '生成简历', '初始化简历', or '添加经历'.4---56# Resume — One Source, Many Tailored Resumes78A complete resume management system: structured experience data → AI-tailored LaTeX → PDF.910```11experiences/ → /cv generate → resume.tex → make en → output/Name-Title.pdf12 (素材) (AI 定制化) (LaTeX源) (编译) (输出)13```1415## Subcommand Routing1617Parse `$ARGUMENTS` to determine which workflow to run:1819- `init [text]` → **Init Workflow**20- `generate [job title or JD file]` or `gen [...]` → **Generate Workflow**21- `add [description]` → **Add Experience Workflow**22- Empty or unrecognized → Show available subcommands and ask user what they want to do2324---2526## Prerequisites Check2728Before any workflow, verify the environment:29301. Check if `resume.cls` exists in the current working directory. If not, copy from `${CLAUDE_SKILL_DIR}/assets/resume.cls`312. Check if `Makefile` exists. If not, copy from `${CLAUDE_SKILL_DIR}/assets/Makefile`323. Create directories if missing: `experiences/work/`, `jobs/`, `output/`, `.history/`334. Check if `xelatex` is available: `which xelatex`. If not, warn the user: "XeLaTeX is required. Install with: brew install --cask mactex"3435---3637## Init Workflow (`/cv init [text]`)3839Initialize the experience data library from scratch.4041### Mode Detection4243Based on `$ARGUMENTS` (after stripping "init"):44451. **User pasted large text** (resume, work history, LinkedIn export) → **Import Mode**462. **Empty or short description** → **Q&A Mode**473. **File path provided** (PDF/Markdown) → Read file, then **Import Mode**4849### Import Mode50511. **Parse** the provided content, extracting: personal info, education, work history (company, period, department, role, projects, metrics), personal projects, skills, honors522. **Confirm** with user — show structured result, ask about missing info or inaccurate metrics533. **Generate files** into `experiences/`:54 - `profile.md` — personal info + education55 - `work/<company>.md` — one file per company56 - `projects.md` — personal projects57 - `skills.md` — skill inventory58 - `honors.md` — honors + quantified metrics5960### Q&A Mode6162Walk through one question at a time. **Never ask multiple questions at once.**63641. **Basic info** → name, email, phone, wechat (optional), blog/github (optional) → write `experiences/profile.md`652. **Education** → school, degree, major, period, highlights → append to `experiences/profile.md`663. **Work history** (loop) → company, department, role, period, projects, metrics, tech stack → write `experiences/work/<company>.md`. After each: "Any more work experience?" Continue or move on.674. **Personal projects** → name, link, description, tech stack, highlights → write `experiences/projects.md`685. **Skills** → auto-generate from collected tech stacks, show for confirmation → write `experiences/skills.md`696. **Honors** → extract quantified metrics from work history + user additions → write `experiences/honors.md`7071### File Format Reference7273**profile.md:**74```markdown75---76name: Name / English Name77email: email@example.com78phone: "+86 xxx"79wechat: xxx80blog: https://...81github: https://...82---8384## Education8586### School · College | Degree (Period)87- Major, highlights88```8990**work/\<company\>.md:**91```markdown92---93company: Company Name94company_en: English Name95url: https://...96location: City97period: YYYY/MM -- YYYY/MM98department: Department99role: Role100tags: [tag1, tag2, ...]101---102103# Project Name104> Timeline | Role105106## Background107...108109## Key Work110...111112## Metrics113...114115## Tech Stack116...117```118119Key principles:120- Keep raw details in experiences — trimming happens at generation time121- Tags should cover core tech and business domain keywords122- Metrics must include specific numbers123- One file per company, filename in lowercase English (e.g., `bytedance.md`)124125---126127## Generate Workflow (`/cv generate [target]`)128129Generate a tailored resume for a specific job target.130131### Step 1: Read All Materials132133Read all files:134- `experiences/profile.md`135- All `.md` files under `experiences/work/`136- `experiences/projects.md`137- `experiences/skills.md`138- `experiences/honors.md`139140Read `${CLAUDE_SKILL_DIR}/assets/resume-example.tex` to understand the LaTeX structure and available commands.141142If the argument is a file path, also read that JD file.143144### Step 2: Analyze Job Requirements145146Based on JD or job title, determine:1471. **Core technical requirements** — what skills matter most1482. **Experience priority** — which work experiences are most relevant1493. **Framing angle** — how to present the same experience differently for this role1504. **Content selection** — include/omit personal projects section, which experiences to trim151152### Step 3: Present the Plan153154Before generating .tex, show the user:1551. Target positioning (one sentence)1562. Content selection (which experiences to include/omit)1573. Key differentiation (how this resume differs from a generic one)158159**Wait for user confirmation before proceeding.**160161### Step 4: Generate LaTeX162163Generate `resume.tex` following these rules:1641651. **Use resume.cls commands strictly**:166 - `\name{}`, `\basicInfo{}`, `\email{}`, `\phone{}`, `\wechat{}`, `\homepage[]{}`167 - `\section{}`, `\datedsubsection{}{}`, `\role{}{}`, `\rolewithdate{}{}{}`168 - `itemize` with `[parsep=0.25ex]`1691702. **Keep to 1 page** (critical for Chinese version):171 - 5-6 sections: positioning, education, work, (projects), skills, honors172 - 3-5 bullet points per project173 - Trim early internships to 1-2 lines each174 - If too long, cut early internships and low-relevance bullets first1751763. **LaTeX header for Chinese**:177 ```latex178 \documentclass{resume}179 \usepackage{xeCJK}180 \setCJKmainfont{SourceHanSerifSC-Medium}181 \setCJKsansfont{SourceHanSerifSC-Medium}182 \setCJKmonofont{SourceHanSerifSC-Medium}183 ```184 For English version: remove the three xeCJK lines.1851864. **Formatting**:187 - Use `\textbf{【keyword】}` to mark each bullet's keyword188 - Escape: `&` → `\&`, `%` → `\%`189 - Use `\href{url}{text}` for hyperlinks190191### Step 5: Build1921931. Backup current `resume.tex` to `.history/resume_$(date +%Y%m%d%H%M%S).tex`1942. Write generated content to `resume.tex`1953. Run `make en` to build PDF1964. Copy PDF to `output/` with job-specific name197198### Step 6: English Version (if requested)1992001. Remove xeCJK lines2012. Translate all content to English2023. Build PDF203204---205206## Add Experience Workflow (`/cv add [description]`)207208Add or update experience data incrementally.209210### Step 1: Classify Input211212Determine what the user is adding:213- **New work experience** → create/update `experiences/work/*.md`214- **New personal project** → update `experiences/projects.md`215- **New skill** → update `experiences/skills.md`216- **New honor/certification** → update `experiences/honors.md`217- **Personal info change** → update `experiences/profile.md`218219### Step 2: Read Existing File220221Read the target file to understand current content and format.222223### Step 3: Update224225Apply updates following the file format conventions above. Keep raw details — don't trim prematurely.226227### Step 4: Confirm228229Show the diff to the user, confirm before writing.230231### Step 5: Remind232233After updating: "Experience updated. Run `/cv generate [target]` to regenerate your resume."