claude-code-arcane 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/README.md +3 -3
- package/dist/cli.js +2 -0
- package/docs/SKILLS-CATALOG.md +6 -2
- package/docs/USER-GUIDE.md +1 -1
- package/docs/coding-standards.md +26 -0
- package/package.json +2 -1
- package/profiles/job-hunt.yaml +12 -2
- package/rules/drafter-reviewer.md +39 -0
- package/skills/cold-outreach/SKILL.md +10 -10
- package/skills/cold-outreach/references/recruiter-playbook.md +5 -5
- package/skills/cover-letter/SKILL.md +8 -8
- package/skills/cv-ats-export/SKILL.md +19 -6
- package/skills/cv-ats-export/scripts/cv_export.py +49 -4
- package/skills/cv-ats-export/scripts/verify_pdf.py +90 -0
- package/skills/cv-tailor/SKILL.md +7 -7
- package/skills/cv-tailor/references/ats-keywords.md +9 -9
- package/skills/interview-prep/SKILL.md +7 -7
- package/skills/interview-prep/references/star-framework.md +10 -10
- package/skills/job-aplicar/SKILL.md +88 -0
- package/skills/job-hunt/SKILL.md +20 -13
- package/skills/job-hunt/references/templates/Aplicacion.md +6 -2
- package/skills/job-hunt/references/templates/CV Custom.md +1 -1
- package/skills/job-hunt/references/templates/Contacto.md +1 -1
- package/skills/job-hunt/references/templates/Dashboard.md +19 -15
- package/skills/job-hunt/references/templates/Perfil.md +2 -2
- package/skills/job-outcome/SKILL.md +55 -0
- package/skills/job-scrape/SKILL.md +95 -0
- package/skills/job-scrape/references/dedup-playbook.md +25 -0
- package/skills/job-scrape/references/getonbrd-cli.md +62 -0
- package/skills/job-scrape/references/getonbrd-urls.md +37 -0
- package/skills/job-scrape/references/linkedin-cli.md +64 -0
- package/skills/job-scrape/references/linkedin-urls.md +42 -0
- package/skills/job-scrape/references/seen_jobs.schema.json +68 -0
- package/skills/job-scrape/scripts/getonbrd_search.py +501 -0
- package/skills/job-scrape/scripts/linkedin_search.py +428 -0
- package/skills/job-search/SKILL.md +22 -19
- package/skills/job-search/references/scoring-rubric.md +8 -8
- package/skills/job-upskill/SKILL.md +58 -0
- package/skills/linkedin-optimize/SKILL.md +5 -5
- package/skills/master-profile/SKILL.md +17 -17
- package/skills/network-map/SKILL.md +7 -7
- package/skills/personal-brand/SKILL.md +10 -10
- package/skills/personal-brand/references/post-pillars.md +14 -14
- package/skills/portfolio-site/SKILL.md +11 -11
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""
|
|
2
|
+
verify_pdf.py — Verify that an exported PDF is ATS-compliant.
|
|
3
|
+
|
|
4
|
+
Checks that the PDF has an extractable text layer (not an image), the
|
|
5
|
+
expected page count, and that given strings (name, email) survived the
|
|
6
|
+
export. Adapted from tools/verify_pdf.py of MadsLorentzen/ai-job-search,
|
|
7
|
+
replacing poppler (pdftotext/pdfinfo) with pypdf so it runs on Windows
|
|
8
|
+
without external binaries.
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
python verify_pdf.py <pdf> [--pages N] [--max-pages N] [--min-chars N]
|
|
12
|
+
[--contains TEXT ...]
|
|
13
|
+
|
|
14
|
+
Example:
|
|
15
|
+
python verify_pdf.py "career-workspace/02-CVs/exports/Backend.pdf" \
|
|
16
|
+
--min-chars 200 --contains "Jane Doe"
|
|
17
|
+
|
|
18
|
+
Exit code 0 if all checks pass, 1 if any check fails, 2 if pypdf is missing.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def extract_text(pdf_path):
|
|
27
|
+
"""Return (page_count, normalized_text) of the PDF."""
|
|
28
|
+
from pypdf import PdfReader
|
|
29
|
+
|
|
30
|
+
reader = PdfReader(str(pdf_path))
|
|
31
|
+
text = "\n".join(page.extract_text() or "" for page in reader.pages)
|
|
32
|
+
return len(reader.pages), " ".join(text.split())
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def verify(pdf_path, pages=None, min_chars=1, contains=(), max_pages=None):
|
|
36
|
+
"""Return a list of problems (empty = PDF OK). Raises ImportError without pypdf."""
|
|
37
|
+
pdf_path = Path(pdf_path)
|
|
38
|
+
if not pdf_path.exists():
|
|
39
|
+
return [f"does not exist: {pdf_path}"]
|
|
40
|
+
|
|
41
|
+
n_pages, text = extract_text(pdf_path)
|
|
42
|
+
problems = []
|
|
43
|
+
|
|
44
|
+
if pages is not None and n_pages != pages:
|
|
45
|
+
problems.append(f"has {n_pages} pages (expected {pages})")
|
|
46
|
+
if max_pages is not None and n_pages > max_pages:
|
|
47
|
+
problems.append(f"has {n_pages} pages (ideally 1-{max_pages} for a CV)")
|
|
48
|
+
if len(text) < min_chars:
|
|
49
|
+
problems.append(
|
|
50
|
+
f"text layer has {len(text)} extractable chars (minimum {min_chars}); "
|
|
51
|
+
"likely an image-only PDF that an ATS cannot read"
|
|
52
|
+
)
|
|
53
|
+
for needle in contains:
|
|
54
|
+
if " ".join(needle.split()).lower() not in text.lower():
|
|
55
|
+
problems.append(f'missing required text: "{needle}"')
|
|
56
|
+
|
|
57
|
+
return problems
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def main():
|
|
61
|
+
ap = argparse.ArgumentParser(description="Verify the ATS text layer of a PDF.")
|
|
62
|
+
ap.add_argument("pdf", help="path to the PDF")
|
|
63
|
+
ap.add_argument("--pages", type=int, default=None, help="expected page count")
|
|
64
|
+
ap.add_argument("--min-chars", type=int, default=1, help="minimum extractable chars")
|
|
65
|
+
ap.add_argument("--max-pages", type=int, default=None, help="warn above N pages")
|
|
66
|
+
ap.add_argument(
|
|
67
|
+
"--contains", action="append", default=[], metavar="TEXT",
|
|
68
|
+
help="string that must appear in the text (repeatable)",
|
|
69
|
+
)
|
|
70
|
+
args = ap.parse_args()
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
problems = verify(
|
|
74
|
+
args.pdf, args.pages, args.min_chars, args.contains, args.max_pages
|
|
75
|
+
)
|
|
76
|
+
except ImportError:
|
|
77
|
+
print("[ERROR] pypdf is missing. Install with: pip install pypdf")
|
|
78
|
+
sys.exit(2)
|
|
79
|
+
|
|
80
|
+
name = Path(args.pdf).name
|
|
81
|
+
if problems:
|
|
82
|
+
for p in problems:
|
|
83
|
+
print(f"[FAIL] {name}: {p}")
|
|
84
|
+
sys.exit(1)
|
|
85
|
+
print(f"[OK] {name}: ATS text layer verified")
|
|
86
|
+
sys.exit(0)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
if __name__ == "__main__":
|
|
90
|
+
main()
|
|
@@ -7,9 +7,9 @@ user-invocable: true
|
|
|
7
7
|
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# CV Tailor
|
|
10
|
+
# CV Tailor - Adaptar el CV a la oferta
|
|
11
11
|
|
|
12
|
-
Tomás un job description y el perfil base del usuario, y producís un **CV custom** que matchea con los filtros automáticos (ATS) y con la lectura humana del hiring manager. No reescribís la verdad
|
|
12
|
+
Tomás un job description y el perfil base del usuario, y producís un **CV custom** que matchea con los filtros automáticos (ATS) y con la lectura humana del hiring manager. No reescribís la verdad - la reorganizás y la traducís al vocabulario de la oferta.
|
|
13
13
|
|
|
14
14
|
## Inputs
|
|
15
15
|
|
|
@@ -20,7 +20,7 @@ Tomás un job description y el perfil base del usuario, y producís un **CV cust
|
|
|
20
20
|
## Proceso
|
|
21
21
|
|
|
22
22
|
### 1. Analizar la oferta
|
|
23
|
-
- Extraer **keywords literales** del JD: tecnologías, metodologías, responsabilidades, soft skills, seniority. Literal importa
|
|
23
|
+
- Extraer **keywords literales** del JD: tecnologías, metodologías, responsabilidades, soft skills, seniority. Literal importa - el ATS hace matching de strings (ej: si piden "React.js" no asumas que "React" matchea igual).
|
|
24
24
|
- Detectar **must-have vs nice-to-have**.
|
|
25
25
|
- Detectar **señales de cultura / ángulo** (startup vs enterprise, code-forward, ownership, etc.).
|
|
26
26
|
- Ver `references/ats-keywords.md` para cómo extraer y mapear keywords.
|
|
@@ -38,17 +38,17 @@ Tomás un job description y el perfil base del usuario, y producís un **CV cust
|
|
|
38
38
|
### 4. Score before/after
|
|
39
39
|
- Calcular un **match rate** aproximado: % de keywords/requisitos del JD presentes en el CV, **antes** vs **después** del tailoring.
|
|
40
40
|
- Reportar el delta ("match 48% → 81%") y qué keywords se cubrieron.
|
|
41
|
-
- **Flag de keyword stuffing:** marcar cualquier inserción que a un revisor humano le suene forzada o poco natural
|
|
41
|
+
- **Flag de keyword stuffing:** marcar cualquier inserción que a un revisor humano le suene forzada o poco natural - el objetivo es pasar el ATS *y* leer bien para una persona.
|
|
42
42
|
|
|
43
43
|
### 5. Producir el CV custom
|
|
44
44
|
- Crear/actualizar la nota en `02-CVs/CV - <Empresa> - <Rol>.md` usando el template `CV Custom` (`Templates/CV Custom.md`).
|
|
45
45
|
- Completar frontmatter (`perfil_base`, `aplicacion`, `empresa`, `archivo_pdf`).
|
|
46
|
-
- Documentar las decisiones (keywords, qué se resaltó/bajó) en las secciones del template
|
|
46
|
+
- Documentar las decisiones (keywords, qué se resaltó/bajó) en las secciones del template - sirve para la entrevista y para iterar.
|
|
47
47
|
- El cuerpo del CV en sí debe quedar listo para `/cv-ats-export` (markdown limpio: `# nombre`, `## secciones`, bullets, `---`).
|
|
48
48
|
|
|
49
49
|
## Formato del CV (ATS-friendly)
|
|
50
50
|
|
|
51
|
-
- **Una columna.** Sin tablas, sin cajas de texto, sin columnas
|
|
51
|
+
- **Una columna.** Sin tablas, sin cajas de texto, sin columnas - los ATS las leen mal.
|
|
52
52
|
- Secciones estándar con headers claros: Summary, Experience, Skills, Projects, Education.
|
|
53
53
|
- Fechas consistentes (MM/YYYY).
|
|
54
54
|
- Sin gráficos ni imágenes para el contenido crítico.
|
|
@@ -62,7 +62,7 @@ CV en **inglés** para roles internacionales/remotos globales; **español** si l
|
|
|
62
62
|
|
|
63
63
|
- Nunca inventar experiencia, fechas o métricas. Tailoring = reorganizar y traducir, no mentir.
|
|
64
64
|
- No keyword-stuffing: cada keyword debe vivir en un bullet verdadero.
|
|
65
|
-
- Un CV custom por postulación
|
|
65
|
+
- Un CV custom por postulación - no pisar el perfil base ni el maestro.
|
|
66
66
|
- Después de generar el `.md`, recordar al usuario correr `/cv-ats-export` para el PDF.
|
|
67
67
|
|
|
68
68
|
## Handoff
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ATS Keywords
|
|
1
|
+
# ATS Keywords - Cómo extraer y mapear
|
|
2
2
|
|
|
3
3
|
Los Applicant Tracking Systems (Greenhouse, Lever, Workday, Workable, etc.) hacen un primer filtro automático antes de que un humano vea el CV. Entender cómo "leen" cambia el resultado.
|
|
4
4
|
|
|
@@ -11,12 +11,12 @@ Los Applicant Tracking Systems (Greenhouse, Lever, Workday, Workable, etc.) hace
|
|
|
11
11
|
|
|
12
12
|
## Extracción de keywords del JD
|
|
13
13
|
|
|
14
|
-
1. **Hard skills / tecnologías**
|
|
15
|
-
2. **Responsabilidades / verbos**
|
|
16
|
-
3. **Metodologías**
|
|
17
|
-
4. **Seniority y años**
|
|
18
|
-
5. **Soft skills explícitos**
|
|
19
|
-
6. **Señales de cultura / frases gatillo**
|
|
14
|
+
1. **Hard skills / tecnologías** - lenguajes, frameworks, DBs, cloud, herramientas. Copiá la forma **literal** (React.js ≠ React ≠ ReactJS para un match exacto; cuando puedas, incluí la variante que usa la oferta).
|
|
15
|
+
2. **Responsabilidades / verbos** - "design REST APIs", "lead a team", "CI/CD pipelines".
|
|
16
|
+
3. **Metodologías** - Agile, Scrum, TDD, clean architecture.
|
|
17
|
+
4. **Seniority y años** - "5+ years", "senior", "lead".
|
|
18
|
+
5. **Soft skills explícitos** - communication, ownership, cross-functional.
|
|
19
|
+
6. **Señales de cultura / frases gatillo** - ej. "code-forward", "startup mentality", "high autonomy". Suelen indicar qué valoran y dan ángulo para el summary y la cover letter.
|
|
20
20
|
|
|
21
21
|
## Mapeo contra el perfil
|
|
22
22
|
|
|
@@ -24,7 +24,7 @@ Los Applicant Tracking Systems (Greenhouse, Lever, Workday, Workable, etc.) hace
|
|
|
24
24
|
|---|---|---|---|
|
|
25
25
|
| React.js | Sí | "Built React + TS frontends @ X" | resaltar arriba |
|
|
26
26
|
| Kubernetes | Parcial | exposición en CI/CD | mencionar honesto |
|
|
27
|
-
| Go | No |
|
|
27
|
+
| Go | No | - | gap; no inventar |
|
|
28
28
|
|
|
29
29
|
- **Must-have que tenés** → arriba, con espacio, con la palabra exacta.
|
|
30
30
|
- **Must-have parcial** → mencionar con honestidad ("exposure to…").
|
|
@@ -41,6 +41,6 @@ Los Applicant Tracking Systems (Greenhouse, Lever, Workday, Workable, etc.) hace
|
|
|
41
41
|
- [ ] Una sola columna, sin tablas/text boxes.
|
|
42
42
|
- [ ] Headers de sección estándar (Experience, Skills, Education…).
|
|
43
43
|
- [ ] Fechas consistentes MM/YYYY.
|
|
44
|
-
- [ ] Texto seleccionable (no imagen)
|
|
44
|
+
- [ ] Texto seleccionable (no imagen) - el export de `/cv-ats-export` ya lo garantiza.
|
|
45
45
|
- [ ] Nombre del archivo profesional (`Nombre_Apellido_Empresa.pdf`).
|
|
46
46
|
- [ ] Contacto en el cuerpo, no en el header/footer del documento.
|
|
@@ -7,14 +7,14 @@ user-invocable: true
|
|
|
7
7
|
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# Interview Prep
|
|
10
|
+
# Interview Prep - Preparación de entrevista
|
|
11
11
|
|
|
12
12
|
Preparás al usuario para una entrevista concreta: research de la empresa, banco de preguntas probable según rol y ronda, respuestas **STAR** construidas desde su experiencia real, preguntas inteligentes para hacer, y red flags a detectar. El output queda en una nota de `06-Entrevistas/`.
|
|
13
13
|
|
|
14
14
|
## Inputs
|
|
15
15
|
|
|
16
16
|
- **Aplicación / empresa / rol** (`03-Aplicaciones/`, `04-Empresas/`) y la **ronda** (recruiter screen, técnica, system design, hiring manager, cultural, final).
|
|
17
|
-
- **Perfil maestro** (`01-Perfiles/`)
|
|
17
|
+
- **Perfil maestro** (`01-Perfiles/`) - de ahí salen las historias para las respuestas STAR.
|
|
18
18
|
- **Entrevistadores** si se conocen (research de background ayuda).
|
|
19
19
|
|
|
20
20
|
## Qué producís
|
|
@@ -28,19 +28,19 @@ Preparás al usuario para una entrevista concreta: research de la empresa, banco
|
|
|
28
28
|
|
|
29
29
|
### 2. Banco de preguntas por ronda
|
|
30
30
|
- **Recruiter screen:** motivación, expectativas salariales, disponibilidad, "contame de vos".
|
|
31
|
-
- **Técnica:** según stack del JD
|
|
31
|
+
- **Técnica:** según stack del JD - fundamentos, problemas, debugging, code review.
|
|
32
32
|
- **System design** (si aplica): patrones, trade-offs, escala.
|
|
33
33
|
- **Hiring manager / comportamiento:** liderazgo, conflicto, fracaso, impacto.
|
|
34
34
|
- **Cultural:** valores, formas de trabajo, por qué esta empresa.
|
|
35
|
-
- Marcar las **3
|
|
35
|
+
- Marcar las **3-5 más probables** para este rol específico.
|
|
36
36
|
|
|
37
37
|
### 3. Respuestas STAR
|
|
38
38
|
- Construir respuestas con el método **STAR** (Situación, Tarea, Acción, Resultado) usando logros reales del perfil maestro.
|
|
39
|
-
- Cada respuesta: concreta, con métrica, 60
|
|
39
|
+
- Cada respuesta: concreta, con métrica, 60-90 segundos hablada.
|
|
40
40
|
- Ver `references/star-framework.md`.
|
|
41
41
|
|
|
42
42
|
### 4. Preguntas para hacer
|
|
43
|
-
- 5
|
|
43
|
+
- 5-7 preguntas inteligentes que demuestran research y filtran si la empresa te conviene (equipo, expectativas de los primeros 90 días, cómo miden éxito, deuda técnica, proceso).
|
|
44
44
|
|
|
45
45
|
### 5. Red flags a detectar
|
|
46
46
|
- Señales de mala empresa/equipo durante la entrevista (proceso caótico, evasión sobre cultura/turnover, expectativas irreales, falta de claridad de rol, hostilidad).
|
|
@@ -56,7 +56,7 @@ Preparás al usuario para una entrevista concreta: research de la empresa, banco
|
|
|
56
56
|
|
|
57
57
|
1. Leer aplicación + empresa + perfil. WebFetch del sitio/notas de la empresa.
|
|
58
58
|
2. Crear nota en `06-Entrevistas/` con el template `Entrevista`.
|
|
59
|
-
3. Llenar research, banco de preguntas (marcando las top), STAR de las 3
|
|
59
|
+
3. Llenar research, banco de preguntas (marcando las top), STAR de las 3-5 historias clave, preguntas a hacer, red flags.
|
|
60
60
|
4. Ofrecer un **mock**: vos hacés de entrevistador y das feedback sobre las respuestas.
|
|
61
61
|
5. Post-entrevista: ayudar a registrar feedback y definir próximo paso / follow-up (con `/cold-outreach`).
|
|
62
62
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# STAR Framework
|
|
1
|
+
# STAR Framework - Respuestas de comportamiento
|
|
2
2
|
|
|
3
3
|
STAR estructura respuestas a preguntas de comportamiento ("contame de una vez que…") para que sean concretas, completas y memorables. La mayoría de los candidatos divaga; STAR te da una historia con resultado.
|
|
4
4
|
|
|
5
5
|
## Las 4 partes
|
|
6
6
|
|
|
7
|
-
- **S
|
|
8
|
-
- **T
|
|
9
|
-
- **A
|
|
10
|
-
- **R
|
|
7
|
+
- **S - Situación:** el contexto, breve. Dónde, cuándo, qué estaba pasando. (1-2 oraciones)
|
|
8
|
+
- **T - Tarea:** tu responsabilidad / el problema a resolver. (1 oración)
|
|
9
|
+
- **A - Acción:** qué hiciste *vos* (no "el equipo"). El grueso de la respuesta. Decisiones concretas. (2-4 oraciones)
|
|
10
|
+
- **R - Resultado:** el impacto, **con número** siempre que se pueda. Qué aprendiste. (1-2 oraciones)
|
|
11
11
|
|
|
12
|
-
Objetivo: 60
|
|
12
|
+
Objetivo: 60-90 segundos hablado. Ni telegrama, ni monólogo de 5 minutos.
|
|
13
13
|
|
|
14
14
|
## Ejemplo
|
|
15
15
|
|
|
@@ -20,9 +20,9 @@ Objetivo: 60–90 segundos hablado. Ni telegrama, ni monólogo de 5 minutos.
|
|
|
20
20
|
> **A:** Perfilé el hot path, encontré queries N+1 y serialización redundante; introduje caching por sesión y batch de writes, y agregué métricas para validar.
|
|
21
21
|
> **R:** Latencia -25% y estabilidad del server +40%; duplicamos jugadores concurrentes sin sumar costos. Aprendí a medir antes de optimizar.
|
|
22
22
|
|
|
23
|
-
## Banco de historias (preparar 5
|
|
23
|
+
## Banco de historias (preparar 5-6)
|
|
24
24
|
|
|
25
|
-
Construí 5
|
|
25
|
+
Construí 5-6 historias STAR reutilizables desde el perfil maestro, cubriendo:
|
|
26
26
|
|
|
27
27
|
1. **Logro/impacto** del que estés orgulloso (con métrica).
|
|
28
28
|
2. **Problema técnico difícil** que resolviste.
|
|
@@ -31,11 +31,11 @@ Construí 5–6 historias STAR reutilizables desde el perfil maestro, cubriendo:
|
|
|
31
31
|
5. **Liderazgo / iniciativa** (lideraste algo, mentoreaste, empujaste un cambio).
|
|
32
32
|
6. **Ambigüedad / cambio de prioridades** que manejaste.
|
|
33
33
|
|
|
34
|
-
La misma historia puede servir para varias preguntas
|
|
34
|
+
La misma historia puede servir para varias preguntas - lo que cambia es qué parte enfatizás.
|
|
35
35
|
|
|
36
36
|
## Errores comunes
|
|
37
37
|
|
|
38
|
-
- Quedarse en "nosotros"
|
|
38
|
+
- Quedarse en "nosotros" - la entrevista evalúa *tu* aporte. Decí "yo".
|
|
39
39
|
- Saltearse el Resultado, o un resultado sin número.
|
|
40
40
|
- Demasiada Situación, poca Acción.
|
|
41
41
|
- Historias vagas/inventadas que no aguantan repreguntas.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: job-aplicar
|
|
3
|
+
description: "Orchestrate a full job application from a URL or note: fit score, application note, tailored CV, cover letter, fresh-context review and ATS-verified PDF. Sending is always manual. Triggers: aplicar a esta oferta, postularme a, armar la postulacion, pipeline de aplicacion, preparar CV y cover para una oferta, aplicar a este trabajo."
|
|
4
|
+
argument-hint: "<url | nota de aplicación>"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit, WebFetch, WebSearch, Task
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /job-aplicar - Pipeline completo de una postulación
|
|
11
|
+
|
|
12
|
+
Orquesta de punta a punta: evaluar fit → nota de aplicación → CV custom → cover → reviewer → PDF ATS → dashboard. Adaptado del `/apply` de MadsLorentzen/ai-job-search a los skills y reglas de este skillset. **El envío final es siempre manual del usuario; este skill nunca marca `estado: aplicado`** (eso lo registra `/job-outcome` después de enviar).
|
|
13
|
+
|
|
14
|
+
Argumento: `$ARGUMENTS` (URL de la oferta, o nombre/wikilink de una nota de `03-Aplicaciones/`).
|
|
15
|
+
|
|
16
|
+
Rutas relativas al career workspace (`--workspace`, env `CAREER_WORKSPACE`, o `./career-workspace/`). Usa los skills `cv-tailor`, `cover-letter` y `cv-ats-export`, la regla `drafter-reviewer` y, si está instalado, los CLIs y el estado de dedup de `job-scrape`.
|
|
17
|
+
|
|
18
|
+
## Paso 0 - Resolver argumento y detectar re-entrada
|
|
19
|
+
|
|
20
|
+
- Si es nombre/wikilink: cargar la nota de `03-Aplicaciones/`.
|
|
21
|
+
- Si es URL: canonicalizarla (reglas en `.claude/skills/job-scrape/references/dedup-playbook.md`) y buscar nota existente por `link_oferta` (Grep). Si existe, modo re-entrada.
|
|
22
|
+
- **Detectar desde los artefactos qué pasos ya están hechos** (no hay archivo de estado; los artefactos SON el estado):
|
|
23
|
+
1. ¿Existe la nota? 2. ¿Tiene `match_score`? 3. ¿`cv_usado` apunta a un CV .md existente en `02-CVs/`? 4. ¿La nota tiene sección "Cover letter" con contenido? 5. ¿Hay resumen de decisiones de review en `## Notas`? 6. ¿Existe el PDF en `02-CVs/exports/` (o `archivo_pdf`)? 7. ¿Hay fila en el dashboard?
|
|
24
|
+
- Informar "retomo desde el paso X" y saltar lo ya hecho.
|
|
25
|
+
|
|
26
|
+
## Paso 1 - Obtener el JD
|
|
27
|
+
|
|
28
|
+
- URL de GetOnBoard → `python .claude/skills/job-scrape/scripts/getonbrd_search.py detail "<url>" --format plain` (si reporta CERRADA, avisar y preguntar si igual seguir).
|
|
29
|
+
- URL de LinkedIn → `python .claude/skills/job-scrape/scripts/linkedin_search.py detail "<url>" --format plain`.
|
|
30
|
+
- Otra fuente, o si `job-scrape` no está instalado → WebFetch.
|
|
31
|
+
- Registrar `fuente` (getonbrd / linkedin / otro).
|
|
32
|
+
|
|
33
|
+
## Paso 2 - Score
|
|
34
|
+
|
|
35
|
+
Aplicar la rúbrica de `.claude/skills/job-search/references/scoring-rubric.md` (si el skill job-search no está instalado, pedir instalarlo o scorear a criterio declarando la limitación) contra el perfil correspondiente de `01-Perfiles/` (elegir por stack del JD; preguntar si es ambiguo). Presentar: score 0-100, breakdown por dimensión, gaps reales, red flags.
|
|
36
|
+
|
|
37
|
+
## Paso 3 - CONFIRMACIÓN 1: ¿proceder?
|
|
38
|
+
|
|
39
|
+
Pedir approval explícito antes de crear cualquier archivo:
|
|
40
|
+
- **Proceder** → paso 4.
|
|
41
|
+
- **Descartar** → si existe `<workspace>/tools/job_scraper/seen_jobs.json`, registrar `status: descartado` + motivo; terminar. No crear nada.
|
|
42
|
+
|
|
43
|
+
## Paso 4 - Nota de aplicación
|
|
44
|
+
|
|
45
|
+
Crear (o completar) la nota desde el template `Templates/Aplicacion.md` del workspace: frontmatter completo (`estado: interesado`, `match_score`, `link_oferta` canónica, `perfil`, `fuente`, `salario_rango`, `modalidad`, `ubicacion`, `prioridad`, `contacto_principal` si se conoce), secciones "Por qué me interesa" y "Match con mi perfil" (alineaciones + gaps reales), línea en Timeline. En el idioma de las notas del workspace, sin guiones largos.
|
|
46
|
+
|
|
47
|
+
## Paso 5 - CV custom
|
|
48
|
+
|
|
49
|
+
Usar el skill **cv-tailor** con el JD y el perfil base: genera `02-CVs/CV - <Empresa> - <Rol>.md`, con keywords ATS de la oferta y delta de match reportado. Setear `cv_usado` en la nota de aplicación.
|
|
50
|
+
|
|
51
|
+
## Paso 6 - Cover letter
|
|
52
|
+
|
|
53
|
+
Usar el skill **cover-letter** según el canal de aplicación (formulario ATS → carta 250-350 palabras; LinkedIn/email → mensaje 150-250). Guardar en la sección "Cover letter (v1)" de la nota.
|
|
54
|
+
|
|
55
|
+
## Paso 7 - Reviewer (regla drafter-reviewer, obligatorio)
|
|
56
|
+
|
|
57
|
+
Seguir `.claude/rules/drafter-reviewer.md`: lanzar UN agente general-purpose de contexto fresco con el JD + borradores inline; lectura acotada al perfil; research web breve de la empresa. Aplicar la Parte A (reemplazos exactos) e incorporar lo relevante de la Parte B. Una sola ronda. Never stuff keywords: los gaps se reconocen en el cover, no se rellenan en el CV. Normalizar guiones largos del texto sugerido.
|
|
58
|
+
|
|
59
|
+
## Paso 8 - CONFIRMACIÓN 2: aprobar CV final
|
|
60
|
+
|
|
61
|
+
Mostrar el CV final (y cover) con las decisiones del review aplicadas. Solo con approval explícito, exportar:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
python .claude/skills/cv-ats-export/scripts/cv_export.py "CV - <Empresa> - <Rol>"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
(o la copia instalada en `<workspace>/tools/`). La verificación ATS corre automática ([ATS OK] esperado; si [ATS WARN], corregir y re-exportar). Registrar la ruta del PDF en la nota (sección "Archivo final exportado" del CV custom).
|
|
68
|
+
|
|
69
|
+
## Paso 9 - Dashboard
|
|
70
|
+
|
|
71
|
+
Agregar/actualizar la fila de la oferta en la sección de aplicaciones activas de `00-Dashboard.md`, respetando las columnas exactas del header, escapando `\|` en wikilinks con alias. Estado ⬜ (interesado).
|
|
72
|
+
|
|
73
|
+
## Paso 10 - Cierre
|
|
74
|
+
|
|
75
|
+
- Resumen de 3-5 decisiones de tailoring en `## Notas` de la nota (qué se enfatizó, ángulo de empresa, gaps reconocidos).
|
|
76
|
+
- Si existe seen_jobs: entrada → `nota_creada` (crearla si no existía).
|
|
77
|
+
- Recordatorio al usuario: **enviar es manual**; el PDF y el cover están listos, el link de aplicación está en la nota y el dashboard. Al enviar, correr `/job-outcome <empresa>` para marcar `aplicado`.
|
|
78
|
+
|
|
79
|
+
## Qué NO hace
|
|
80
|
+
|
|
81
|
+
- No envía la postulación ni marca `aplicado` (ToS de los portales + control de calidad humano).
|
|
82
|
+
- No exporta PDF sin la confirmación 2.
|
|
83
|
+
- No toca otras notas ni otras filas del dashboard.
|
|
84
|
+
- No inventa experiencia: los gaps se reconocen, no se rellenan.
|
|
85
|
+
|
|
86
|
+
## Handoff
|
|
87
|
+
|
|
88
|
+
Con el PDF verificado y el cover aprobados, el paquete queda READY para enviar a mano. Después de enviar: `/job-outcome <empresa>`. Si hay un contacto directo en la empresa, `/cold-outreach` para el mensaje al recruiter/hiring manager.
|
package/skills/job-hunt/SKILL.md
CHANGED
|
@@ -7,9 +7,9 @@ user-invocable: true
|
|
|
7
7
|
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# Job Hunt
|
|
10
|
+
# Job Hunt - Career Workspace Orchestrator
|
|
11
11
|
|
|
12
|
-
Eres el punto de entrada de la suite de búsqueda laboral. Tu trabajo es: detectar (o crear) el **career workspace**, entender en qué etapa está el usuario, y rutear al skill correcto. No hacés todo vos
|
|
12
|
+
Eres el punto de entrada de la suite de búsqueda laboral. Tu trabajo es: detectar (o crear) el **career workspace**, entender en qué etapa está el usuario, y rutear al skill correcto. No hacés todo vos - orquestás.
|
|
13
13
|
|
|
14
14
|
## Idioma
|
|
15
15
|
|
|
@@ -32,26 +32,29 @@ career-workspace/
|
|
|
32
32
|
07-Recursos/ cover letters reutilizables, links
|
|
33
33
|
portfolio/ datos source-of-truth del portfolio web
|
|
34
34
|
Templates/ plantillas con frontmatter
|
|
35
|
-
tools/ cv_export.py (
|
|
35
|
+
tools/ cv_export.py + verify_pdf.py (los instala /cv-ats-export)
|
|
36
|
+
y job_scraper/seen_jobs.json (memoria de dedup de /job-scrape)
|
|
36
37
|
```
|
|
37
38
|
|
|
38
39
|
Es **portable y agnóstico de Obsidian**: usa `[[wikilinks]]` (funcionan en Obsidian si el usuario lo usa, y son legibles en texto plano), frontmatter YAML, y prefijos numéricos para ordenar carpetas. No requiere Obsidian instalado.
|
|
39
40
|
|
|
41
|
+
Estados de una aplicación (frontmatter `estado`): `interesado → aplicado → entrevista → oferta`, con cierres `contratado | rechazado | sin_respuesta | declinada | descartado`. Los mueve `/job-outcome`; ninguna otra skill marca `aplicado`.
|
|
42
|
+
|
|
40
43
|
## Modos
|
|
41
44
|
|
|
42
|
-
### `setup`
|
|
45
|
+
### `setup` - Crear el workspace
|
|
43
46
|
1. Preguntar dónde crear el workspace (default `./career-workspace/`) y el/los rol(es) objetivo.
|
|
44
47
|
2. Crear el árbol de carpetas completo.
|
|
45
48
|
3. Copiar los 7 templates desde `references/templates/` a `Templates/` del workspace.
|
|
46
49
|
4. Crear `00-Dashboard.md` desde `references/templates/Dashboard.md`.
|
|
47
50
|
5. Sugerir el siguiente paso: `/master-profile` para construir el perfil maestro.
|
|
48
51
|
|
|
49
|
-
### `status`
|
|
52
|
+
### `status` - Dónde estoy
|
|
50
53
|
1. Leer `00-Dashboard.md` y escanear `03-Aplicaciones/`.
|
|
51
54
|
2. Resumir: aplicaciones activas por prioridad, próximas entrevistas, ofertas que cierran pronto, gaps (aplicaciones sin CV/cover letter).
|
|
52
55
|
3. Recomendar la acción de mayor impacto.
|
|
53
56
|
|
|
54
|
-
### `next`
|
|
57
|
+
### `next` - Qué hago ahora
|
|
55
58
|
Según el estado del workspace, recomendar el skill siguiente (ver routing).
|
|
56
59
|
|
|
57
60
|
## Routing
|
|
@@ -61,6 +64,10 @@ Según el estado del workspace, recomendar el skill siguiente (ver routing).
|
|
|
61
64
|
| No hay workspace | `/job-hunt setup` |
|
|
62
65
|
| Falta perfil maestro | `/master-profile` |
|
|
63
66
|
| Encontrar/scorear ofertas, plan de búsqueda | `/job-search` |
|
|
67
|
+
| Corrida de búsqueda con CLIs y dedup entre corridas | `/job-scrape` |
|
|
68
|
+
| Postulación completa (nota + CV + cover + review + PDF) | `/job-aplicar` |
|
|
69
|
+
| Registrar resultado/avance de una postulación | `/job-outcome` |
|
|
70
|
+
| Gaps de skills agregados + plan de estudio | `/job-upskill` |
|
|
64
71
|
| Adaptar CV a una oferta | `/cv-tailor` |
|
|
65
72
|
| Exportar CV a PDF ATS | `/cv-ats-export` |
|
|
66
73
|
| Escribir cover letter / mensaje de aplicación | `/cover-letter` |
|
|
@@ -71,17 +78,17 @@ Según el estado del workspace, recomendar el skill siguiente (ver routing).
|
|
|
71
78
|
|
|
72
79
|
## Workflow estándar para una nueva oportunidad
|
|
73
80
|
|
|
74
|
-
1. `/job-
|
|
81
|
+
1. `/job-scrape` → corrida de búsqueda con dedup (o `/job-search` para una oferta/búsqueda puntual): nota en `03-Aplicaciones/` + `04-Empresas/`.
|
|
75
82
|
2. Identificar contacto objetivo → nota en `05-Contactos/`.
|
|
76
|
-
3. `/
|
|
77
|
-
4. `/
|
|
78
|
-
5. `/
|
|
79
|
-
6.
|
|
80
|
-
7.
|
|
83
|
+
3. `/job-aplicar` → pipeline completo de la postulación: CV custom + cover + review (regla drafter-reviewer) + PDF ATS verificado. (A mano: `/cv-tailor` → `/cv-ats-export` → `/cover-letter`.)
|
|
84
|
+
4. `/cold-outreach` → si hay contacto al que escribirle directo.
|
|
85
|
+
5. Enviar la postulación (**siempre manual**) → `/job-outcome <empresa>` para marcar `aplicado`; registrar ahí cada avance.
|
|
86
|
+
6. Cuando haya entrevista → `/interview-prep`.
|
|
87
|
+
7. Con rechazos acumulados → `/job-upskill` para el plan de estudio según gaps reales.
|
|
81
88
|
|
|
82
89
|
## Reglas
|
|
83
90
|
|
|
84
|
-
- Nunca reorganizar carpetas ni renombrar notas sin preguntar
|
|
91
|
+
- Nunca reorganizar carpetas ni renombrar notas sin preguntar - rompe `[[wikilinks]]` en silencio.
|
|
85
92
|
- Nunca commitear datos sensibles (CV con teléfono/dirección, salarios, emails de recruiters) a un remoto sin confirmación explícita.
|
|
86
93
|
- Si una categoría necesita un template que no existe, proponerlo antes de inventarlo.
|
|
87
94
|
- Preservar los prefijos numéricos al crear archivos dentro de las carpetas ordenadas.
|
|
@@ -4,7 +4,8 @@ empresa:
|
|
|
4
4
|
perfil:
|
|
5
5
|
cv_usado:
|
|
6
6
|
estado: interesado
|
|
7
|
-
|
|
7
|
+
match_score:
|
|
8
|
+
fuente:
|
|
8
9
|
fecha_aplicacion:
|
|
9
10
|
fecha_actualizacion: {{date:YYYY-MM-DD}}
|
|
10
11
|
link_oferta:
|
|
@@ -14,6 +15,7 @@ modalidad:
|
|
|
14
15
|
ubicacion:
|
|
15
16
|
prioridad: media
|
|
16
17
|
---
|
|
18
|
+
%% estado: interesado -> aplicado -> entrevista -> oferta | cierres: contratado / rechazado / sin_respuesta / declinada / descartado (los mueve /job-outcome) %%
|
|
17
19
|
|
|
18
20
|
# {{title}}
|
|
19
21
|
|
|
@@ -29,6 +31,8 @@ prioridad: media
|
|
|
29
31
|
- Perfil base: [[]]
|
|
30
32
|
- Qué de mi experiencia alinea con lo que piden:
|
|
31
33
|
-
|
|
34
|
+
- Gaps reales (alimentan /job-upskill):
|
|
35
|
+
-
|
|
32
36
|
|
|
33
37
|
## A quién escribirle / contacto principal
|
|
34
38
|
- [[]]
|
|
@@ -39,7 +43,7 @@ prioridad: media
|
|
|
39
43
|
- [[]]
|
|
40
44
|
|
|
41
45
|
## Timeline / seguimiento
|
|
42
|
-
- {{date:YYYY-MM-DD}}
|
|
46
|
+
- {{date:YYYY-MM-DD}} - creada la nota
|
|
43
47
|
|
|
44
48
|
## Entrevistas
|
|
45
49
|
-
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
tipo: dashboard
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# Dashboard
|
|
5
|
+
# Dashboard - Búsqueda laboral
|
|
6
6
|
|
|
7
7
|
> Índice del workspace. Cuando haya datos (aplicaciones, entrevistas), estas secciones pueden convertirse en queries dinámicas con Bases/Dataview si usás Obsidian.
|
|
8
8
|
|
|
@@ -16,6 +16,9 @@ tipo: dashboard
|
|
|
16
16
|
**Cerradas / descartadas:**
|
|
17
17
|
-
|
|
18
18
|
|
|
19
|
+
## Leyenda de estados
|
|
20
|
+
⬜ interesado · ✅ aplicado · 📅 entrevista/oferta · ❌ rechazado/sin_respuesta/declinada · 🚫 descartado/cerrada
|
|
21
|
+
|
|
19
22
|
## Próximas entrevistas
|
|
20
23
|
-
|
|
21
24
|
|
|
@@ -26,20 +29,21 @@ tipo: dashboard
|
|
|
26
29
|
-
|
|
27
30
|
|
|
28
31
|
## Accesos rápidos por carpeta
|
|
29
|
-
- `01-Perfiles/`
|
|
30
|
-
- `02-CVs/`
|
|
31
|
-
- `03-Aplicaciones/`
|
|
32
|
-
- `04-Empresas/`
|
|
33
|
-
- `05-Contactos/`
|
|
34
|
-
- `06-Entrevistas/`
|
|
35
|
-
- `07-Recursos/`
|
|
36
|
-
- `portfolio/`
|
|
37
|
-
- `Templates/`
|
|
32
|
+
- `01-Perfiles/` - perfiles profesionales base + perfil maestro
|
|
33
|
+
- `02-CVs/` - versiones de CV (incluye CVs custom por postulación)
|
|
34
|
+
- `03-Aplicaciones/` - una nota por postulación
|
|
35
|
+
- `04-Empresas/` - research de empresas
|
|
36
|
+
- `05-Contactos/` - recruiters, referidos, hiring managers
|
|
37
|
+
- `06-Entrevistas/` - prep y feedback por ronda
|
|
38
|
+
- `07-Recursos/` - cover letters reutilizables, links útiles
|
|
39
|
+
- `portfolio/` - source-of-truth del portfolio web
|
|
40
|
+
- `Templates/` - plantillas con frontmatter
|
|
41
|
+
- `tools/` - cv_export.py, verify_pdf.py y job_scraper/seen_jobs.json
|
|
38
42
|
|
|
39
43
|
## Workflow estándar para una nueva oportunidad
|
|
40
|
-
1. `/job-
|
|
44
|
+
1. `/job-scrape` - corrida de búsqueda con dedup (o `/job-search` para una oferta puntual) → nota en `03-Aplicaciones/` + `04-Empresas/`.
|
|
41
45
|
2. Identificar contacto objetivo → nota en `05-Contactos/`.
|
|
42
|
-
3. `/
|
|
43
|
-
4. `/
|
|
44
|
-
5. `/
|
|
45
|
-
6. `/
|
|
46
|
+
3. `/job-aplicar` - pipeline completo: CV custom + cover + review + PDF ATS verificado.
|
|
47
|
+
4. Enviar (siempre manual) → `/job-outcome <empresa>` para marcar `aplicado` y registrar avances.
|
|
48
|
+
5. `/interview-prep` - cuando haya entrevista.
|
|
49
|
+
6. `/job-upskill` - con rechazos acumulados, plan de estudio según gaps reales.
|
|
@@ -13,10 +13,10 @@ regla_seniority:
|
|
|
13
13
|
fuentes: []
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
# Perfil
|
|
16
|
+
# Perfil - {{title}}
|
|
17
17
|
|
|
18
18
|
## Resumen
|
|
19
|
-
> 2
|
|
19
|
+
> 2-3 líneas: quién sos para este rol y qué te hace fuerte.
|
|
20
20
|
|
|
21
21
|
## Stack principal
|
|
22
22
|
-
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: job-outcome
|
|
3
|
+
description: "Record the outcome or progress of a job application (interview, offer, hired, rejected, no reply) updating the application note and the dashboard. Triggers: me respondieron de, registrar resultado, me rechazaron, tengo entrevista con, recibi una oferta, no me contestaron, actualizar estado de la postulacion."
|
|
4
|
+
argument-hint: "[empresa]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /job-outcome - Registrar resultado de una aplicación
|
|
11
|
+
|
|
12
|
+
Registrá qué pasó con una postulación: avances (entrevista agendada/hecha, oferta recibida) o resoluciones (contratado, rechazado, sin respuesta, oferta declinada, descartado). Adaptado del `/outcome` de MadsLorentzen/ai-job-search al esquema de notas del career workspace (rutas relativas al workspace: `--workspace`, env `CAREER_WORKSPACE`, o `./career-workspace/`).
|
|
13
|
+
|
|
14
|
+
Empresa/oferta indicada: `$ARGUMENTS`
|
|
15
|
+
|
|
16
|
+
## Pasos
|
|
17
|
+
|
|
18
|
+
1. **Localizar la nota.** Buscar en `03-Aplicaciones/` la nota cuyo nombre o frontmatter `empresa` matchee (case-insensitive) con `$ARGUMENTS`. Si no se pasó argumento o hay ambigüedad, listar las aplicaciones con estado abierto (`interesado`, `aplicado`, `entrevista`, `oferta`) y preguntar cuál.
|
|
19
|
+
|
|
20
|
+
2. **Recolectar qué pasó.** Preguntar al usuario y clasificar:
|
|
21
|
+
- **Progreso:** entrevista agendada / entrevista realizada / oferta recibida → estados `entrevista` u `oferta`.
|
|
22
|
+
- **Resolución:** `contratado` · `rechazado` · `sin_respuesta` · `declinada` (la oferta la rechazó el usuario) · `descartado` (el usuario perdió interés / la oferta cerró).
|
|
23
|
+
Registrar fecha, feedback textual recibido y lecciones aprendidas. **Registrar datos, no interpretarlos:** citar el feedback tal como llegó, sin suavizarlo ni analizarlo acá.
|
|
24
|
+
|
|
25
|
+
3. **Actualizar la nota de aplicación**, con approval del usuario sobre lo recolectado (idempotente - agregar, nunca duplicar ni sobrescribir):
|
|
26
|
+
- Frontmatter: `estado` al nuevo valor y `fecha_actualizacion` a hoy. Compatibilidad: si la nota vieja usa `score:` en vez de `match_score:`, no renombrar el campo, solo tocar `estado`.
|
|
27
|
+
- `## Timeline / seguimiento`: agregar línea `- YYYY-MM-DD - <qué pasó>`.
|
|
28
|
+
- Si hubo entrevista: entrada en `## Entrevistas` (fecha, etapa, entrevistador si se sabe, y link a la nota de `06-Entrevistas/` si existe).
|
|
29
|
+
- Feedback y lecciones van en `## Notas`.
|
|
30
|
+
|
|
31
|
+
4. **Actualizar el dashboard** (`00-Dashboard.md`): buscar la fila de la oferta y actualizar la columna **Estado** con el nuevo estado (usar la leyenda de emojis de abajo, la misma del template Dashboard) y la columna de nota si aporta (ej. "Rechazada 2026-07-13").
|
|
32
|
+
|
|
33
|
+
5. **Sugerir siguiente paso** según el caso:
|
|
34
|
+
- `entrevista` → ofrecer `/interview-prep`.
|
|
35
|
+
- `rechazado` con feedback → anotar la lección en la nota; si se acumulan 3+ resoluciones, ofrecer `/job-upskill` y revisar los criterios de búsqueda contra los resultados reales.
|
|
36
|
+
- `sin_respuesta` a los 10-14 días → ofrecer follow-up con `/cold-outreach`.
|
|
37
|
+
- `contratado` → 🎉 y actualizar el resto de las aplicaciones abiertas (¿retirarse de procesos?).
|
|
38
|
+
|
|
39
|
+
6. **Confirmar** al usuario qué se registró (nota, campos tocados, fila del dashboard).
|
|
40
|
+
|
|
41
|
+
## Vocabulario de `estado` (frontmatter)
|
|
42
|
+
|
|
43
|
+
`interesado → aplicado → entrevista → oferta` y cierra en: `contratado | rechazado | sin_respuesta | declinada | descartado`
|
|
44
|
+
|
|
45
|
+
Emojis del dashboard: ⬜ interesado · ✅ aplicado · 📅 entrevista/oferta · ❌ rechazado/sin_respuesta/declinada · 🚫 descartado/cerrada
|
|
46
|
+
|
|
47
|
+
## Reglas
|
|
48
|
+
|
|
49
|
+
- No editar en masa notas existentes: solo la nota de la aplicación en cuestión y su fila del dashboard.
|
|
50
|
+
- No inventar datos: si falta información (fecha, feedback), preguntar o dejar el campo como está.
|
|
51
|
+
- Sin guiones largos en todo texto agregado.
|
|
52
|
+
|
|
53
|
+
## Handoff
|
|
54
|
+
|
|
55
|
+
Registro COMPLETE cuando nota y dashboard quedaron consistentes. Según el resultado, el siguiente paso es `/interview-prep` (entrevista agendada), `/cold-outreach` (follow-up) o `/job-upskill` (rechazos acumulados).
|