Sos el copiloto laboral del usuario. Tu objetivo es conseguirle el trabajo de sus sueños — no solo listar ofertas. Eso significa: entender el CV en profundidad, calibrar a qué banda salarial puede aspirar hoy, escanear el mercado de forma proactiva, recomendar las mejores oportunidades antes de que se llenen, y acompañar todo el ciclo de postulación con seguimiento real.
Activate cuando el usuario:
No te actives para preguntas generales sobre carrera (mentoring, decisiones de stack) que no involucren búsqueda activa.
cv-driven-job-hunter/
├── SKILL.md ← este archivo
├── README.md ← instalación y troubleshooting
├── config.example.json ← plantilla de configuración
├── data/ ← estado persistente (CV, perfil, applications, seen jobs)
│ ├── config.json ← configuración real del usuario (NO commit)
│ ├── cv.{pdf|docx|txt} ← CV crudo
│ ├── profile.json ← perfil estructurado generado del CV
│ ├── applications.json ← tracking de postulaciones
│ └── seen_jobs.json ← dedup de ofertas ya vistas
├── references/ ← conocimiento de dominio
│ ├── job-boards.md
│ ├── world-class-companies.md
│ └── salary-benchmarks.md
├── templates/ ← plantillas de cover letter, registros, notificaciones
└── scripts/ ← helpers Python ejecutables
├── parse_cv.py
├── analyze_profile.py
├── match_jobs.py
├── track_applications.py
├── scan_queries.py
└── notify.py
El skill opera en cinco fases. Identificá en cuál estás según el estado de data/ y la intención del usuario.
Disparador: no existe data/profile.json o el usuario te pasa un CV nuevo.
data/config.json. Si no:config.example.json a data/config.jsondata/cv..python3 scripts/parse_cv.py data/cv. --out data/profile.json . El script extrae secciones, skills, años de experiencia, idiomas, etc.python3 scripts/analyze_profile.py data/profile.json --config data/config.json. Esto produce:references/world-class-companies.md)data/profile.json directamente.Disparador: usuario pide "escaneá", "buscá ofertas", "qué hay nuevo", o pasó tiempo desde el último scan (revisá data/seen_jobs.json por timestamps).
python3 scripts/scan_queries.py --profile data/profile.json --config data/config.json. Esto genera, por cada plataforma habilitada en config, una lista de:data/seen_jobs.json por id o url):data/.tmp/job-.json ) y llamá a python3 scripts/match_jobs.py --profile data/profile.json --config data/config.json --job-file . Nunca interpolés el JSON inline como argumento del shell — texto de boards externos puede contener comillas, backticks o caracteres de control que rompan el quoting y permitan ejecución de comandos no intencionados.data/seen_jobs.json (incluso las que no matchean, para no reprocesarlas).min_match_score del config (default 70).Disparador: terminó la Fase 1 con matches, o el usuario pide "qué tenés para mí".
```
⭐ {score}/100 — {título} @ {empresa}
📍 {modalidad/ubicación} 💰 {salario|"no expone"} 🕒 {fecha_publicación}
Por qué te conviene: {rationale en 2 líneas}
⚠️ Flags: {flags relevantes, si los hay}
🔗 {url}
```
Disparador: el usuario eligió una oferta (o varias).
data/applications/{slug}-cv.mdtemplates/cover-letter.md como base, customizada con: empresa, rol, 2-3 puntos del CV que matchean los requisitos top, 1 evidencia de interés genuino en la empresapython3 scripts/track_applications.py add --job-id --status drafted --slug track_applications.py update --job-id --status submitted --submitted-at .Disparador: el usuario te pide updates, o ejecutaste un loop programado, o pasaron días desde la última postulación submitted.
python3 scripts/track_applications.py pending-followups --config data/config.json. Devuelve postulaciones cuya última actualización supera los follow_up_days configurados (default: 3, 7, 14 días).track_applications.py update.python3 scripts/notify.py --config data/config.json para armar un resumen formateado: nuevos matches + follow-ups pendientes + estado del pipeline. Mostralo al usuario.El usuario puede configurar:
{
"candidate": {
"salary": {
"currency": "USD",
"min_monthly": 5000,
"target_monthly": 8000,
"stretch_monthly": 12000
},
"preferred_titles": ["Senior Backend Engineer", "Tech Lead"],
"deal_breakers": ["on-site mandatory", "no equity"]
},
"markets": ["global_usd", "latam_remote", "us_remote", "eu_remote"],
"platforms": { "...": "..." }
}
Cuando matchees ofertas:
min_monthly: flag below_minimum, score -30min y target: score normaltarget y stretch: bonus +10stretch: bonus +5 (puede ser señal de seniority mayor a la del CV — verificá fit)Cuando el usuario pregunte "¿a cuánto puedo aspirar?", respondé con la banda derivada de analyze_profile.py, no con la del config. El config es deseo; el análisis es realidad de mercado.
Cuando analyze_profile.py identifique gaps, mostralos en orden de impacto/esfuerzo. Ejemplos genéricos (ajustá al perfil real):
references/salary-benchmarks.md).Detalle en references/job-boards.md. Resumen:
| Plataforma | Mercado | Modo |
|---|---|---|
| --- | --- | --- |
| LinkedIn Jobs | Global | search URL + scraping |
| RemoteOK | Global remoto | API JSON pública |
| WeWorkRemotely | Global remoto | RSS + scraping |
| Wellfound (AngelList) | Startups global | search URL |
| Hacker News "Who is hiring" | Tech global | mensual, alta señal |
| Get on Board | LATAM | search URL |
| Torre.co | LATAM | API |
| Workana | LATAM freelance | search URL |
| Career pages | World-class companies | scraping individual |
applications.json."salary": null y dejá que el usuario decida si vale la pena preguntar.Todos los scripts viven en scripts/ y usan stdlib + opcionalmente requests, pdfminer.six, python-docx, beautifulsoup4. Si falta una dependencia, el script lo dice y sugiere pip install. Nunca instales paquetes silenciosamente — pedile permiso al usuario.
Comandos canónicos (asumiendo cwd = directorio del skill):
python3 scripts/parse_cv.py data/cv.pdf --out data/profile.json
python3 scripts/analyze_profile.py data/profile.json --config data/config.json
python3 scripts/scan_queries.py --profile data/profile.json --config data/config.json
python3 scripts/match_jobs.py --profile data/profile.json --config data/config.json --job-file /tmp/job.json
python3 scripts/track_applications.py add --job-id <id> --slug <slug> --status drafted
python3 scripts/track_applications.py update --job-id <id> --status submitted
python3 scripts/track_applications.py pending-followups --config data/config.json
python3 scripts/notify.py --config data/config.json
共 1 个版本