Skip to content

job-hunt

Sistema de búsqueda de trabajo como autónomo/freelance (España + EEUU + remoto).

Pipeline: perfil -> scraping de ofertas -> evaluación de fit -> generación de CV+carta (drafter-reviewer) -> verificación ATS -> tracking.

Inspirado en la arquitectura de MadsLorentzen/ai-job-search, adaptado al perfil real del usuario — no es un fork.

Ver CLAUDE.md para contexto completo y docs/adr/ para decisiones de arquitectura (especialmente docs/adr/0001-arquitectura-multi-perfil.md, base de todo lo de abajo).

  • bun — corre los scrapers (scrapers/*/cli).
  • Distro LaTeX con moderncv (MiKTeX o TeX Live) + lualatex en PATH — compila CV/carta. Instalación probada: winget install MiKTeX.MiKTeX, luego initexmf --set-config-value=\[MPM\]AutoInstall=1 para que instale paquetes faltantes sin prompt interactivo.
  • poppler (pdftotext) — usado por ats-check/check.ps1; si falta, el check degrada con aviso explícito, nunca finge un PASS.

Todo comando exige --profile=<name> como primer flag — sin excepciones, sin perfil por defecto (ver ADR-0001). Ejemplo con perfil amed:

Corre linkedin-search + freehire-search con los filtros derivados de profiles/amed/profile.md (stack, geografía, modalidad). Deduplica contra profiles/amed/seen_jobs.json y agrega solo lo nuevo (status: "new").

/scrape --profile=amed
/scrape --profile=amed --query="Kafka" # sobreescribe el query derivado

Puntúa las ofertas status: "new" contra fit-eval/EVALUATION.md (Gate 0 modalidad/geografía, Gate 1 idioma, 5 dimensiones ponderadas) usando agentes en paralelo por lotes de ~5. Actualiza seen_jobs.json de forma aditiva (status: "scored" o "expired") y presenta un shortlist.

/rank --profile=amed
/rank --profile=amed --top 5 # solo muestra los 5 mejores
/rank --profile=amed --all # re-rankea también lo ya puntuado

3. /apply --profile=amed --company="<empresa>"

Section titled “3. /apply --profile=amed --company="<empresa>"”

Flujo DRAFTER→REVIEWER→DRAFTER: redacta CV+carta a medida (fuente única: cv_master.tex + profile.md + voice.md), un agente revisor independiente audita fabricación, se corrige, se compila a PDF con lualatex, se verifica con ats-check/check.ps1 (obligatorio, no saltable), y se registra en tracking/applications.csv.

/apply --profile=amed --company="Empat"

Salida en profiles/amed/documents/applications/<empresa>_<rol>/ (cv/, cover_letters/, job_posting.md).

4. /outcome --profile=amed --company="<empresa>"

Section titled “4. /outcome --profile=amed --company="<empresa>"”

Registra qué pasó (entrevista, oferta, rechazo, etc.) en tracking/applications.csv y en outcome.md de la carpeta archivada. Modo seguimiento (máx. 2 follow-ups, solo borrador, nunca se envía solo):

/outcome --profile=amed --company="Empat"
/outcome --profile=amed followup

Cómo usar la herramienta con un perfil nuevo

Section titled “Cómo usar la herramienta con un perfil nuevo”
  1. Crear profiles/<nuevo>/ con:
    • profile.md — identidad, preferencias de búsqueda (modalidad, geografía, tarifa o TODO, idiomas tal cual, sin inflar), stack técnico, experiencia resumida. Fuente: CV real del candidato, nunca inventado.
    • voice.md — tono de escritura + rasgos conductuales, para la dimensión conductual de fit-eval y el tono de /apply//outcome.
    • cv_master.tex — CV completo en LaTeX (moderncv), fuente única de hechos de experiencia para /apply.
    • seen_jobs.json — inicializar como [].
    • documents/applications/ — carpeta vacía.
  2. Correr /scrape --profile=<nuevo> para el primer barrido de ofertas.
  3. Seguir el pipeline normal (/rank/apply/outcome).

Los scrapers y fit-eval/EVALUATION.md son agnósticos de perfil — no hace falta tocar código, solo la carpeta profiles/<nuevo>/ (ver ADR-0001).

profiles/<name>/ perfil aislado (profile.md, voice.md, cv_master.tex,
seen_jobs.json, documents/applications/)
scrapers/ linkedin-search, freehire-search (agnósticos de perfil)
fit-eval/ EVALUATION.md — framework de scoring
drafter-reviewer/ TEMPLATES.md + plantillas LaTeX (CV/carta)
ats-check/ CHECK.md + check.ps1
tracking/ applications.csv (central, columna profile) + SCHEMA.md
.claude/commands/ scrape.md, rank.md, apply.md, outcome.md
docs/adr/ decisiones de arquitectura