curriculum

Scripts Reference

npm commands

Command Script Purpose
npm run dev scripts/jobs/copy-applications.mjs + next dev Local dev server (mirrors career/applications/ into public/ first)
npm run build copy-applications.mjs + cv:validate + ci-exclude-jobs.mjs + next build Production build pipeline
npm run start next start Serve the production build
npm run lint next lint Next.js lint
npm run cv:validate scripts/cv/cv-validate.mjs Validate CV data (src/data/cv/) against schema/
npm run cv:export scripts/cv/cv-export-ats.mjs Export flat ATS-readable JSON to exports/cv-json/
npm run apps:copy scripts/jobs/copy-applications.mjs Mirror career/applications/ into public/applications/ (run manually if you skip dev/build)
npm run scrape-jobs scripts/jobs/scrape-jobs.mts Standalone crawler run (same crawlers behind /jobs), writes to jobs/found/
npm run skills:sync scripts/skills-sync.mjs Mirror .claude/skills/ into .agents/, .cursor/, .antigravitycli/, .kimi/, .qwen/

Not wired to npm (run with node/python3 directly)

Script Purpose
scripts/cv/cv-lib.mjs Shared JSON loader/merger used by cv-validate.mjs and cv-export-ats.mjs, not runnable on its own
scripts/cv/export-cv-pdf.mjs Print a CV route to PDF via headless Chrome (node export-cv-pdf.mjs {route} {out-name}, defaults to gft)
scripts/cv/export-gft-pdf.mjs Same as above, hardcoded to the /gft route only — likely superseded by export-cv-pdf.mjs, kept for now, not confirmed dead
scripts/cv/verify-pdf-text.py ATS text-layer gate for a generated PDF ((cid:N) glyph garbage, dash characters, reading order); required by tailor Step 4 before delivering any PDF
scripts/jobs/ci-exclude-jobs.mjs Removes the /jobs dashboard’s dynamic route handlers before a static GitHub Pages export (CI-only, no-ops outside GITHUB_ACTIONS=true)
scripts/jobs/_gen_geekhunter_companies.py Regenerates vagas-fontes-crawler-geekhunter.md + src/data/jobs/geekhunter-companies.ts from the public GeekHunter sitemap

Content generators (scripts/content/)

One-off Python scripts that produced the interview Q&A bank now living in career/interview/questions-answers/ (Appium, k6, Playwright, pytest, REST Assured, Selenium, per-language variants) plus audio-summary generation (gen-audio-{en,es,fr}.py). Historical/one-time-use, not part of any regular workflow; re-run only if regenerating that content from scratch.