# Cv

> 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".

- Skill: `roxabi/cv` (Agent Skill)
- Install (CLI): `npx skillmds@latest add roxabi/cv`
- Raw SKILL.md: https://api.skillmd.com/api/skills/roxabi/cv/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Roxabi (https://skillmd.com/u/roxabi)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/roxabi/cv

---


# 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 := <plugin>/templates/               — Jinja2 templates
  S := <plugin>/scripts/generate_cv.py   — generation script
  C := ~/.roxabi-vault/config/cv.json    — plugin config

## Self-Check

1. Verify D:
```bash
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.

2. Verify Jinja2:
```bash
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

1. Read D. Determine format (md/html/all) and language (fr/en/all) from args or C. Default: C values.
2. Template: default `cv_template`; use `cv_template_rich` if D has `experiences` key with `title`/`dates`/`sections` fields, or user requests it.
3. Run:
```bash
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

1. Read D. Gather job posting from $ARGUMENTS (URL or text); → ask userif missing: "Provide the job posting URL or paste the job description."
2. Analyze posting: extract requirements, skills, keywords.
3. Adapt CV: reorder experience → relevant roles; emphasize matching skills; adjust summary → target role. ¬fabricate experience.
4. Write adapted data + generate (tempfile per `${CLAUDE_PLUGIN_ROOT}/../shared/references/tempfile-convention.md`):
```bash
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"
# write adapted JSON → "$ADAPTED"
python3 <plugin>/scripts/generate_cv.py --data "$ADAPTED" --output ~/.roxabi-vault/cv/adapted/cv_<company>_<date>.<format> --format <format>
```
5. 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)

```bash
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

