| name | cv |
| description | Generate, adapt, and update CVs from structured data stored in cv_data.json. Triggers: "cv" | "generate cv" | "generate my cv" | "adapt cv" | "update cv" | "tailor cv" | "make my resume" | "update my resume" | "write my cv" | "adapt my resume for" | "tailor my cv for". |
| version | 0.1.0 |
| allowed-tools | Read, Edit, Write, Bash, Glob, Grep |
CV
Generate professional CVs from structured data. Adapt them for specific job postings. Update the master data file.
Let:
V := ~/.roxabi-vault/cv/ — plugin data root
D := V/cv_data.json — master CV data
G := V/generated/ — generated CVs
A := V/adapted/ — job-adapted CVs
T := /templates/ — Jinja2 templates
S := /scripts/generate_cv.py — generation script
C := ~/.roxabi-vault/config/cv.json — plugin config
Self-Check
- Verify D:
test -f ~/.roxabi-vault/cv/cv_data.json && echo "OK" || echo "MISSING"
¬D → "No cv_data.json found. Run /cv-init to set up the CV plugin." Halt.
- Verify Jinja2:
python3 -c "import jinja2" 2>/dev/null && echo "OK" || echo "MISSING"
¬jinja2 → "Jinja2 is required. Install with: pip install jinja2". Halt.
Phase 1 — Determine Intent
Parse $ARGUMENTS:
| Intent | Signal | Action |
|---|
| Generate | "generate", "create", "build", no args | Generate CV from D |
| Adapt | "adapt", "tailor", "for [job]", URL or job description | Adapt CV for role |
| Update | "update", "add", "change", "edit" | Modify D |
Ambiguous → present choice Generate | Adapt | Update
Phase 2 — Generate
- Read D. Determine format (md/html/all) and language (fr/en/all) from args or C. Default: C values.
- Template: default
cv_template; use cv_template_rich if D has experiences key with title/dates/sections fields, or user requests it.
- Run:
python3 <plugin>/scripts/generate_cv.py --data ~/.roxabi-vault/cv/cv_data.json --lang <lang> --format <format> [--template cv_template_rich]
--lang all → one file per language (cv_fr.md, cv_en.md); --lang fr → cv.md (no suffix). --format all → md + html. Both experience/experiences keys accepted (aliased). Report output path(s).
Phase 3 — Adapt
- Read D. Gather job posting from $ARGUMENTS (URL or text); → ask userif missing: "Provide the job posting URL or paste the job description."
- Analyze posting: extract requirements, skills, keywords.
- Adapt CV: reorder experience → relevant roles; emphasize matching skills; adjust summary → target role. ¬fabricate experience.
- Write adapted data + generate (tempfile per
${CLAUDE_PLUGIN_ROOT}/../shared/references/tempfile-convention.md):
COMPANY_SAFE=$(echo "$COMPANY" | tr -c '[:alnum:]-' '-' | head -c 40)
TMPDIR=$(mktemp -d -t "cv-adapt-${COMPANY_SAFE}-XXXXXX")
trap 'rm -rf "$TMPDIR"' EXIT
ADAPTED="$TMPDIR/adapted.json"
python3 <plugin>/scripts/generate_cv.py --data "$ADAPTED" --output ~/.roxabi-vault/cv/adapted/cv_<company>_<date>.<format> --format <format>
- Report changes + output path.
Phase 4 — Update
Read D → present structure → present choice Experience | Skills | Education | Personal info → apply changes → validate JSON.
Vault Integration (Optional)
test -f ~/.roxabi-vault/vault.db && echo "VAULT_AVAILABLE" || echo "NO_VAULT"
VAULT_AVAILABLE → after generate/adapt: index output file with category=cv + type tag.
$ARGUMENTS