From vibe-resume
Generate a versioned, reviewer-scored résumé from the user's AI-coding and git history — extracts from Claude Code, Cursor, Copilot, Cline, Continue, Aider, Windsurf, Zed AI, Claude Desktop, ChatGPT/Claude.ai/Gemini/Grok/Perplexity/Mistral/Poe cloud exports, ComfyUI, Midjourney, Suno, ElevenLabs, and git commits. Renders to Markdown / DOCX / PDF across 10 locales (en_US, en_EU, en_GB, zh_TW, zh_HK, zh_CN, ja_JP, ko_KR, de_DE, fr_FR) with culture-specific layouts (JIS Z 8303 履歴書 grid, Europass, Lebenslauf, bilingual HK), optional JD-tailored bullet rewriting, and an 8-point reviewer audit with score trend. Use when the user asks to "generate my résumé", "render my résumé in Japanese", "tailor my CV for this job description", "score my résumé", or "show my résumé trend".
How this skill is triggered — by the user, by Claude, or both
Slash command
/vibe-resume:ai-used-resumeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Invoke this skill whenever the user wants to **turn their AI-tool usage history into a résumé artefact**. Common triggers:
Invoke this skill whenever the user wants to turn their AI-tool usage history into a résumé artefact. Common triggers:
Do NOT invoke when the user:
| Intent | Command |
|---|---|
| Fresh pipeline | uv run vibe-resume extract && uv run vibe-resume aggregate && uv run vibe-resume enrich --locale en_US then process prompts in session, then enrich --ingest --locale en_US && render -f all --locale en_US |
| Render single locale | uv run vibe-resume render -f md --locale ja_JP |
| All 10 locales | uv run vibe-resume render --all-locales |
| JD-tailored run | uv run vibe-resume enrich --tailor data/imports/jd.txt --locale en_US -n 1 && uv run vibe-resume render -f md --locale en_US --tailor data/imports/jd.txt |
| Persona-biased enrich | uv run vibe-resume enrich --persona tech_lead --locale en_US (keys: tech_lead / hr / executive / startup_founder / academic) |
| Multi-persona enrich in one run | uv run vibe-resume enrich --persona tech_lead,hr,executive --locale en_US or --persona all — each persona writes its own _project_groups.<persona>.json |
| Level-tuned enrich | uv run vibe-resume enrich --level senior --locale en_US (keys: new_grad / junior / mid / senior / staff_plus / research_scientist) |
| Persona render | uv run vibe-resume render --persona tech_lead --locale en_US reads the persona-scoped cache and emits resume_v<NNN>_<locale>_<persona>.md |
| Compare persona output | uv run vibe-resume personas-compare --locale en_US -n 3 — side-by-side bullets per persona for the top-N groups (quality iteration loop). --locale required since 0.4.0. |
| Score latest | uv run vibe-resume review |
| Score with JD echo | uv run vibe-resume review --jd data/imports/jd.txt |
| Scores as JSON (for agents) | uv run vibe-resume review --json → structured scorecard + resolved target path on stdout; review --variants --json scores every rendered variant (ats/detailed/base) in one call (#91). Review always prints which file it scored (#86). |
| Score with persona lens | uv run vibe-resume review --persona hr — appends persona-specific review tips |
| Disclose real signals (self-mine) | uv run vibe-resume evidence --json — per group: candidate metrics, backed terms, human-gate evidence, provenance. --jd <file> adds present-but-omitted vs genuinely-absent keywords. Surface only what's disclosed — never invent. |
| Ground in the code | uv run vibe-resume scan → process each *.scan.prompt.md with a cheap-model subagent (one per project, parallel) → uv run vibe-resume scan --ingest. Grounds bullets in what the repo actually does. Opt-in; never uploads code, drops secrets. |
| Fit a page budget | uv run vibe-resume render --max-pages 2 --locale en_US — tighten bullet density, not just --top-n |
| Standard variant set | uv run vibe-resume render --variants --locale en_US — ATS (page-budgeted) + detailed, same cache |
| Truth-preserving auto-iterate | uv run vibe-resume iterate --locale en_US — lift the grade via truthful levers, stop honestly at the ceiling, print human-applied suggestions (dry-run; --write to snapshot) |
| Explore the layout surface | uv run vibe-resume explore --locale en_US --top-n 4,6,8 --page-budget 1.5,2.0,2.5 — sweep the grid, review each cell, surface the Pareto front (score↑ / pages↓). Pure layout/selection — never rewrites bullets. --write '6,2.0' snapshots a cell. |
| Per-gap JD grounding | uv run vibe-resume jd-check --tailor data/imports/jd.txt --explain — per missing keyword: groundable (with supporting activity snippets + refs) vs honestly absent. Advisory only; never auto-inserts. |
| Angle-biased candidate bullets | uv run vibe-resume enrich --candidates impact_first,breadth_first,depth_first --locale en_US emits N framings per group; uv run vibe-resume bullets-compare --locale en_US shows them side by side to pick per group. Angle is a prompt prefix — anti-fabrication rules unchanged. |
| Persona compare with scores | uv run vibe-resume personas-compare --locale en_US --with-scores --tailor data/imports/jd.txt — bullet diff plus a per-persona review-score table; highlights the best-JD-fit persona. |
| Branch a gate decision | uv run vibe-resume run --branch G2 --decision '{"choice":"top_n","top_n":8}' forks the ledger, recomputes that gate's suffix, auto review-diffs vs the original. run --branches lists forks; run --adopt <id> promotes one. |
| Curate groups (human-in-loop) | uv run vibe-resume curate then set actions without editing YAML: curate --drop <name> / --merge <src>:<dst> / --keep <name>, then curate --apply (executes the action field, independent of tier) (#87). emphasis 'foreground my security work' sets a free-text bias for the next enrich. |
| Drive the gate machine (agents) | uv run vibe-resume gates state --json — armed gates, fully-wired vs emit-only, pending gate, each recorded decision + recompute suffix (#90). |
| Cap bullets per group | uv run vibe-resume render --bullets-per-group N — hard cap; warns when bullets are dropped instead of silently truncating (#88). The detailed variant is no longer floored by the global page budget. |
| Compare two versions' scores | uv run vibe-resume review-diff v001 v002 --jd data/imports/jd.txt — per-check scorecard delta. |
| Per-locale trend | uv run vibe-resume trend --locale zh_TW |
| Locale quick map | |
|---|---|
en_US | default, XYZ verbs, ATS flat skills |
en_EU | Europass labelled personal-info, CEFR |
en_GB | UK spelling, Personal statement |
zh_TW | 繁中,中英技術混排 |
zh_HK | bilingual EN + 繁 headings |
zh_CN | 简体,大厂 ATS-friendly |
ja_JP | DOCX = JIS Z 8303 履歴書 grid; md = 職務経歴書 |
ko_KR | 이력서 + photo expected |
de_DE | Lebenslauf + Persönliche Daten, photo expected |
fr_FR | Profil / Compétences / Expérience |
Locate the repo. The CLI binary is vibe-resume; check with which vibe-resume or uv run vibe-resume --help. If not installed, ask the user whether to clone https://github.com/easyvibecoding/vibe-resume and run uv venv && uv pip install -e ".[dev]".
Verify profile.yaml.
Your Name placeholder), ask for name, email, target_role, summary. Optional: experience, education, languages, custom_sections.<field>_<locale> overrides (e.g. title_zh_TW, summary_ja_JP, bullets_de_DE). See profile.example.yaml for the full list including locale-conditional personal fields (dob, gender, nationality, mil_service, photo_path, marital_status) — only rendered when the active locale's personal_fields includes them.Confirm config.yaml knobs.
scan.mode — full for all $HOME .git repos, whitelist to restrict to scan.roots (use if first run is slow).privacy.blocklist — project names to exclude from extractor output.privacy.abstract_tech — true to hide concrete tech names.render.locale — team default.render.all_locales_formats — formats per locale for --all-locales (default ["md"]).Run extractors → aggregate.
uv run vibe-resume extract
uv run vibe-resume status # sanity-check per-source counts
uv run vibe-resume aggregate # → data/cache/_project_groups.json
4a. (Default, uses subscription quota) Emit + session-driven enrich.
uv run vibe-resume enrich --locale <L>
# → writes data/enrich_jobs/<persona-or-default>/<L>/manifest.json
# + one *.prompt.md per project group
In the current Claude Code session:
data/enrich_jobs/<persona>/<L>/manifest.jsonstatus: pending entry, read its *.prompt.mdoutput_path (NNN_<name>.yaml)When all entries are done:
uv run vibe-resume enrich --ingest --locale <L>
# → merges *.yaml into _project_groups.<persona>.<L>.json
Add --level <key> to bias bullet ambition for the seniority bracket
(e.g. enrich --level senior --locale en_US).
Multi-locale runs are independent (per-locale subdir + per-locale cache):
uv run vibe-resume enrich --locale en_US
uv run vibe-resume enrich --locale zh_TW # does NOT overwrite en_US
# process both locales' yaml in session…
uv run vibe-resume enrich --ingest --locale en_US
uv run vibe-resume enrich --ingest --locale zh_TW
uv run vibe-resume render --locale en_US # reads _project_groups.default.en_US.json
uv run vibe-resume render --locale zh_TW # reads _project_groups.default.zh_TW.json
Pass --tailor <JD.txt> to bias bullets toward JD keywords (up to 12 extracted via
tech-priority dict + capitalised fallback — see
references/tailor-keyword-extraction.md
for the strategy and the 12-keyword cap rationale).
Stacks with --persona/--company per references/strategic-resume.md §Axis matrix.
See tests/fixtures/enrich_jobs_sample/ for a reference of what the
manifest + prompt + yaml triple looks like.
4b. (Fallback for CI / non-interactive) Spawn claude -p subprocess.
uv run vibe-resume enrich --mode subprocess --locale <L>
This bills against the Anthropic Agent SDK monthly quota pool (Pro $20 / Max 20x $200, separate from the Claude Code subscription quota — change effective 2026-06-15). The CLI prints a red warning at startup.
--mode rule-based skips LLM entirely and uses heuristic summaries
(works without any claude binary).
Render.
uv run vibe-resume render -f md --locale en_US
uv run vibe-resume render -f all --locale ja_JP # DOCX = JIS 履歴書 grid
uv run vibe-resume render --all-locales # fan out over 10 locales
uv run vibe-resume render --all-locales --tailor data/imports/jd.txt
Locale resolution chain (same chain applies to enrich):
--localeprofile.preferred_localeconfig.render.localeen_US fallbackReview & trend.
uv run vibe-resume review --jd data/imports/jd.txt # 8-point scorecard, graded A–F
uv run vibe-resume trend --locale ja_JP # ASCII sparkline across all prior runs
Bar is grade B / 80% before sending a draft to a real reviewer.
Self-mine the real signals, then iterate truthfully. Don't guess what to strengthen — disclose it:
uv run vibe-resume evidence --jd data/imports/jd.txt # what's REALLY there
uv run vibe-resume iterate --locale en_US # truth-preserving lift, stops honestly
evidence discloses, per group, the candidate metrics, backed terms,
human-gate evidence, and provenance the tool can actually see — so you (the
agent) surface only disclosed signals and never invent. iterate tightens the
page budget to lift the grade and reports the honest ceiling + human-applied
suggestions. The score is a proxy: never trade truthfulness or
human-in-the-loop for points — see docs/PRINCIPLES.md.
run --interactive / --preset)For a traceable human-in-the-loop run, run can pause at named gates instead of
going end-to-end. Arm a gate set, decide each gate's emitted *.gate.json, then
resume with --continue:
uv run vibe-resume run --preset full_review --locales en_US --tailor data/imports/jd.txt
# ⏸ pauses at the first armed gate, writing data/gates/<Gn>.gate.json
# edit that file's `decision` (set "choice"; G5 also takes a per-metric `pick`)
uv run vibe-resume run --continue --preset full_review --locales en_US # advances to the next gate
autopilot (no gates — same as no flags) · checkpoints (G1, G2, G8 — the default for a bare --interactive) · full_review (all of G1–G8).uv run vibe-resume gates show / gates plan show the armed set + each gate's recompute suffix. run --resume-from G5 re-runs only that gate's suffix and prints a review-diff. run --branch <Gn> forks an alternative decision (see Quick Reference).data/run_ledger.json so it is replayable; --gates G1,G5,G8 arms an explicit set overriding the preset.The full catalogue of failure modes and their fixes — mixed-script
locale leaks, --all-locales format quirk, first-run extraction
slowness, CJK contact-line wrapping, the claude -p optional fallback,
and the privacy rules around profile.yaml / data/imports/ — lives
in references/troubleshooting.md.
personas-compare requires --locale (the enriched cache split per-locale in 0.4.0); see CHANGELOG.explore and iterate only change layout/selection — they NEVER rewrite a bullet or invent a metric. jd-check --explain is advisory: it shows where a keyword could be grounded but never inserts it. G5 metrics are opt-in per-metric (confirm + pick), and a pick is always intersected with safe_to_surface, so a secret/UI/hash fragment can't be woven even if picked. See docs/PRINCIPLES.md.After a full run, confirm:
# 1. Render produced the expected files
ls data/resume_history/ | tail -n 10
# 2. Last review was ≥ B grade
uv run vibe-resume review --locale <L> | tail -n 5
# 3. Trend trending up
uv run vibe-resume trend --locale <L>
For a JD-tailored run, spot-check that the output bullets surface the JD's key nouns:
grep -iE "$(awk '/[A-Z][A-Za-z]{3,}/{print $1}' data/imports/jd.txt | head -5 | paste -sd '|' -)" data/resume_history/resume_v*_<L>.md
For multi-locale batch runs, make sure there's no cross-script leak:
# ja_JP render must not contain Traditional-only Chinese (e.g. 設計, 處理, 實作)
grep -cE "設計|處理|實作|業務" data/resume_history/resume_v*_ja_JP.md # expect 0 or very low
# zh_CN must not contain Traditional-only characters (e.g. 設, 實, 業)
grep -cE "設|實|業" data/resume_history/resume_v*_zh_CN.md # expect 0
# LLM pass per locale
for loc in en_US ja_JP de_DE zh_TW; do
uv run vibe-resume enrich --tailor data/imports/jd.txt --locale "$loc" -n 3
done
# Batch render
for loc in en_US ja_JP de_DE zh_TW; do
uv run vibe-resume render -f all --locale "$loc" --tailor data/imports/jd.txt
done
# Review each and show the trend
for loc in en_US ja_JP de_DE zh_TW; do
uv run vibe-resume review --locale "$loc"
done
uv run vibe-resume trend
--company <key> --level <key>enrich and review accept two extra axes — a named target employer
(70 bundled profiles in src/vibe_resume/core/profiles/*.yaml) and a seniority bracket
(6 career-level archetypes) — stacked on top of --locale /
--persona / --tailor. Block injection order is
tailor → persona → level → company. Every apply auto-checks
last_verified_at and warns loudly if older than 90 days.
See references/strategic-resume.md for
the full axis reference, company list/show/audit/verify/
mark-verified commands, and the drop-in recipe for adding a new
employer profile.
When the user asks to add a new extractor, locale, or persona, consult
references/extending.md for the Activity
schema contract, registration steps, and the "never invent activities"
rule.
uv run vibe-resume status — per-source activity countsuv run vibe-resume list-versions — résumé version history from internal gituv run vibe-resume diff v001 v002 — diff two versionsuv run vibe-resume completion zsh --install — shell completion so --locale <tab> expandsuv run vibe-resume doctor — diagnose CLI/plugin version drift, profile/config presence, optional-dep availabilityscripts/backup_claude_projects.sh (macOS/Linux) / scripts/backup_claude_projects.ps1 (Windows) — back up ~/.claude/projects before Claude Code's 30-day cleanupProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub easyvibecoding/vibe-resume --plugin vibe-resume