claude-code-arcane 1.1.1 → 1.3.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +2 -0
  3. package/agents/engineering/dotnet-engineer.md +78 -0
  4. package/dist/cli.js +284 -72
  5. package/docs/RELEASE-SETUP.md +99 -0
  6. package/docs/SKILLS-CATALOG.md +26 -3
  7. package/docs/presentations/arcane-overview-12.pptx +0 -0
  8. package/docs/presentations/arcane-overview.pptx +0 -0
  9. package/docs/presentations/build_arcane_deck.py +310 -0
  10. package/docs/presentations/build_arcane_deck_12.py +399 -0
  11. package/package.json +1 -1
  12. package/profiles/backend-dotnet.yaml +54 -0
  13. package/profiles/job-hunt.yaml +35 -0
  14. package/profiles/unity-design.yaml +1 -0
  15. package/profiles/unity-dev.yaml +1 -0
  16. package/rules/dotnet-code.md +64 -0
  17. package/skills/cold-outreach/SKILL.md +65 -0
  18. package/skills/cold-outreach/references/recruiter-playbook.md +65 -0
  19. package/skills/cover-letter/SKILL.md +66 -0
  20. package/skills/cv-ats-export/SKILL.md +64 -0
  21. package/skills/cv-ats-export/scripts/cv_export.py +306 -0
  22. package/skills/cv-tailor/SKILL.md +70 -0
  23. package/skills/cv-tailor/references/ats-keywords.md +46 -0
  24. package/skills/dotnet-architecture/SKILL.md +66 -0
  25. package/skills/dotnet-architecture/references/anti-patterns.md +12 -0
  26. package/skills/dotnet-architecture/references/checklist.md +19 -0
  27. package/skills/dotnet-architecture/references/patterns.md +118 -0
  28. package/skills/dotnet-architecture/references/project-structure.md +78 -0
  29. package/skills/dotnet-best-practices/SKILL.md +76 -0
  30. package/skills/dotnet-best-practices/references/api-design.md +75 -0
  31. package/skills/dotnet-best-practices/references/architecture.md +62 -0
  32. package/skills/dotnet-best-practices/references/async.md +62 -0
  33. package/skills/dotnet-best-practices/references/database.md +69 -0
  34. package/skills/dotnet-best-practices/references/dependency-injection.md +73 -0
  35. package/skills/dotnet-best-practices/references/devops.md +76 -0
  36. package/skills/dotnet-best-practices/references/error-handling.md +72 -0
  37. package/skills/dotnet-best-practices/references/performance.md +63 -0
  38. package/skills/dotnet-best-practices/references/security.md +73 -0
  39. package/skills/dotnet-best-practices/references/testing.md +76 -0
  40. package/skills/dotnet-scaffold/SKILL.md +99 -0
  41. package/skills/install-mcp/SKILL.md +107 -0
  42. package/skills/install-mcp/references/manual-setup.md +92 -0
  43. package/skills/interview-prep/SKILL.md +69 -0
  44. package/skills/interview-prep/references/star-framework.md +42 -0
  45. package/skills/job-hunt/SKILL.md +92 -0
  46. package/skills/job-hunt/references/templates/Aplicacion.md +48 -0
  47. package/skills/job-hunt/references/templates/CV Custom.md +53 -0
  48. package/skills/job-hunt/references/templates/Contacto.md +30 -0
  49. package/skills/job-hunt/references/templates/Dashboard.md +45 -0
  50. package/skills/job-hunt/references/templates/Empresa.md +36 -0
  51. package/skills/job-hunt/references/templates/Entrevista.md +44 -0
  52. package/skills/job-hunt/references/templates/Perfil.md +38 -0
  53. package/skills/job-search/SKILL.md +83 -0
  54. package/skills/job-search/references/scoring-rubric.md +43 -0
  55. package/skills/linkedin-optimize/SKILL.md +79 -0
  56. package/skills/master-profile/SKILL.md +69 -0
  57. package/skills/network-map/SKILL.md +61 -0
  58. package/skills/network-map/scripts/network_map.py +109 -0
  59. package/skills/personal-brand/SKILL.md +54 -0
  60. package/skills/personal-brand/references/post-pillars.md +66 -0
  61. package/skills/portfolio-site/SKILL.md +59 -0
@@ -0,0 +1,43 @@
1
+ # Job Scoring Rubric
2
+
3
+ Score ponderado 0–100 para decidir dónde invertir esfuerzo. El objetivo no es aplicar a todo: es concentrarte en ofertas con match real. Umbral default **≥75** (configurable por perfil en `match_score_minimo`).
4
+
5
+ ## Dimensiones y pesos (default)
6
+
7
+ | Dimensión | Peso | Cómo puntuar |
8
+ |---|---:|---|
9
+ | **Match de stack/skills** | 30 | % de must-haves que cumplís. 30 si cubrís todos los core; baja proporcional. |
10
+ | **Seniority** | 15 | 15 si el nivel encaja. Penalizar over-qualified (aburrimiento/rechazo) y under-qualified (filtro). |
11
+ | **Modalidad + elegibilidad** | 20 | Remoto/híbrido/presencial según preferencia; zona horaria; visa/eligibility. Si hay bloqueo duro de elegibilidad → cap fuerte al score. |
12
+ | **Salario** | 15 | 15 si ≥ tu objetivo; proporcional hasta tu mínimo; 0 si por debajo del mínimo. Si no publican, neutro (≈8) y marcar. |
13
+ | **Empresa/cultura/etapa** | 10 | Encaje con preferencia (startup vs enterprise, producto vs consultora, valores). |
14
+ | **Calidad de la oferta** | 10 | Claridad del JD, recencia (fresca > vieja), pocos aplicantes, proceso definido. |
15
+
16
+ Sumá las dimensiones → score 0–100.
17
+
18
+ ## Ajustes / banderas
19
+
20
+ - **Frase gatillo positiva** (ej. "code-forward", "high autonomy", stack que amás): +2–5 si refuerza tu fit.
21
+ - **Red flag en el JD** (ego, "rockstar", scope imposible, "trabajamos como familia"): −5–10 y nota de cautela.
22
+ - **Cierre inminente:** no cambia el score, pero sube la **prioridad** de acción.
23
+ - **Elegibilidad bloqueada** (visa que no tenés, zona horaria incompatible obligatoria): cap el score a <50 aunque el resto sea perfecto.
24
+
25
+ ## De score a acción
26
+
27
+ | Score | Acción |
28
+ |---|---|
29
+ | **≥85** | Prioridad alta. Aplicar con CV custom + cover letter + outreach. |
30
+ | **75–84** | Aplicar; CV custom sí, outreach si hay contacto fácil. |
31
+ | **60–74** | Borderline. Aplicar solo si hay tiempo o un ángulo fuerte (referido). |
32
+ | **<60** | Skip salvo razón estratégica. |
33
+
34
+ ## Prioridad (distinta del score)
35
+
36
+ `prioridad` en el frontmatter combina score + urgencia + elegibilidad:
37
+ - **alta:** score ≥85, o ≥75 con cierre inminente / referido caliente.
38
+ - **media:** 75–84 sin urgencia.
39
+ - **baja:** borderline o a la espera de validar requisitos.
40
+
41
+ ## Registro
42
+
43
+ Guardá el `score` en el frontmatter de la nota de `03-Aplicaciones/` y reflejá las activas en `00-Dashboard.md` agrupadas por prioridad. Anotá el breakdown si el score fue borderline — ayuda a decidir y a re-evaluar después.
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: linkedin-optimize
3
+ description: "Optimize a LinkedIn profile to attract recruiters and rank in search — headline, About, experience with KPIs, keywords, value proposition and a 30-second pitch. No LinkedIn Premium needed. Triggers: optimizar LinkedIn, mejorar perfil LinkedIn, headline LinkedIn, about LinkedIn, LinkedIn para reclutadores, LinkedIn SEO, pitch profesional."
4
+ argument-hint: "[section | full] (paste your current profile)"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # LinkedIn Optimize — Perfil que atrae oportunidades
11
+
12
+ Optimizás un perfil de LinkedIn para que (1) ranquee en las búsquedas de recruiters y (2) convenza al humano que lo abre. Trabajás contra el **perfil maestro** (`01-Perfiles/`) y lo que el usuario pega de su perfil actual.
13
+
14
+ > **Importante:** Claude no accede a LinkedIn ni edita el perfil directamente. El usuario pega/sube el contenido actual; vos generás el texto optimizado para que lo copie/pegue.
15
+
16
+ ## Cómo traer tu perfil a Claude
17
+
18
+ La forma más completa: en LinkedIn → **Recursos / More → Save to PDF** (exporta el perfil entero) y subí ese PDF a Claude. Alternativa: copiar/pegar headline + About + experiencia. Con el PDF, podés pedir una **auditoría contra JDs reales**:
19
+
20
+ > "Audita mi perfil de LinkedIn (adjunto) contra JDs de [rol] senior en [empresas objetivo]. Encontrá gaps en headline, About y Experience: keywords faltantes, framing de identidad equivocado, credenciales enterradas. Después reescribí headline y About para posicionarme como **builder**, optimizado para la búsqueda de recruiters."
21
+
22
+ **Framing de identidad:** posicionate como alguien que *construye/entrega* (builder), no como una lista de tareas. El headline y el About deben gritar resultados e identidad, no responsabilidades.
23
+
24
+ ## Las 7 áreas de optimización
25
+
26
+ Cubrí estas siete (el usuario puede pedir una con `[section]` o todas con `full`):
27
+
28
+ ### 1. Headline (titular)
29
+ - 220 caracteres. No solo el puesto: **rol + valor + keywords**.
30
+ - Patrón: `{Rol} | {especialidad/stack} | {valor o a quién ayudás}`.
31
+ - Las keywords del headline pesan fuerte en el ranking de búsqueda.
32
+
33
+ ### 2. About (sección "Acerca de")
34
+ - Primera 2–3 líneas son las que se ven sin "ver más": que enganchen.
35
+ - Estructura: gancho → qué hacés y para quién → 2–3 logros con número → stack/keywords → CTA suave.
36
+ - Primera persona, tono humano, escaneable (párrafos cortos o bullets).
37
+
38
+ ### 3. Experiencia con KPIs
39
+ - Cada rol con bullets de **logros cuantificables**, no responsabilidades.
40
+ - Mismo principio que el CV: verbo de acción + métrica + impacto.
41
+ - Incluí keywords de tu industria/rol en los bullets.
42
+
43
+ ### 4. Keywords estratégicas (LinkedIn SEO)
44
+ - Identificá las keywords que los recruiters de tu rol buscan.
45
+ - Distribuilas en headline, About, experiencia, y la sección Skills.
46
+ - Las **Skills** (hasta 50, fijá las 3 top) alimentan el match con búsquedas y endorsements.
47
+
48
+ ### 5. Propuesta de valor única
49
+ - Qué te diferencia: combinación de skills, dominio, resultados. Una frase clara que sintetiza "por qué vos".
50
+
51
+ ### 6. Pitch de 30 segundos
52
+ - Versión hablada de tu propuesta de valor: quién sos, qué hacés/resolvés, qué buscás. Para mensajes, networking y el "contame de vos".
53
+
54
+ ### 7. Review ATS / searchability
55
+ - Foto profesional, banner, URL personalizada, "Open to work" configurado (público o solo-recruiters), ubicación y rol objetivo seteados.
56
+ - Perfil completo = más alcance (LinkedIn premia completitud).
57
+ - Sin gaps inexplicados; títulos consistentes con cómo se busca el rol.
58
+
59
+ ## Proceso
60
+
61
+ 1. Leer el perfil maestro + lo que el usuario pega de su LinkedIn actual.
62
+ 2. Definir el/los **rol(es) objetivo** y sus keywords (reusá `cv-tailor/references/ats-keywords.md` para el método).
63
+ 3. Generar el contenido optimizado por sección (la/s que pida).
64
+ 4. Entregar listo para copiar/pegar + un checklist de la review (área 7).
65
+ 5. Opcional: guardar el output en `01-Perfiles/LinkedIn.md` para versionarlo.
66
+
67
+ ## Idioma
68
+
69
+ LinkedIn en **inglés** si apuntás a roles internacionales (mayor alcance), español si tu mercado es local. Se puede tener el About bilingüe.
70
+
71
+ ## Reglas
72
+
73
+ - No inventar logros ni métricas — todo debe ser defendible.
74
+ - Keywords naturales, no stuffing.
75
+ - Recordar que no se puede acceder/editar LinkedIn: el output es para copiar/pegar.
76
+
77
+ ## Handoff
78
+
79
+ Pedí aprobación (approval) antes de escribir `01-Perfiles/LinkedIn.md`. Cuando el contenido está READY para copiar/pegar, un buen siguiente paso es `/portfolio-site` para alinear el portfolio web.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: master-profile
3
+ description: "Build and maintain the master professional profile — the single source of truth (experience, skills with levels, projects, education, references, bios) that every CV, LinkedIn profile and portfolio derives from. Triggers: perfil maestro, master resume, cronologia laboral, single source of truth CV, mi experiencia profesional."
4
+ argument-hint: "[build | update | derive <role>]"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # Master Profile — Single Source of Truth
11
+
12
+ Construís y mantenés el **perfil maestro**: el documento del que derivan todos los CVs, el LinkedIn y el portfolio. La regla de oro: **si algo cambia, se cambia acá primero** y de acá se sincroniza al resto.
13
+
14
+ Vive en `01-Perfiles/Perfil Maestro.md` dentro del career workspace. Los perfiles por rol (`Backend.md`, `Frontend.md`, etc.) son **vistas filtradas** del maestro, no fuentes independientes.
15
+
16
+ ## Por qué existe
17
+
18
+ Mantener N CVs sincronizados a mano es la causa #1 de errores (fechas que no coinciden, logros que faltan en una versión). Con un maestro: editás un lado, derivás el resto. `/cv-tailor`, `/linkedin-optimize` y `/portfolio-site` consumen este archivo.
19
+
20
+ ## Estructura del perfil maestro
21
+
22
+ Generá el archivo con estas secciones (todas las que apliquen):
23
+
24
+ 1. **Personal info** — nombre, display name, headline actual, ubicación, email público vs personal, teléfono, LinkedIn, GitHub, portfolio. (El email *público* puede diferir del personal.)
25
+ 2. **Bios** — tres largos: corto (hero/one-liner), medio (2–3 oraciones para "About"), largo (about page completo).
26
+ 3. **Work experience** (más reciente primero) — por cada rol: empresa, período, ubicación/modalidad, producto, stack, manager/referencia, y **bullets de logros con número→contexto→resultado**.
27
+ 4. **Education** — institución, período, foco.
28
+ 5. **Certifications** — nombre, año, estado (completo/in progress).
29
+ 6. **Skills consolidados con nivel** — agrupados (lenguajes, frameworks, infra, tooling) con nivel (Expert/Advanced/Proficient/…) y opcionalmente % para el portfolio.
30
+ 7. **Projects** — tech, rol, highlights, link en vivo.
31
+ 8. **Achievements / highlights** — premios, showcases, hitos.
32
+ 9. **Languages** — idioma + nivel.
33
+ 10. **References** — nombre, rol, relación, contacto.
34
+
35
+ ## Modos
36
+
37
+ ### `build` — Crear el maestro desde cero
38
+ 1. Si no existe el workspace, sugerir `/job-hunt setup` primero.
39
+ 2. Recolectar info por sección — preferí **entrevistar al usuario por bloques** (no un cuestionario gigante). Empezá por experiencia y skills.
40
+ 3. Para cada logro, empujar a la forma **cuantificable**: "¿qué número podés ponerle? ¿comparado con qué? ¿qué resultado tuvo?". Un bullet sin métrica es una oportunidad perdida.
41
+ 4. Escribir `01-Perfiles/Perfil Maestro.md`.
42
+ 5. Sugerir derivar el primer perfil por rol: `/master-profile derive <role>`.
43
+
44
+ ### `update` — Mantener al día
45
+ 1. Leer el maestro actual.
46
+ 2. Aplicar el cambio (nuevo rol, nuevo logro, ascenso, proyecto).
47
+ 3. **Avisar qué derivados quedan desactualizados** (CVs por rol, LinkedIn, portfolio) y ofrecer re-derivarlos.
48
+
49
+ ### `derive <role>` — Vista por rol
50
+ 1. Leer el maestro.
51
+ 2. Crear/actualizar `01-Perfiles/<Role>.md` con el template `Perfil` (ver `Templates/Perfil.md`): filtrar y reordenar la experiencia/skills/proyectos hacia ese rol, definir keywords objetivo, score mínimo y mercado.
52
+ 3. Este perfil por rol es el `perfil_base` que después usa `/cv-tailor`.
53
+
54
+ ## Principios de redacción
55
+
56
+ - **Logros, no responsabilidades.** "Reduje latencia de servidor 25%" > "Encargado del servidor".
57
+ - **Verbos de acción + métrica + impacto.** Owned, shipped, led, reduced, increased, scaled.
58
+ - **Verdad verificable.** Nada que no puedas defender en una entrevista.
59
+ - **Inglés para roles internacionales**, español cuando aplique. El maestro puede tener los valores en inglés (van directo a CV/portfolio) y las meta-notas en español.
60
+
61
+ ## Reglas
62
+
63
+ - Una sola fuente de verdad: no dejar que un CV por rol "evolucione" por fuera del maestro.
64
+ - No inventar logros ni métricas — si el usuario no tiene el número, marcarlo como pendiente, no fabricarlo.
65
+ - Separar email público de personal; no exponer datos sensibles en archivos que vayan a un remoto.
66
+
67
+ ## Handoff
68
+
69
+ Confirmá con el usuario (approval) antes de escribir el perfil maestro o pisar derivados. Cuando el maestro está READY, derivá perfiles por rol y seguí con `/cv-tailor`, `/linkedin-optimize` o `/portfolio-site`.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: network-map
3
+ description: "Turn your LinkedIn connections data export into warm-intro intelligence: find your 1st-degree contacts at a target company, identify likely warm-intro paths, and draft a tailored outreach message per contact. Triggers: red de contactos, networking LinkedIn, contactos en una empresa, warm intro, referido, quien conozco en, LinkedIn connections export."
4
+ argument-hint: "[company] | import <path-to-Connections.csv>"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit
8
+ ---
9
+
10
+ # Network Map — Inteligencia de contactos para warm intros
11
+
12
+ Convertís el **export de conexiones de LinkedIn** en inteligencia accionable: dado un target company, quién de tu red 1er-grado trabaja (o trabajó) ahí, quién puede darte un warm intro, y un mensaje custom por contacto. Reemplaza a LinkedIn Premium para esto: solo necesitás tu propio export + Claude.
13
+
14
+ ## Conseguir el export (una vez)
15
+
16
+ En LinkedIn → **Settings → Data Privacy → Get a copy of your data → Download**. En el ZIP viene `Connections.csv` (tus 1er-grado con nombre, URL, empresa, posición, fecha de conexión). Pasáselo a la skill.
17
+
18
+ > **Privacidad:** `Connections.csv` es data personal de terceros. Guardalo en `05-Contactos/` del workspace y **nunca** lo commitees a un remoto. Trabajalo localmente.
19
+
20
+ ## Qué produce
21
+
22
+ Dado un target company:
23
+ 1. **1er-grado en la empresa** — contactos tuyos que trabajan ahí ahora (match por `Company`).
24
+ 2. **Paths de warm intro** — contactos 1er-grado que probablemente conozcan gente del target (ej. ex-empleados de la empresa, gente del mismo rubro/rol) y podrían presentarte. *Nota honesta:* el export solo tiene tus 1er-grado; el verdadero 2do-grado (las conexiones de ellos) no está en el archivo. Lo que hacemos es **inferir** buenos candidatos a intro desde tus 1er-grado (empleo actual/pasado en el target, overlap de empresa/rol), no leer la red de cada uno.
25
+ 3. **Mensaje por contacto** — template custom según historia compartida (misma empresa pasada, mismo rubro, conexión vieja vs reciente).
26
+
27
+ ## El motor
28
+
29
+ `scripts/network_map.py` parsea `Connections.csv` (maneja el preámbulo del export) y filtra/rankea por empresa.
30
+
31
+ ```bash
32
+ # Contactos en una empresa
33
+ python scripts/network_map.py --csv "05-Contactos/Connections.csv" --company "Acme"
34
+
35
+ # Top empresas donde tenés más contactos (descubrir oportunidades)
36
+ python scripts/network_map.py --csv "05-Contactos/Connections.csv" --top-companies
37
+ ```
38
+
39
+ Devuelve nombre, posición, empresa, URL del perfil y fecha de conexión. Vos (Claude) tomás esa salida y armás los paths de intro y los mensajes.
40
+
41
+ ## Modos
42
+
43
+ ### `import <path>` — Registrar el export
44
+ Copiar/referenciar `Connections.csv` en `05-Contactos/`, verificar que parsea (corré el script con `--top-companies`), y reportar tamaño de la red + top empresas.
45
+
46
+ ### `[company]` — Mapear una empresa
47
+ 1. Correr el script filtrando por la empresa.
48
+ 2. Clasificar: 1er-grado actuales en la empresa vs candidatos a warm-intro (ex-empleados / mismo rubro).
49
+ 3. Priorizar por relevancia (seniority/rol vs tu objetivo) y calidez (conexión reciente, historia compartida).
50
+ 4. Draftear un mensaje por contacto top (apoyate en `/cold-outreach` para el tono y los templates).
51
+ 5. Guardar contactos relevantes como notas en `05-Contactos/` (template `Contacto`).
52
+
53
+ ## Reglas
54
+
55
+ - Data de terceros: tratamiento local, nunca a un remoto sin confirmación; respetá privacidad.
56
+ - No inventar relaciones ni 2do-grado que el export no soporta — sé explícito sobre qué es dato y qué es inferencia.
57
+ - Calidad sobre cantidad: 5 contactos bien elegidos > 50 mensajes genéricos.
58
+
59
+ ## Handoff
60
+
61
+ Pedí aprobación (approval) antes de escribir notas de contacto o copiar el CSV al workspace. Cuando el mapa está READY, el siguiente paso es `/cold-outreach` para redactar los mensajes y agendar follow-ups.
@@ -0,0 +1,109 @@
1
+ """
2
+ network_map.py — Parse a LinkedIn "Connections.csv" data export and query it.
3
+
4
+ LinkedIn's export prepends a few notice lines before the real CSV header
5
+ (First Name, Last Name, URL, Email Address, Company, Position, Connected On).
6
+ This script skips that preamble, then lets you:
7
+
8
+ # contacts at a target company (substring, case-insensitive)
9
+ python network_map.py --csv Connections.csv --company "Acme"
10
+
11
+ # companies where you have the most connections
12
+ python network_map.py --csv Connections.csv --top-companies [N]
13
+
14
+ Output is a simple table to stdout. The skill turns it into intro paths
15
+ and tailored messages — this script only does the data wrangling.
16
+
17
+ Privacy: Connections.csv is third-party personal data. Keep it local.
18
+ """
19
+
20
+ import argparse
21
+ import csv
22
+ import sys
23
+ from collections import Counter
24
+ from pathlib import Path
25
+
26
+ EXPECTED_COLS = {"First Name", "Last Name", "Company", "Position"}
27
+
28
+
29
+ def load_rows(csv_path):
30
+ """Read the export, skipping the notice preamble before the header row."""
31
+ raw = Path(csv_path).read_text(encoding="utf-8", errors="replace").splitlines()
32
+ header_idx = None
33
+ for i, line in enumerate(raw):
34
+ # The real header contains these column names.
35
+ if "First Name" in line and "Last Name" in line:
36
+ header_idx = i
37
+ break
38
+ if header_idx is None:
39
+ print("[ERROR] Could not find the CSV header (First Name, Last Name, ...).")
40
+ print(" Is this the LinkedIn Connections.csv export?")
41
+ sys.exit(1)
42
+
43
+ reader = csv.DictReader(raw[header_idx:])
44
+ rows = []
45
+ for r in reader:
46
+ rows.append({k.strip(): (v or "").strip() for k, v in r.items() if k})
47
+ return rows
48
+
49
+
50
+ def fullname(r):
51
+ return f"{r.get('First Name', '')} {r.get('Last Name', '')}".strip()
52
+
53
+
54
+ def query_company(rows, company):
55
+ needle = company.lower()
56
+ hits = [r for r in rows if needle in r.get("Company", "").lower()]
57
+ hits.sort(key=lambda r: r.get("Connected On", ""), reverse=True)
58
+ if not hits:
59
+ print(f"No 1st-degree connections matched company '{company}'.")
60
+ return
61
+ print(f"{len(hits)} connection(s) matching '{company}':\n")
62
+ for r in hits:
63
+ print(f"- {fullname(r)} - {r.get('Position','?')} @ {r.get('Company','?')}")
64
+ url = r.get("URL", "")
65
+ if url:
66
+ print(f" {url}")
67
+ if r.get("Connected On"):
68
+ print(f" connected: {r['Connected On']}")
69
+
70
+
71
+ def top_companies(rows, n):
72
+ counts = Counter(r.get("Company", "") for r in rows if r.get("Company"))
73
+ print(f"Total connections: {len(rows)}")
74
+ print(f"Distinct companies: {len(counts)}\n")
75
+ print(f"Top {n} companies by connection count:")
76
+ for company, c in counts.most_common(n):
77
+ print(f" {c:>4} {company}")
78
+
79
+
80
+ def main():
81
+ ap = argparse.ArgumentParser(description="Query a LinkedIn Connections.csv export.")
82
+ ap.add_argument("--csv", required=True, help="path to Connections.csv")
83
+ ap.add_argument("--company", help="filter connections by company (substring)")
84
+ ap.add_argument(
85
+ "--top-companies",
86
+ nargs="?",
87
+ const=20,
88
+ type=int,
89
+ help="list the top N companies by connection count (default 20)",
90
+ )
91
+ args = ap.parse_args()
92
+
93
+ if not Path(args.csv).exists():
94
+ print(f"[ERROR] Not found: {args.csv}")
95
+ sys.exit(1)
96
+
97
+ rows = load_rows(args.csv)
98
+
99
+ if args.company:
100
+ query_company(rows, args.company)
101
+ elif args.top_companies is not None:
102
+ top_companies(rows, args.top_companies)
103
+ else:
104
+ # default: overview
105
+ top_companies(rows, 20)
106
+
107
+
108
+ if __name__ == "__main__":
109
+ main()
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: personal-brand
3
+ description: "Build a job-search personal brand on LinkedIn: generate a sequenced backlog of post ideas across credibility pillars (1 post/day) that builds authority before outreach. Triggers: marca personal, personal brand, contenido LinkedIn, post ideas LinkedIn, calendario de contenido, autoridad LinkedIn, 1 post por dia, construir audiencia para buscar trabajo."
4
+ argument-hint: "[plan | ideas <N> | draft <idea>]"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit
8
+ ---
9
+
10
+ # Personal Brand — Autoridad en LinkedIn para la búsqueda
11
+
12
+ Construís una marca personal en LinkedIn orientada a conseguir trabajo: un backlog **secuenciado** de ideas de post (ritmo 1/día) que construye autoridad y credibilidad *antes* de salir a hacer outreach, de modo que cuando escribas a un recruiter ya tengan contexto de quién sos.
13
+
14
+ Trabajás contra el **perfil maestro** (`01-Perfiles/`) y el rol/empresas objetivo. Output: un plan de contenido en `01-Perfiles/Personal Brand.md` (o `07-Recursos/`).
15
+
16
+ ## Los 4 pilares
17
+
18
+ 1. **Builder credibility** — qué construiste/entregaste, con resultados. Demuestra que hacés, no solo que sabés.
19
+ 2. **Lessons from current role** — aprendizajes concretos del trabajo actual/reciente (técnicos y de proceso).
20
+ 3. **POVs on your domain** — opiniones/tendencias de tu dominio. Te posiciona como alguien que piensa, no solo ejecuta.
21
+ 4. **Behind-the-scenes of the job search** — el viaje de la búsqueda (en su justa medida): genera cercanía y a veces atrae oportunidades directas.
22
+
23
+ Ver `references/post-pillars.md` para ángulos, hooks y formatos por pilar.
24
+
25
+ ## Modos
26
+
27
+ ### `plan` — Backlog de 90 ideas secuenciadas
28
+ 1. Confirmar rol objetivo, empresas y los temas donde el usuario tiene autoridad real (del perfil maestro).
29
+ 2. Generar **90 ideas** repartidas en los 4 pilares. Cada idea = **hook + ángulo + formato** (texto, carrusel, lista, story, hot-take).
30
+ 3. **Secuenciar**: los primeros ~30 días priorizan pilares 1–3 (construir autoridad); recién después meter más del pilar 4 y empujar el outreach. La autoridad va antes que el pedido.
31
+ 4. Entregar como tabla/calendario (día → idea → pilar → formato).
32
+
33
+ ### `ideas <N>` — Lote de N ideas
34
+ Generar N ideas frescas para un pilar o tema puntual, mismo formato hook+ángulo+formato.
35
+
36
+ ### `draft <idea>` — Escribir un post
37
+ Convertir una idea en un post listo para publicar: hook fuerte en la primera línea, cuerpo escaneable, CTA o pregunta de cierre. Tono humano, sin clichés de LinkedIn ("I'm humbled to announce…").
38
+
39
+ ## Principios
40
+
41
+ - **Hook primero.** La primera línea decide si lo leen (en el feed se ve cortado). Específico, con tensión o número.
42
+ - **Mostrar, no proclamar.** "Reduje el deploy de 40min a 4" > "Soy bueno en CI/CD".
43
+ - **Una idea por post.** Foco.
44
+ - **Consistencia > perfección.** El plan asume ritmo sostenible; mejor 1/día simple que 1/semana elaborado.
45
+ - **Autoridad antes que pedido.** No arranques pidiendo trabajo; primero aportá valor.
46
+ - **Verdad.** Nada de logros inflados — la audiencia y los recruiters lo notan.
47
+
48
+ ## Idioma
49
+
50
+ Según tu audiencia objetivo: inglés para alcance internacional, español si tu mercado es local. Se puede alternar.
51
+
52
+ ## Handoff
53
+
54
+ Pedí aprobación (approval) antes de escribir el plan en el workspace. Cuando el backlog está READY, combinalo con `/linkedin-optimize` (perfil a tono con el contenido) y, tras ~30 días de autoridad, con `/cold-outreach` para el outreach.
@@ -0,0 +1,66 @@
1
+ # Post Pillars — Ángulos, hooks y formatos
2
+
3
+ Guía para generar ideas con sustancia por cada uno de los 4 pilares. Cada idea final = **hook + ángulo + formato**.
4
+
5
+ ## Formatos disponibles
6
+
7
+ - **Text post corto** — 1 idea, 3–6 líneas, hook fuerte.
8
+ - **Lista / "X things"** — escaneable, alto guardado.
9
+ - **Carrusel** — paso a paso o framework (si el usuario hace slides).
10
+ - **Hot take / POV** — opinión con tensión, invita a debate.
11
+ - **Story / mini-caso** — situación → acción → resultado (mini-STAR público).
12
+ - **Pregunta** — abre conversación, sube engagement.
13
+
14
+ ## Pilar 1 — Builder credibility
15
+
16
+ Demostrar que entregás. Ángulos:
17
+ - Un problema real que resolviste + el número de impacto.
18
+ - "Cómo construí X" (decisiones técnicas, trade-offs).
19
+ - Antes/después de un sistema o métrica.
20
+ - Una herramienta/proyecto propio y por qué lo hiciste.
21
+
22
+ Hooks ejemplo: *"Bajé la latencia de matchmaking 25%. El cambio que más movió la aguja no fue el que esperaba."*
23
+
24
+ ## Pilar 2 — Lessons from current role
25
+
26
+ Aprendizajes concretos, no abstractos. Ángulos:
27
+ - Un error que cometiste y qué cambiaste.
28
+ - Algo contraintuitivo que aprendiste este trimestre.
29
+ - Una práctica de equipo que sí funciona (y por qué).
30
+ - "Lo que ojalá hubiera sabido cuando empecé con X".
31
+
32
+ Hooks ejemplo: *"Pasé 2 años optimizando lo que no importaba. Esto es lo que mido ahora."*
33
+
34
+ ## Pilar 3 — POVs on your domain
35
+
36
+ Posicionarte como alguien que piensa el dominio. Ángulos:
37
+ - Una tendencia y por qué estás de acuerdo / en contra.
38
+ - Un mito común de tu campo, desarmado.
39
+ - Predicción fundamentada sobre hacia dónde va X.
40
+ - Comparación honesta entre dos enfoques/herramientas.
41
+
42
+ Hooks ejemplo: *"Todos dicen que [tendencia]. En producción, lo que veo es otra cosa."*
43
+
44
+ ## Pilar 4 — Behind-the-scenes del job search
45
+
46
+ Cercanía + a veces atrae ofertas directas. Usar con medida (no quejas). Ángulos:
47
+ - Qué buscás y por qué (señal clara para recruiters).
48
+ - Un aprendizaje del proceso de búsqueda/entrevistas.
49
+ - Reflexión sobre qué valorás en un equipo/empresa.
50
+ - Agradecimiento o lección de una entrevista (sin nombres negativos).
51
+
52
+ Hooks ejemplo: *"Estoy buscando mi próximo rol como [rol]. Esto es exactamente lo que aporto y lo que busco."*
53
+
54
+ ## Secuenciación (90 días)
55
+
56
+ - **Días 1–30 (autoridad):** ~70% pilares 1–3, ~30% pilar 2. Casi nada de "busco trabajo" todavía — primero construís credibilidad.
57
+ - **Días 31–60 (visibilidad + señal):** introducir pilar 4 (qué buscás), mantener 1–3. Empezar outreach (`/cold-outreach`) apoyado en los posts.
58
+ - **Días 61–90 (conversión):** mezclar los 4, más casos de builder credibility, CTAs suaves hacia conversaciones.
59
+
60
+ ## Anti-patrones
61
+
62
+ - Clichés de LinkedIn ("I'm humbled/thrilled to announce…").
63
+ - Posts sin punto de vista (solo "compartiendo este artículo").
64
+ - Humblebrag vacío sin aprendizaje ni dato.
65
+ - Quejarse del proceso de búsqueda o de empresas con nombre.
66
+ - Más de una idea por post.
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: portfolio-site
3
+ description: "Build or update a personal portfolio website from a single source-of-truth profile. Two modes: sync content into an existing portfolio repo, or scaffold a new portfolio site. Triggers: portfolio web, pagina personal, actualizar portfolio, sincronizar portfolio, crear portfolio, sitio personal de desarrollador, portfolio React."
4
+ argument-hint: "[sync | scaffold] [repo-path | --new]"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit, WebFetch
8
+ ---
9
+
10
+ # Portfolio Site — Portfolio web desde el source-of-truth
11
+
12
+ Generás o actualizás un **portfolio web personal** a partir de un único source-of-truth (`portfolio/Datos Portfolio Web.md` en el career workspace, derivado del perfil maestro). La regla: **el contenido se edita primero en el `.md`** y de ahí se sincroniza al sitio.
13
+
14
+ ## El source-of-truth
15
+
16
+ `portfolio/Datos Portfolio Web.md` contiene, en una estructura estable, todo lo que va al sitio: personal info (con email **público** separado del personal), bios (corto/medio/largo), experiencia, educación, certificaciones, skills con niveles/%, proyectos (con links en vivo), achievements, idiomas, referencias. Si no existe, derivalo del perfil maestro (`/master-profile`).
17
+
18
+ Convención: **valores en inglés** (van directo al sitio) y meta-instrucciones en español.
19
+
20
+ ## Modos
21
+
22
+ ### `sync` — Actualizar un portfolio existente
23
+ Para cuando ya hay un repo de portfolio (ej. una React SPA con el contenido en `src/pages/*.js`, `src/data/*`, o similar).
24
+
25
+ 1. Leer el source-of-truth y el repo destino.
26
+ 2. Mapear cada sección del `.md` a dónde vive en el sitio (componentes/datos).
27
+ 3. Detectar **drift**: qué está desactualizado en el sitio vs el `.md` (roles nuevos, fechas, proyectos, nivel de idioma). El source-of-truth manda.
28
+ 4. Aplicar los cambios al sitio respetando su arquitectura y estilo de código existentes.
29
+ 5. Verificar (build/preview) y resumir el diff.
30
+
31
+ ### `scaffold` — Crear un portfolio nuevo
32
+ Para cuando no hay sitio todavía.
33
+
34
+ 1. Preguntar el stack preferido (default sugerido: **sitio estático simple** — HTML/CSS o un framework liviano como Astro/Vite — fácil de hostear en GitHub Pages/Netlify).
35
+ 2. Preguntar secciones deseadas (hero, about, experiencia, proyectos, skills, contacto).
36
+ 3. Generar el proyecto consumiendo el source-of-truth como contenido.
37
+ 4. Configurar deploy (GitHub Pages / Netlify) si el usuario quiere.
38
+ 5. Documentar cómo correr `sync` a futuro.
39
+
40
+ ## Secciones típicas
41
+
42
+ - **Hero** — nombre, headline, bio corto, links (GitHub/LinkedIn/email público).
43
+ - **About** — bio medio/largo.
44
+ - **Experience** — roles con highlights.
45
+ - **Projects** — los destacados, con tech, descripción corta y link en vivo.
46
+ - **Skills** — agrupados, con nivel/%.
47
+ - **Contact** — email **público** (nunca el personal), formulario o links.
48
+
49
+ ## Reglas
50
+
51
+ - **El `.md` es la fuente.** Nunca editar el sitio sin reflejarlo en el source-of-truth (si no, vuelve el drift).
52
+ - Email **público** en el sitio, jamás el personal/teléfono.
53
+ - Respetar la arquitectura y el estilo del repo existente en modo `sync` — no reescribir todo.
54
+ - En `scaffold`, mantenerlo simple y rápido de hostear salvo que el usuario pida otra cosa.
55
+ - No subir datos sensibles; el portfolio es público.
56
+
57
+ ## Handoff
58
+
59
+ Pedí aprobación (approval) antes de escribir en el repo del portfolio o scaffoldear un sitio nuevo. Cuando el sitio está READY/sincronizado, volvé a `/job-hunt status` para seguir con las aplicaciones.