بنقرة واحدة
generate-cv
Build ATS-safe CV and cover letter PDFs tailored to a specific role using reportlab Platypus
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Build ATS-safe CV and cover letter PDFs tailored to a specific role using reportlab Platypus
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Fill an ATS form via browser automation, upload PDFs, answer safe required fields, then hand off for sensitive, consent, attestation, legal, and Submit controls (unless yolo mode is authorised — see the yolo submission section below)
Scaffold a role config by fetching and analysing a job posting, detecting the ATS platform, and pre-filling roles/<role_id>.json
Build profile.json from your CV or LinkedIn PDF by extracting work history, generating 3 CV variants, and writing per-job bullets automatically
View and update your job application pipeline; log statuses and add notes across all active roles
Discover role leads, verify open roles on official posts, and rank verified matches with heuristic sponsorship and relocation confidence
| name | generate-cv |
| description | Build ATS-safe CV and cover letter PDFs tailored to a specific role using reportlab Platypus |
Generate an ATS-safe CV + cover letter PDF pair for a specific role, then run deterministic quality gates before the user reviews or applies.
User says: /generate-cv, generate my CV for, build my CV, create CV for, make my resume for
In Codex, invoke this skill with $generate-cv, the skills/plugin selector, or natural language. Slash-command examples are Claude Code aliases, not Codex built-ins.
/generate-cv <role_id>
role_id: matches a filename under roles/<role_id>.json. If not provided, list available role IDs from the roles/ directory and ask the user to pick one.
openness (optional) — banner line shown under the headline. Overrides profile.openness. Omit the key entirely to inherit the profile-level default; set to "" to suppress the banner for this role.additional_experience (optional) — list of one-line summaries for older/minor roles. Rendered as a single condensed line prefixed Earlier experience: and joined by · to preserve page budget. Set to [] to suppress the line for this specific role even when profile.additional_experience has entries; omit the key entirely to inherit the profile list.location_strategy (optional) — per-context location rendering override resolved by src/location_strategy.py::resolve_location. Applies to the CV contact line, cover-letter contact line, ATS location field, availability banner (renders in the openness slot when set), and relocation statement (renders as an extra line under the availability banner when set). Falls through to profile.location_strategy_defaults and then to legacy profile.location / profile.openness. See profile.example.json and roles.example/example_role.json for the supported strategy values.Read profile.json. If it does not exist, tell the user to copy profile.example.json to profile.json and fill in their details. Stop.
Read roles/<role_id>.json. If it does not exist, tell the user to create it (or run /new-role) and stop.
The role config's variant field is A, B, or C. A targets AI/LLM/Evaluation, B targets Data Platform/Pipelines, and C targets Senior Backend/APIs.
The selected variant pulls headline and summary from profile.variants.<variant> (only if the role config does not already set those keys) and drives per-job bullet selection.
For each job in profile.experience, check if the role config has experience_overrides for that job ID. If yes, use those bullets. If no, use the variant-specific bullets from profile.experience[i].bullets[variant]. Fall back to default if the variant key is missing.
Use only facts present in profile.json, the role config, or explicit user-provided context. Do not invent achievements, metrics, employers, dates, eligibility claims, technologies, or public links.
If evidence is missing, omit the claim or flag it for review. Generated CVs and cover letters are review-ready drafts, not guarantees of recruiter or ATS interpretation.
Resolve <career_agent_root> as the installed package or plugin root that contains src/generate_application.py. If running from a repo checkout and src/generate_application.py exists in the current directory, the current directory is <career_agent_root>.
Do not assume the user's working directory is the package root. The script path comes from <career_agent_root>, while profile.json, roles/, and generated/ are read and written in the user's current workspace.
Run:
python3 "<career_agent_root>/src/generate_application.py" --role <role_id>
The script reads profile.json + roles/<role_id>.json and writes:
generated/<output_prefix>_CV.pdf
generated/<output_prefix>_CoverLetter.pdf
If the packaged script cannot be found, stop and report that the career-agent package or plugin installation is incomplete.
Engine: reportlab Platypus
Layout: single column, no tables, no images
Font: Helvetica (body 10pt, headings 12pt bold, name 16pt bold)
Colours: black body text, #2563eb for links
Links: clickable: email, LinkedIn, GitHub, blog/website
ATS-safe rules:
Structure order:
Earlier experience: Role @ Company · Role @ Company)open_source experience entries with role.projects)profile.certifications)Cover letter structure:
role.cover_letter.paragraphsrole.cover_letter.closingThe generator runs deterministic quality gates after writing the PDFs.
Hard failures stop the command unless --no-quality-gates is used for diagnostics:
Warnings do not block generation, but must be surfaced for review:
location_consistency warnings (warning-only, never block) surface configured stories that look contradictory. Sourced from src/location_strategy.py::collect_location_warnings:
cv_contact resolves to remote_label but role_config["location"] names a specific citygenerated_role_specific but the corresponding role field is missingcustom:<key> but profile.location_presentations.custom.<key> is not definedprofile["location"] and profile["location_facts"]["current_residence"] disagreeAfter generation, report:
CV: generated/<prefix>_CV.pdf
Cover letter: generated/<prefix>_CoverLetter.pdf
Variant: <A|B|C>: <label>
Role: <title> @ <company>
Quality gates: PASS/WARN/FAIL summary
Ask: "Ready to apply? Use /apply <role_id> in Claude Code or $apply <role_id> in Codex. Codex Chrome /apply remains experimental until the verification matrix has non-submitted evidence for the target ATS case."
profile.json missing → stop, instruct user to create itroles/<role_id>.json missing → stop, instruct user to create it, run /new-role in Claude Code, or invoke $new-role in Codexreportlab not installed → pip install reportlab --break-system-packagespypdf not installed → pip install -r requirements.txtgenerated/ directory missing → create it