https://lflucasferreira.github.io/curriculum/
https://my-cv-8vzv.vercel.app/
npm install
npm run dev
Abrir http://localhost:3000
Os CVs usam JSON + refs compartilhados resolvidos por loadCvLocale() em src/lib/cv-locale.ts e renderizados por src/components/cv/cv-template.tsx.
career/professional-profile.md # fact base canônica
career/
├── pipeline.md # tracker de status de todas as candidaturas
├── applications/ # dossiers + PDFs finais por vaga ({empresa}-{cargo}/, cada uma com jd-raw.md = JD original arquivado)
├── companies/ # cache de pesquisa por empresa
├── people/ # cache de pesquisa LinkedIn por participante de entrevista, agrupado por empresa
│ ├── people.md # índice tipo shortlist, uma seção por empresa
│ └── {empresa}/ # ex.: mv/, cesar/, avanade/
├── interview/ # prep de entrevista
│ └── questions-answers/ # Q&A por role/tema
├── linkedin/ # drafts de posts
│ └── posts/
└── shortlist/ # triagem de vagas
└── notes/
jobs/sources/ # catálogos markdown dos scrapers
partner/yane/ # fontes do parceiro (rotas em src/app/yane*)
research/ # imigração, coda, mbti raw
scripts/{cv,jobs,content}/
src/data/
├── cv/ # currículo (única fonte de verdade do CV)
│ ├── sections/ # contact, work, skills, education, languages, projects
│ ├── locales/ # meta, config e overrides por idioma
│ ├── labels/ # rótulos da UI por idioma
│ ├── abbr/ # glossário de siglas
│ ├── variants/ # patches por candidatura (_template.json = base pra novas vagas)
│ └── schema/
├── covers/ # dados das cartas de apresentação
└── interview/ # Q&A de entrevista + chunks (site)
└── chunks/
| Rota | Locale / variante |
|---|---|
/cv |
seletor de idioma |
/en, /pt, /fr, /es, /de |
CV por idioma |
/gft |
EN + variante gft |
/en-deloitte |
EN + variante deloitte |
src/data/cv/ (locale + refs).CvTemplate (summary, bullets, skills, etc.). Overrides ficam em localStorage por rota.src/data/cv/variants/_template.json como referência (shape canônico de todo campo de override; apague os blocos placeholder que a vaga não precisar).src/data/cv/variants/en-{empresa}.json com patches (content, work, skills, …).src/lib/cv-locale.ts.src/app/{empresa}/page.tsx chamando loadCvLocale("en", "{empresa}").src/app/cvs/page.tsx se quiser no hub de candidaturas.| Comando | Descrição |
|---|---|
npm run cv:validate |
Valida JSON (ids, abbrKeys, languageOrder) |
npm run cv:export |
Exporta JSON flat ATS em exports/cv-json/ |
npm run build |
Roda cv:validate antes do next build |
Instruções em .claude/skills/*/SKILL.md, espelhadas automaticamente (via npm run skills:sync) para .agents/, .cursor/, .antigravitycli/, .kimi/ e .qwen/, então funcionam igual em qualquer CLI de agente, não só no Claude Code. Ordem abaixo segue o fluxo real de uma candidatura, da descoberta da vaga até o ensaio de entrevista.
| Skill | O que faz |
|---|---|
scrape |
Roda o scraper multi-plataforma (scripts/jobs/scrape-jobs.mts) contra as empresas já catalogadas em src/data/jobs/ (Greenhouse, Quickin, Lever, GeekHunter, custom, Ashby, InHire, Workable, Gupy), filtra por vagas de QA Sênior+/Especialista/Staff/Líder e reporta um resumo. Só descobre, não avalia nenhuma vaga. |
scout |
Mesmo scraper do scrape, filtra geografia (BR remoto/Recife-PE ou CA/US), rankeia por aderência heurística ao perfil (título/empresa/local vs career/professional-profile.md, bandas A/B/C, não é ATS %), apresenta a lista ordenada e pergunta quais avaliar com audit. Nunca avalia tudo sozinho, Lucas sempre escolhe as candidatas. |
audit |
Avalia uma vaga específica (link ou texto colado) contra o CV base como um ATS faria: rating inicial, caminho até 90-95% de match, red flags, checagem de referral e overqualification. Só avalia, nunca cria CV/PDF/dossiê nem mexe em git. |
tailor |
Cria o CV tailorizado (variant JSON + PDF de 1 página), a rota do site e o dossiê da candidatura pra uma vaga já avaliada pelo audit. Só roda quando Lucas pede explicitamente pra aplicar. |
interview |
Aprofunda a preparação de entrevista de um dossiê já existente: gap analysis, pesquisa sobre a empresa, perfis dos participantes confirmados (via interviewer-profile), perguntas prováveis, prática STARL e perguntas pra fazer, além dos Cinco Pilares de RH, cheat sheet e checklist. Exige que tailor já tenha rodado antes. |
interviewer-profile |
Pesquisa no LinkedIn cada participante já confirmado por nome numa entrevista (gestor, entrevistador técnico, painel, ou recrutador que conduz a chamada): About, histórico completo de experiência, educação, certificações, skills, recomendações, honras, e uma leitura analítica de prováveis tópicos de conversa. Escreve um cache durável em career/people/{empresa}/{nome-slug}.md (agrupado por empresa) mais um resumo compacto no dossiê, e mantém o índice career/people/people.md atualizado. Roda automaticamente dentro de interview, ou sozinha quando um novo nome é confirmado depois. Nunca chuta quem seria um entrevistador sem nome confirmado. |
mock-interview |
Simulação de entrevista ao vivo, uma pergunta de cada vez, com respostas reais digitadas por Lucas e avaliação de cada resposta antes da próxima pergunta. Diferente de escrever um banco de perguntas pronto (isso é career/interview/questions-answers/*.md, não uma skill). |
linkedin-match-review |
Compara o perfil atual do LinkedIn (headline, About, bullets de experiência) contra uma ou mais vagas específicas, pra checar se a história contada bate com o que as vagas pedem. |
Detalhes de cada uma (regras, formato de dossiê, convenções) ficam no próprio SKILL.md, este README só resume o que cada uma faz.
| Rota | Descrição |
|---|---|
/cover-letter |
Genérica PT |
/cover-letter-en, -fr, -es |
Por idioma |
/cover-template |
Template editável (logo + empresa + vaga + parágrafos) |
/cover-alternative |
Layout alternativo |
/ilia-cover, /stackadapt-cover |
Candidaturas específicas |
/covers |
Hub interno |
/cover-template)letter se os parágrafos foram alterados).Guia detalhado: src/app/cover-template/README.md
| Arquivo | Descrição |
|---|---|
docs/SCRIPTS.md |
Referência de todo script em scripts/, comando npm ou não |
Push para main dispara o GitHub Actions (GitHub Pages) e o Vercel automaticamente.