|
| 1 | +--- |
| 2 | +name: cvx |
| 3 | +description: Create, validate, and render professional CV/resume PDFs from plain YAML using CVX — fully local, no accounts. Use when the user wants to write a CV or resume, convert an existing CV to a maintained format, tailor a CV for a job application, or produce an ATS-safe variant. Covers the cv-content/ YAML schema, the edit→validate→build loop, themes, layouts, and ATS keywords. |
| 4 | +license: Apache-2.0 |
| 5 | +compatibility: Requires Node.js 20+ (runs via npx, no install). MCP server available via `npx @hrtips/cvx mcp`. |
| 6 | +metadata: |
| 7 | + author: hrtips |
| 8 | + homepage: https://github.com/hrtips/cvx |
| 9 | +--- |
| 10 | + |
| 11 | +# CVX — structured input, professional output |
| 12 | + |
| 13 | +CVX renders a folder of plain YAML files (`cv-content/`) into a pixel-perfect CV PDF. Everything runs locally: no accounts, no network calls, and the user's data never leaves their machine. The YAML is the durable asset — the user keeps and re-edits it for every future application. |
| 14 | + |
| 15 | +## The loop |
| 16 | + |
| 17 | +If the CVX MCP server is connected, use its tools: `get_schema` → `init_cv` → edit YAML → `validate_cv` → `build_pdf` (pass the workspace folder as `dir`, absolute path). Otherwise use the CLI: |
| 18 | + |
| 19 | +```bash |
| 20 | +npx @hrtips/cvx init # scaffold cv-content/ with a complete example CV |
| 21 | +npx @hrtips/cvx validate --strict --json # every problem at once: file + field paths + fixes |
| 22 | +npx @hrtips/cvx build --json # writes <name>.pdf; add --ats for the ATS-safe variant |
| 23 | +npx @hrtips/cvx list --json # available themes and layouts |
| 24 | +``` |
| 25 | + |
| 26 | +Exit codes: `0` ok · `2` validation failed · `3` render failed · `64` usage error. With `--json`, stdout is exactly one JSON object; logs go to stderr. |
| 27 | + |
| 28 | +Always validate after every edit and before every build. Findings include the file, the field path, and a suggested fix — apply the fix and re-validate. |
| 29 | + |
| 30 | +## Rules that are not optional |
| 31 | + |
| 32 | +1. **Never invent facts.** Every entry must be truthful to the user's real history. This matters most for `keywords.yaml`: ATS parsers cross-check keywords against the CV body, and stuffing false terms gets CVs auto-rejected. |
| 33 | +2. **Don't rename the YAML files.** Sections are discovered by filename: `personal.yaml`, `summary.yaml`, `experience.yaml`, `education.yaml`, `competencies.yaml`, `achievements.yaml`, `referees.yaml`, `keywords.yaml`, `config.yaml`. |
| 34 | +3. **Quote strings containing colons** (`"Director: Operations"`). Date ranges are free text (`2019 – Present`). |
| 35 | +4. The photo goes at `cv-content/images/profile.jpg` (or `.jpeg`/`.png`/`.webp`) — ask the user for it; it cannot be generated. |
| 36 | + |
| 37 | +## Content files (summary — the schema is authoritative) |
| 38 | + |
| 39 | +Every scaffolded file carries a `$schema` header; the canonical JSON Schema lives at `schema/v1/` in the repo and is returned by the MCP `get_schema` tool. |
| 40 | + |
| 41 | +- `personal.yaml` (object): `name` (required — drives the output filename), `title`, `company`, `phone`+`phoneHref`, `email`, `linkedin`+`linkedinHref`, `facebook`+`facebookHref`, `location`. |
| 42 | +- `summary.yaml`: list of 3–6 single-sentence bullets. A bullet may also be `{text, link: {href, label}, suffix}` to embed a clickable link (same form works in experience bullets). |
| 43 | +- `experience.yaml`: list of roles, most recent first — `role` (required), `company`, `period`, `location`, `description`, `progression` (list of `{title, period}`), `bullets` (verb-first, quantified, truthful). |
| 44 | +- `education.yaml`: list of `{degree, institution, period}`. |
| 45 | +- `competencies.yaml`: 6–12 short skill strings. |
| 46 | +- `achievements.yaml`: list of `{year, text}` — `year` is the bold headline (often the award name), `text` the attribution. |
| 47 | +- `referees.yaml`: list of `{name, title, company, email, phone}`, or `[]` for "available upon request". |
| 48 | +- `keywords.yaml` (optional): extra truthful ATS keywords not already covered by competencies/titles; embedded in PDF metadata, never printed. |
| 49 | +- `config.yaml`: `schemaVersion: 1`, `theme` (`teal`|`coral`|`mono`), `layout` (`two-column`|`single-column`|custom filename); pagination keys only if page 1 overflows. |
| 50 | + |
| 51 | +## Variants |
| 52 | + |
| 53 | +- Designed CV: `build` → two-column, photo sidebar, theme colours. |
| 54 | +- Job-portal upload: `build --ats` (or `build_pdf` with `ats: true`) → single column, no colours, machine-friendly, `<name>-ats.pdf`. |
| 55 | + |
| 56 | +## When validation fails |
| 57 | + |
| 58 | +Report the findings to the user in plain language, apply the suggested fixes to the YAML, and re-validate. Unknown keys are typos more often than not — the findings include a "did you mean" suggestion. Do not build until validation passes. |
0 commit comments