claude-code-arcane 1.2.0 → 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.
- package/CHANGELOG.md +9 -0
- package/README.md +2 -0
- package/agents/engineering/dotnet-engineer.md +78 -0
- package/docs/SKILLS-CATALOG.md +26 -3
- package/package.json +1 -1
- package/profiles/backend-dotnet.yaml +54 -0
- package/profiles/job-hunt.yaml +35 -0
- package/profiles/unity-design.yaml +1 -0
- package/profiles/unity-dev.yaml +1 -0
- package/rules/dotnet-code.md +64 -0
- package/skills/cold-outreach/SKILL.md +65 -0
- package/skills/cold-outreach/references/recruiter-playbook.md +65 -0
- package/skills/cover-letter/SKILL.md +66 -0
- package/skills/cv-ats-export/SKILL.md +64 -0
- package/skills/cv-ats-export/scripts/cv_export.py +306 -0
- package/skills/cv-tailor/SKILL.md +70 -0
- package/skills/cv-tailor/references/ats-keywords.md +46 -0
- package/skills/dotnet-architecture/SKILL.md +66 -0
- package/skills/dotnet-architecture/references/anti-patterns.md +12 -0
- package/skills/dotnet-architecture/references/checklist.md +19 -0
- package/skills/dotnet-architecture/references/patterns.md +118 -0
- package/skills/dotnet-architecture/references/project-structure.md +78 -0
- package/skills/dotnet-best-practices/SKILL.md +76 -0
- package/skills/dotnet-best-practices/references/api-design.md +75 -0
- package/skills/dotnet-best-practices/references/architecture.md +62 -0
- package/skills/dotnet-best-practices/references/async.md +62 -0
- package/skills/dotnet-best-practices/references/database.md +69 -0
- package/skills/dotnet-best-practices/references/dependency-injection.md +73 -0
- package/skills/dotnet-best-practices/references/devops.md +76 -0
- package/skills/dotnet-best-practices/references/error-handling.md +72 -0
- package/skills/dotnet-best-practices/references/performance.md +63 -0
- package/skills/dotnet-best-practices/references/security.md +73 -0
- package/skills/dotnet-best-practices/references/testing.md +76 -0
- package/skills/dotnet-scaffold/SKILL.md +99 -0
- package/skills/install-mcp/SKILL.md +107 -0
- package/skills/install-mcp/references/manual-setup.md +92 -0
- package/skills/interview-prep/SKILL.md +69 -0
- package/skills/interview-prep/references/star-framework.md +42 -0
- package/skills/job-hunt/SKILL.md +92 -0
- package/skills/job-hunt/references/templates/Aplicacion.md +48 -0
- package/skills/job-hunt/references/templates/CV Custom.md +53 -0
- package/skills/job-hunt/references/templates/Contacto.md +30 -0
- package/skills/job-hunt/references/templates/Dashboard.md +45 -0
- package/skills/job-hunt/references/templates/Empresa.md +36 -0
- package/skills/job-hunt/references/templates/Entrevista.md +44 -0
- package/skills/job-hunt/references/templates/Perfil.md +38 -0
- package/skills/job-search/SKILL.md +83 -0
- package/skills/job-search/references/scoring-rubric.md +43 -0
- package/skills/linkedin-optimize/SKILL.md +79 -0
- package/skills/master-profile/SKILL.md +69 -0
- package/skills/network-map/SKILL.md +61 -0
- package/skills/network-map/scripts/network_map.py +109 -0
- package/skills/personal-brand/SKILL.md +54 -0
- package/skills/personal-brand/references/post-pillars.md +66 -0
- package/skills/portfolio-site/SKILL.md +59 -0
|
@@ -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.
|