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
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
# [1.3.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.2.0...v1.3.0) (2026-06-21)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **skills:** add .NET/C# backend skill set ([3775260](https://github.com/SebastianLuser/claude-code-arcane/commit/377526032a05c2a97790a3a4396cbeada6071c1e))
|
|
7
|
+
* **skills:** add install-mcp skill for Unity MCP setup ([5290038](https://github.com/SebastianLuser/claude-code-arcane/commit/52900386844a18d91a3c4f9135e27c2be0be396f))
|
|
8
|
+
* **skills:** add job-hunt skillset (12 skills + profile) ([d5329e2](https://github.com/SebastianLuser/claude-code-arcane/commit/d5329e211a273719ded43639aa582b98c5dfc7ac))
|
|
9
|
+
|
|
1
10
|
# [1.2.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.1.1...v1.2.0) (2026-06-19)
|
|
2
11
|
|
|
3
12
|
|
package/README.md
CHANGED
|
@@ -165,6 +165,7 @@ Once installed, manage the installation from within a Claude Code session:
|
|
|
165
165
|
| `unity-design` | Game designer — GDDs, balance, art bible, playtesting | 17 | game |
|
|
166
166
|
| `backend-ts` | Backend TypeScript — Fastify, Prisma, Zod, API design | 33 | engineering |
|
|
167
167
|
| `backend-go` | Backend Go — Clean Arch, DB, auth, API, CI | 19 | engineering |
|
|
168
|
+
| `backend-dotnet` | Backend .NET — ASP.NET Core, Vertical Slice/Clean, EF Core, JWT | 25 | engineering |
|
|
168
169
|
| `frontend` | React + Vite + TypeScript | 14 | engineering |
|
|
169
170
|
| `mobile` | React Native + Expo + TypeScript | 12 | engineering |
|
|
170
171
|
| `flutter` | Flutter + Dart cross-platform | 8 | engineering |
|
|
@@ -191,6 +192,7 @@ Once installed, manage the installation from within a Claude Code session:
|
|
|
191
192
|
| `+finance` | Investment analysis, financial modeling, SaaS metrics | 3 | business |
|
|
192
193
|
| `+marketing` | Content, growth, SEO/CRO, strategy, analytics | 44 | marketing |
|
|
193
194
|
| `+regulatory` | ISO 13485, GDPR, FDA, SOC 2, ISMS, QMS, MDR | 13 | regulatory |
|
|
195
|
+
| `+job-hunt` | Job search end-to-end — master profile, ATS CV, LinkedIn, portfolio, cover letters, outreach, interview prep | 12 | — |
|
|
194
196
|
| `+self-improving` | Agent self-improvement and skill extraction | 2 | — |
|
|
195
197
|
| `+statusline` | Claude Code status bar (branch, division, session info) | 0 | — |
|
|
196
198
|
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dotnet-engineer
|
|
3
|
+
description: "Specialist en ASP.NET Core (.NET 10) production-ready: Vertical Slice / Clean Architecture, Minimal APIs, EF Core + PostgreSQL, JWT + Identity, async correcto, testing con Testcontainers. Implementa APIs backend guiadas por backend-architect."
|
|
4
|
+
tools: Read, Glob, Grep, Write, Edit, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
maxTurns: 15
|
|
7
|
+
memory: project
|
|
8
|
+
skills: [dotnet-scaffold, dotnet-best-practices, dotnet-architecture]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Sos el **.NET Engineer**. Implementás APIs backend en ASP.NET Core (.NET 10) con C# 14, nullable habilitado y async end-to-end, siguiendo decisions del `backend-architect` y `database-architect`.
|
|
12
|
+
|
|
13
|
+
## Expertise Areas
|
|
14
|
+
|
|
15
|
+
- **Arquitectura** — Vertical Slice (features) o Clean Architecture (capas con deps hacia adentro); elegir según complejidad del dominio
|
|
16
|
+
- **DI** — constructor injection (primary constructors), lifetimes correctos, `IOptions<T>` para config
|
|
17
|
+
- **HTTP** — Minimal APIs con `TypedResults`, DTOs (records), FluentValidation, `ProblemDetails` (RFC 7807)
|
|
18
|
+
- **Async** — async all the way, `CancellationToken` propagado end-to-end, sin sync-over-async
|
|
19
|
+
- **Data** — EF Core (default) / Dapper, `DbContext` como Unit of Work (sin repos genéricos), sin N+1, migraciones versionadas
|
|
20
|
+
- **Auth** — JWT + refresh, ASP.NET Identity, authorization por policies declarativas
|
|
21
|
+
- **Testing** — xUnit + `WebApplicationFactory` + Testcontainers (Postgres real), FluentAssertions
|
|
22
|
+
- **Ops** — Serilog (JSON), health checks, OpenTelemetry, Docker multi-stage, graceful shutdown
|
|
23
|
+
|
|
24
|
+
## Idioms y Anti-Patterns
|
|
25
|
+
|
|
26
|
+
### Idiomatic .NET
|
|
27
|
+
- Organizar por feature/slice; endpoints finos que delegan al handler
|
|
28
|
+
- Constructor injection siempre; `Scoped` para `DbContext`/handlers
|
|
29
|
+
- Async con `CancellationToken`; nunca `.Result`/`.Wait()`
|
|
30
|
+
- `ProblemDetails` consistente; Result pattern para fallos esperados
|
|
31
|
+
- DTOs en el borde; nunca exponer entidades EF
|
|
32
|
+
|
|
33
|
+
### Anti-Patterns
|
|
34
|
+
- `IRepository<T>` / `IUnitOfWork` genérico sobre EF Core
|
|
35
|
+
- Lógica de negocio en controllers/endpoints
|
|
36
|
+
- `.Result` / `.Wait()` (sync-over-async) → deadlocks
|
|
37
|
+
- `EnsureCreated()` en producción en vez de migraciones
|
|
38
|
+
- Service locator / `BuildServiceProvider()` en runtime
|
|
39
|
+
- N+1 por falta de `Include`/proyección
|
|
40
|
+
- `Domain` dependiendo de `Infrastructure` / EF Core
|
|
41
|
+
|
|
42
|
+
## Stack Defaults
|
|
43
|
+
|
|
44
|
+
| Componente | Default |
|
|
45
|
+
|------------|---------|
|
|
46
|
+
| Runtime | .NET 10 LTS (C# 14) |
|
|
47
|
+
| Framework | ASP.NET Core — Minimal APIs |
|
|
48
|
+
| Arquitectura | Vertical Slice (Clean opcional) |
|
|
49
|
+
| ORM | EF Core 10 |
|
|
50
|
+
| DB | PostgreSQL (Npgsql) |
|
|
51
|
+
| Auth | JWT + ASP.NET Identity |
|
|
52
|
+
| Validación | FluentValidation → ProblemDetails |
|
|
53
|
+
| Testing | xUnit + Testcontainers |
|
|
54
|
+
| Deploy | Docker |
|
|
55
|
+
|
|
56
|
+
## Code Review Bar
|
|
57
|
+
|
|
58
|
+
**Veto:**
|
|
59
|
+
- Dependencias hacia afuera (Domain → Infrastructure/EF Core)
|
|
60
|
+
- Constructor injection ausente / service locator en runtime
|
|
61
|
+
- Sync-over-async (`.Result`/`.Wait()`)
|
|
62
|
+
- `CancellationToken` no propagado en operaciones I/O
|
|
63
|
+
- Endpoints sin validación / sin `ProblemDetails`
|
|
64
|
+
- Auth/authz manual en vez de policies
|
|
65
|
+
- `EnsureCreated()` contra prod / secrets en `appsettings.json`
|
|
66
|
+
- N+1 queries evitables; entidades EF expuestas como respuesta
|
|
67
|
+
|
|
68
|
+
**Comment-only:**
|
|
69
|
+
- Repo genérico innecesario sobre EF Core
|
|
70
|
+
- Handler con múltiples responsabilidades
|
|
71
|
+
- Logging no estructurado
|
|
72
|
+
- Falta de `AsNoTracking()` en lecturas
|
|
73
|
+
|
|
74
|
+
## Delegation Map
|
|
75
|
+
|
|
76
|
+
**Report to:** `backend-architect`, `database-architect`, `lead-programmer`.
|
|
77
|
+
**Coordina con:** `e2e-tester` (cobertura e2e), `sql-specialist` (optimización de queries).
|
|
78
|
+
**No delegate down.** Tier 3 specialist.
|
package/docs/SKILLS-CATALOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Skills Catalog — Claude Code Arcane
|
|
2
2
|
|
|
3
|
-
Catalogo completo de los
|
|
3
|
+
Catalogo completo de los 321 skills disponibles para proyectos consumidores. Organizados por division.
|
|
4
4
|
|
|
5
5
|
## Como ejecutar un skill
|
|
6
6
|
|
|
@@ -70,7 +70,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
|
-
## Gamedev (
|
|
73
|
+
## Gamedev (21 skills)
|
|
74
74
|
|
|
75
75
|
| Skill | Descripcion | Uso |
|
|
76
76
|
|-------|-------------|-----|
|
|
@@ -82,6 +82,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
82
82
|
| `/consistency-check` | Detecta inconsistencias cross-documento en stats/items | `[full \| since-last \| entity:<name>]` |
|
|
83
83
|
| `/doc-gdd` | Genera Game Design Document completo | `[game-name]` |
|
|
84
84
|
| `/doc-pas` | Documentacion PAS (Problem-Analysis-Solution) | `[problem o decision title]` |
|
|
85
|
+
| `/install-mcp` | Instala y registra el MCP de Unity (CoplayDev) en el proyecto | `[--secondary] [project-path]` |
|
|
85
86
|
| `/map-systems` | Descompone concepto en sistemas, mapea dependencias | `[next \| system-name] [--review]` |
|
|
86
87
|
| `/playtest-report` | Genera o analiza reporte de playtest | `[new\|analyze path] [--review]` |
|
|
87
88
|
| `/scaffold-unity` | Scaffoldea proyecto Unity estilo Project_T | `[project-name]` |
|
|
@@ -158,7 +159,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
158
159
|
|
|
159
160
|
---
|
|
160
161
|
|
|
161
|
-
## Software (
|
|
162
|
+
## Software (48 skills)
|
|
162
163
|
|
|
163
164
|
| Skill | Descripcion | Uso |
|
|
164
165
|
|-------|-------------|-----|
|
|
@@ -181,6 +182,9 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
181
182
|
| `/distributed-tracing` | Setup de tracing distribuido | `[go\|ts\|react\|rn] [gcp\|tempo\|datadog]` |
|
|
182
183
|
| `/doc-rfc` | Genera RFC tecnico estilo Alizia-BE | `[rfc-title o feature]` |
|
|
183
184
|
| `/docker-setup` | Dockerfiles + docker-compose multi-stage | `[go\|ts\|react\|rn] [--dev\|--prod]` |
|
|
185
|
+
| `/dotnet-architecture` | Arquitectura .NET: Vertical Slice y Clean Architecture | `[vertical-slice\|clean\|when-to-use]` |
|
|
186
|
+
| `/dotnet-best-practices` | ASP.NET Core best practices: 40 reglas priorizadas | `[architecture\|di\|security\|performance\|all]` |
|
|
187
|
+
| `/dotnet-scaffold` | Scaffold ASP.NET Core: .NET 10, EF Core, Postgres, JWT | `[project-name]` |
|
|
184
188
|
| `/file-uploads` | Implementacion de file uploads | `[go\|ts\|react\|rn]` |
|
|
185
189
|
| `/form-validation` | Validacion de forms: RHF + Zod | `[react\|rn] [form-name]` |
|
|
186
190
|
| `/go-clean-architecture` | Clean architecture en Go | `[module o feature]` |
|
|
@@ -428,6 +432,25 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
428
432
|
|
|
429
433
|
---
|
|
430
434
|
|
|
435
|
+
## Job Hunt (12 skills)
|
|
436
|
+
|
|
437
|
+
| Skill | Descripcion | Uso |
|
|
438
|
+
|-------|-------------|-----|
|
|
439
|
+
| `/job-hunt` | Entry point: crea/gestiona el career workspace (perfiles, CVs, aplicaciones, empresas, contactos, entrevistas) y rutea | `[setup\|status\|next]` |
|
|
440
|
+
| `/master-profile` | Perfil maestro single-source-of-truth del que derivan CVs, LinkedIn y portfolio | `[build\|update\|derive <role>]` |
|
|
441
|
+
| `/cv-tailor` | Adapta el CV a una oferta: keywords ATS, que resaltar/bajar, reescritura de highlights | `[job-url\|jd-path\|application]` |
|
|
442
|
+
| `/cv-ats-export` | Markdown -> PDF ATS-compliant (una columna, texto seleccionable) via Chrome/Edge headless | `[cv-name\|all] [--workspace <path>]` |
|
|
443
|
+
| `/linkedin-optimize` | Optimiza LinkedIn: headline, About, experiencia con KPIs, keywords, value prop, pitch 30s | `[section\|full]` |
|
|
444
|
+
| `/portfolio-site` | Genera/actualiza portfolio web desde el source-of-truth | `[sync\|scaffold] [repo\|--new]` |
|
|
445
|
+
| `/job-search` | Busca, scorea y prioriza ofertas + plan de busqueda de 7 dias | `[search <query>\|score <url>\|plan]` |
|
|
446
|
+
| `/cover-letter` | Cover letters y mensajes de aplicacion concisos y custom | `[application\|company + role]` |
|
|
447
|
+
| `/cold-outreach` | Mensajes en frio a recruiters/hiring managers + follow-ups post-aplicacion | `[contact\|recruiter + company]` |
|
|
448
|
+
| `/interview-prep` | Prep de entrevista: research, banco de preguntas, respuestas STAR, red flags | `[application\|company + role + round]` |
|
|
449
|
+
| `/network-map` | Convierte el export de conexiones de LinkedIn en contactos por empresa + warm intros + mensajes | `[company] \| import <Connections.csv>` |
|
|
450
|
+
| `/personal-brand` | Backlog secuenciado de posts de LinkedIn (4 pilares) para construir autoridad antes del outreach | `[plan\|ideas <N>\|draft <idea>]` |
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
431
454
|
## Skills internos de Arcane
|
|
432
455
|
|
|
433
456
|
Estos skills son para mantener y desarrollar el propio repo Arcane:
|
package/package.json
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: backend-dotnet
|
|
2
|
+
description: "Backend .NET — ASP.NET Core (.NET 10), Vertical Slice / Clean Architecture, EF Core + PostgreSQL, JWT + Identity, testing. Best practices priorizadas por impacto."
|
|
3
|
+
type: base
|
|
4
|
+
|
|
5
|
+
skills:
|
|
6
|
+
# .NET-specific (nuevas)
|
|
7
|
+
- dotnet-scaffold
|
|
8
|
+
- dotnet-best-practices
|
|
9
|
+
- dotnet-architecture
|
|
10
|
+
# API & data
|
|
11
|
+
- database
|
|
12
|
+
- database-indexing
|
|
13
|
+
- data-migrations
|
|
14
|
+
- api-design
|
|
15
|
+
- api-docs
|
|
16
|
+
- api-versioning
|
|
17
|
+
- caching-strategy
|
|
18
|
+
- webhooks
|
|
19
|
+
- rate-limiting
|
|
20
|
+
# Auth & security
|
|
21
|
+
- auth-strategy
|
|
22
|
+
- jwt-strategy
|
|
23
|
+
- oauth-setup
|
|
24
|
+
- rbac-abac
|
|
25
|
+
- audit-log
|
|
26
|
+
# Ops & quality
|
|
27
|
+
- testing
|
|
28
|
+
- contract-testing
|
|
29
|
+
- deps-audit
|
|
30
|
+
- env-sync
|
|
31
|
+
- observability
|
|
32
|
+
- performance
|
|
33
|
+
- async-ops
|
|
34
|
+
- ci-cd-setup
|
|
35
|
+
|
|
36
|
+
rules:
|
|
37
|
+
universal:
|
|
38
|
+
- backend-code
|
|
39
|
+
- api-code
|
|
40
|
+
- dotnet-code
|
|
41
|
+
- migration-code
|
|
42
|
+
gamedev:
|
|
43
|
+
[]
|
|
44
|
+
|
|
45
|
+
agents:
|
|
46
|
+
- engineering
|
|
47
|
+
|
|
48
|
+
permissions:
|
|
49
|
+
allow:
|
|
50
|
+
- "Bash(dotnet *)"
|
|
51
|
+
- "Bash(docker ps*)"
|
|
52
|
+
- "Bash(docker images*)"
|
|
53
|
+
deny:
|
|
54
|
+
[]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: job-hunt
|
|
2
|
+
description: "Job Hunt — busqueda laboral end-to-end: perfil maestro, CV ATS, LinkedIn, portfolio, cover letters, outreach a recruiters, scoring de ofertas y prep de entrevistas"
|
|
3
|
+
type: addon
|
|
4
|
+
|
|
5
|
+
skills:
|
|
6
|
+
- job-hunt
|
|
7
|
+
- master-profile
|
|
8
|
+
- cv-tailor
|
|
9
|
+
- cv-ats-export
|
|
10
|
+
- linkedin-optimize
|
|
11
|
+
- portfolio-site
|
|
12
|
+
- job-search
|
|
13
|
+
- cover-letter
|
|
14
|
+
- cold-outreach
|
|
15
|
+
- interview-prep
|
|
16
|
+
- network-map
|
|
17
|
+
- personal-brand
|
|
18
|
+
|
|
19
|
+
rules:
|
|
20
|
+
universal:
|
|
21
|
+
[]
|
|
22
|
+
gamedev:
|
|
23
|
+
[]
|
|
24
|
+
|
|
25
|
+
agents:
|
|
26
|
+
[]
|
|
27
|
+
|
|
28
|
+
permissions:
|
|
29
|
+
allow:
|
|
30
|
+
- "Bash(python *cv_export.py*)"
|
|
31
|
+
- "Bash(python3 *cv_export.py*)"
|
|
32
|
+
- "Bash(python *network_map.py*)"
|
|
33
|
+
- "Bash(python3 *network_map.py*)"
|
|
34
|
+
deny:
|
|
35
|
+
[]
|
package/profiles/unity-dev.yaml
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cs"
|
|
4
|
+
- "**/*.csproj"
|
|
5
|
+
- "**/Program.cs"
|
|
6
|
+
- "**/*.Tests.cs"
|
|
7
|
+
- "src/**"
|
|
8
|
+
- "tests/**"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# .NET / C# Code Rules
|
|
12
|
+
|
|
13
|
+
Reglas production-ready para ASP.NET Core (.NET 10), ordenadas por impacto. Catálogo completo (40 reglas, 10 categorías) + ejemplos incorrecto/correcto: skill `dotnet-best-practices`. Estructura de proyecto: skill `dotnet-architecture`.
|
|
14
|
+
|
|
15
|
+
## CRITICAL — Arquitectura & DI
|
|
16
|
+
|
|
17
|
+
- **Organizar por feature (Vertical Slice)** o por capas con dependencias hacia adentro (Clean) — nunca un `Services/` + `Controllers/` global gigante.
|
|
18
|
+
- **Endpoints/controllers finos** — traducen HTTP ↔ request, llaman al handler y dan shape a la respuesta. Cero lógica de negocio.
|
|
19
|
+
- **`DbContext` es Unit of Work + Repository** — no envolverlo en `IRepository<T>` / `IUnitOfWork` genérico (indirección sin valor que tapa `Include`/proyecciones).
|
|
20
|
+
- **Constructor injection (primary constructors) siempre.** Nunca service locator ni `BuildServiceProvider()` manual en `Program.cs`.
|
|
21
|
+
- **Lifetimes correctos** — `Scoped` para `DbContext`/handlers, `Singleton` solo si es stateless; nunca inyectar `Scoped` en `Singleton` (captured dependency).
|
|
22
|
+
- **`<Nullable>enable</Nullable>`** + warnings as errors; cero `#nullable disable` para silenciar.
|
|
23
|
+
|
|
24
|
+
## HIGH — Async, Error handling & Security
|
|
25
|
+
|
|
26
|
+
- **Async end-to-end.** Nunca `.Result`/`.Wait()`/`.GetAwaiter().GetResult()` (deadlocks / thread-pool starvation). Sin `async void` salvo event handlers.
|
|
27
|
+
- **Propagar `CancellationToken`** desde el endpoint hasta EF Core y llamadas HTTP. Sin fire-and-forget sin manejo de error.
|
|
28
|
+
- **Errores vía `ProblemDetails` (RFC 7807)** — `AddProblemDetails()` + `IExceptionHandler` global. Nunca filtrar stack traces. Validación → `ValidationProblemDetails`.
|
|
29
|
+
- **Result pattern para fallos esperados**, excepciones solo para lo excepcional. Sin `catch` vacíos.
|
|
30
|
+
- **JWT de vida corta + refresh**, secretos en user-secrets/Key Vault (no en `appsettings.json`). Authorization por **policies declarativas**, no checks manuales de roles.
|
|
31
|
+
- **Rate limiting** con el middleware built-in (`AddRateLimiter`). HTTPS/HSTS. No loguear data sensible.
|
|
32
|
+
|
|
33
|
+
## HIGH — Performance & Data (EF Core)
|
|
34
|
+
|
|
35
|
+
- **Evitar N+1** — `Include` o proyección a DTO con `Select`. Nunca acceder a relaciones en un loop.
|
|
36
|
+
- **`AsNoTracking()`** en lecturas read-only. `AsSplitQuery()` para `Include` grandes (evita explosión cartesiana).
|
|
37
|
+
- **Migraciones versionadas** (`dotnet ef migrations add` / `MigrateAsync()`); nunca `EnsureCreated()` en prod.
|
|
38
|
+
- **Transacciones para operaciones multi-step**; `EnableRetryOnFailure` para resiliencia de conexión (Npgsql).
|
|
39
|
+
- **Caching estratégico** (`HybridCache`/output caching) con TTL e invalidación apropiada.
|
|
40
|
+
|
|
41
|
+
## MEDIUM — API, Testing & DevOps
|
|
42
|
+
|
|
43
|
+
- **DTOs en el borde** (records) — nunca exponer entidades EF como respuestas HTTP.
|
|
44
|
+
- **API versioning** (`Asp.Versioning`) para cambios breaking; OpenAPI con `Microsoft.AspNetCore.OpenApi`.
|
|
45
|
+
- **`TypedResults`** en minimal APIs para status codes correctos y testeables.
|
|
46
|
+
- **Tests con xUnit**; integración con `WebApplicationFactory` + Postgres real (Testcontainers). No mockear `DbContext` ni usar el in-memory provider (miente sobre comportamiento relacional).
|
|
47
|
+
- **Structured logging (Serilog JSON)** + health checks (liveness/readiness). Graceful shutdown vía `IHostApplicationLifetime`.
|
|
48
|
+
- **Config por entorno** (`IOptions<T>`, `appsettings.{Environment}.json`) — nada hardcodeado.
|
|
49
|
+
|
|
50
|
+
## Anti-Patterns
|
|
51
|
+
|
|
52
|
+
- `IRepository<T>` / `IUnitOfWork` genérico sobre EF Core
|
|
53
|
+
- Lógica de negocio en controllers/endpoints
|
|
54
|
+
- `.Result` / `.Wait()` (sync-over-async) → deadlocks
|
|
55
|
+
- `EnsureCreated()` contra una DB de producción
|
|
56
|
+
- Service locator / `BuildServiceProvider()` en runtime
|
|
57
|
+
- Devolver entidades EF crudas como respuesta HTTP
|
|
58
|
+
- N+1 queries por falta de `Include`/proyección
|
|
59
|
+
- `Domain` referenciando `Infrastructure` / EF Core (dependencia hacia afuera)
|
|
60
|
+
- Forzar Clean Architecture en un CRUD simple (sobre-ingeniería)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
_Derivado de [github/awesome-copilot](https://github.com/github/awesome-copilot) (dotnet-best-practices), [dotnet/skills](https://github.com/dotnet/skills) y [ardalis/CleanArchitecture](https://github.com/ardalis/CleanArchitecture). Condensado al formato Arcane._
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cold-outreach
|
|
3
|
+
description: "Write cold LinkedIn/email messages from a job-seeker to recruiters, hiring managers and referrals — plus post-application follow-up sequences that get replies. For B2B sales outreach use cold-email instead. Triggers: mensaje en frio recruiter, escribirle a un reclutador, follow up postulacion, networking message, pedir referido, contactar hiring manager."
|
|
4
|
+
argument-hint: "[contact-note | recruiter + company]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Cold Outreach — Job-seeker → Recruiter / Hiring Manager
|
|
11
|
+
|
|
12
|
+
Escribís mensajes en frío de un **candidato** a recruiters, hiring managers y referidos, y secuencias de **follow-up** post-aplicación que reciben respuesta. Esto NO es venta B2B (para eso está `/cold-email`) — el ángulo es conseguir una conversación o un referido, sin sonar a spam ni a desesperación.
|
|
13
|
+
|
|
14
|
+
## Cuándo usar cada variante
|
|
15
|
+
|
|
16
|
+
| Situación | Mensaje |
|
|
17
|
+
|-----------|---------|
|
|
18
|
+
| Recruiter posteó un rol | Mensaje corto con fit + interés explícito |
|
|
19
|
+
| Hiring manager / futuro lead | Mensaje de valor: qué resolvés que a su equipo le importa |
|
|
20
|
+
| Pedir un referido a alguien de la empresa | Cálido, bajo compromiso, fácil de decir que sí |
|
|
21
|
+
| Networking sin rol abierto | Curiosidad genuina + algo en común, sin pedir nada todavía |
|
|
22
|
+
| Follow-up post-aplicación | Recordatorio con valor, no "¿alguna novedad?" |
|
|
23
|
+
|
|
24
|
+
## Principios
|
|
25
|
+
|
|
26
|
+
- **Personalizá la primera línea.** Algo real de esa persona/empresa/rol. Si sirve para 100 personas, no sirve para ninguna.
|
|
27
|
+
- **Corto.** LinkedIn: 50–125 palabras. La connection note: <300 caracteres.
|
|
28
|
+
- **Una pregunta / un CTA.** Bajá la fricción de responder.
|
|
29
|
+
- **Vos resolvés algo para ellos**, no "estoy buscando trabajo, ¿me ayudás?". El foco es el valor que aportás al equipo.
|
|
30
|
+
- **Sin paredes de texto, sin CV adjunto en el primer toque** (salvo que lo pidan).
|
|
31
|
+
- **Respetá el "no".** Un follow-up, máximo dos. Nunca insistir agresivo.
|
|
32
|
+
|
|
33
|
+
## Estructura de un primer mensaje
|
|
34
|
+
|
|
35
|
+
1. **Gancho personal** (1 línea): por qué *a esta persona*.
|
|
36
|
+
2. **Quién sos + fit** (1–2 líneas): rol + el logro más relevante para ellos.
|
|
37
|
+
3. **CTA suave** (1 línea): ¿15 min para charlar? / ¿abierto a una intro? / dejé mi aplicación, encantado de dar contexto.
|
|
38
|
+
|
|
39
|
+
## Secuencia de follow-up post-aplicación
|
|
40
|
+
|
|
41
|
+
- **Día 0** — aplicación enviada (+ mensaje al recruiter/hiring manager si tenés el contacto).
|
|
42
|
+
- **Día 4–5** — follow-up 1: reafirmá interés + agregá *algo nuevo* (un proyecto relevante, una idea sobre su producto). No "¿novedades?".
|
|
43
|
+
- **Día 10–12** — follow-up 2 (último): breve, profesional, dejá la puerta abierta. Si no hay respuesta, cerrás el loop con dignidad.
|
|
44
|
+
|
|
45
|
+
Cada follow-up debe tener un **gancho propio** y leerse solo, sin depender de los anteriores.
|
|
46
|
+
|
|
47
|
+
## Proceso
|
|
48
|
+
|
|
49
|
+
1. Leer la nota de `05-Contactos/` (o crearla) y la de `04-Empresas/`.
|
|
50
|
+
2. Investigar a la persona (rol, equipo, algo reciente) — WebFetch del perfil público si hay URL.
|
|
51
|
+
3. Elegir variante + canal.
|
|
52
|
+
4. Draftear mensaje + 1 variante de apertura.
|
|
53
|
+
5. Registrar en `05-Contactos/` (historial de interacciones) y planificar el follow-up.
|
|
54
|
+
|
|
55
|
+
> Nota: Claude no accede a tu LinkedIn ni envía mensajes — redacta para que vos copies/pegues y registres la interacción.
|
|
56
|
+
|
|
57
|
+
## Idioma
|
|
58
|
+
|
|
59
|
+
Espejá el idioma de la persona/empresa. Inglés por default para roles internacionales.
|
|
60
|
+
|
|
61
|
+
Ver `references/recruiter-playbook.md` para plantillas por situación y la psicología de por qué responden.
|
|
62
|
+
|
|
63
|
+
## Handoff
|
|
64
|
+
|
|
65
|
+
Pedí aprobación (approval) antes de escribir en `05-Contactos/`. Cuando el mensaje está READY para copiar/pegar y el follow-up agendado, prepará la conversación con `/interview-prep` si hay respuesta.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Recruiter / Hiring Manager Playbook
|
|
2
|
+
|
|
3
|
+
Plantillas y psicología para outreach de candidato. Adaptá siempre la primera línea — las plantillas son esqueleto, no copy-paste.
|
|
4
|
+
|
|
5
|
+
## Por qué responden (y por qué no)
|
|
6
|
+
|
|
7
|
+
Responden cuando: el mensaje es corto, claro sobre el fit, fácil de responder, y se nota que es para *ellos*. No responden cuando: es genérico, largo, pide demasiado de entrada, o suena desesperado. El recruiter recibe decenas por día — el filtro es "¿esto me ahorra trabajo o me lo agrega?".
|
|
8
|
+
|
|
9
|
+
## Plantillas
|
|
10
|
+
|
|
11
|
+
### 1. Recruiter que posteó un rol
|
|
12
|
+
```
|
|
13
|
+
Hola {nombre}, vi que están buscando {rol} en {empresa}.
|
|
14
|
+
Soy {rol/seniority} con {logro relevante en 1 línea, con número}.
|
|
15
|
+
Me interesa especialmente {algo real del rol/empresa}.
|
|
16
|
+
¿Te sirve si te paso mi CV o coordinamos 15 min?
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. Hiring manager / futuro lead (mensaje de valor)
|
|
20
|
+
```
|
|
21
|
+
Hola {nombre}, sigo {producto/equipo de la empresa} y me llamó {detalle específico}.
|
|
22
|
+
Vengo de {contexto}: {logro mapeado a lo que su equipo necesita}.
|
|
23
|
+
Apliqué a {rol}; si te viene bien, encantado de darte contexto en una charla corta.
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 3. Pedir un referido (a alguien del equipo)
|
|
27
|
+
```
|
|
28
|
+
Hola {nombre}, vi que trabajás en {empresa} como {rol}.
|
|
29
|
+
Estoy aplicando a {rol} ahí y me encantaría tu perspectiva sobre el equipo.
|
|
30
|
+
Si te parece y te hace sentido, ¿estarías abierto a referirme? Sin problema si no.
|
|
31
|
+
Te dejo mi perfil para que veas si encaja: {link}.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 4. Connection note (<300 chars)
|
|
35
|
+
```
|
|
36
|
+
Hola {nombre}, me interesa mucho {empresa/área}. Vengo de {1 cosa}.
|
|
37
|
+
Me encantaría conectar y, si surge, charlar sobre {rol/equipo}.
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 5. Follow-up 1 (día 4–5) — con valor nuevo
|
|
41
|
+
```
|
|
42
|
+
Hola {nombre}, te escribo para reafirmar mi interés en {rol}.
|
|
43
|
+
Sumo un dato: {proyecto/idea relevante para su producto}.
|
|
44
|
+
Quedo a disposición para lo que necesiten del proceso.
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 6. Follow-up 2 (día 10–12) — cierre digno
|
|
48
|
+
```
|
|
49
|
+
Hola {nombre}, entiendo que están con mucho.
|
|
50
|
+
Dejo la puerta abierta por si avanza {rol}; me encantaría sumar.
|
|
51
|
+
¡Gracias por el tiempo!
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Reglas de cadencia
|
|
55
|
+
|
|
56
|
+
- Máximo 2 follow-ups. Después, soltar.
|
|
57
|
+
- Cada follow-up agrega algo (no "¿novedades?").
|
|
58
|
+
- Espaciar 4–5 días. Nunca el mismo día ni días consecutivos.
|
|
59
|
+
- Registrar cada toque en la nota de `05-Contactos/`.
|
|
60
|
+
|
|
61
|
+
## Tono
|
|
62
|
+
|
|
63
|
+
- Cálido y profesional, nunca servil ni agresivo.
|
|
64
|
+
- Confiado: estás ofreciendo valor, no mendigando.
|
|
65
|
+
- Humano: escribí como hablás, sin jerga corporativa vacía.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cover-letter
|
|
3
|
+
description: "Write concise, confident cover letters and application messages tailored to the company and the person who will read them. Triggers: cover letter, carta de presentacion, mensaje de aplicacion, application message, carta de motivacion, why I'm a fit."
|
|
4
|
+
argument-hint: "[application-note | company + role]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Cover Letter — Mensaje de aplicación de élite
|
|
11
|
+
|
|
12
|
+
Escribís cover letters y mensajes de aplicación **concisos, seguros y custom** — que suenan a una persona que entendió el rol y la empresa, no a una plantilla. El objetivo: que el lector quiera leer el CV.
|
|
13
|
+
|
|
14
|
+
## Inputs
|
|
15
|
+
|
|
16
|
+
- **Rol y empresa** + el job description.
|
|
17
|
+
- **Perfil base / maestro** (`01-Perfiles/`) para los logros y el ángulo.
|
|
18
|
+
- **Research** de `04-Empresas/` y del contacto en `05-Contactos/` (a quién le escribís cambia el tono).
|
|
19
|
+
- El **canal**: cover letter formal (campo del ATS), mensaje corto de LinkedIn/email, o párrafo de "why you" en un form.
|
|
20
|
+
|
|
21
|
+
## Principios
|
|
22
|
+
|
|
23
|
+
- **Una página máximo; idealmente 150–250 palabras** para mensajes, 250–350 para carta formal.
|
|
24
|
+
- **El primer renglón gana o pierde.** Nada de "I am writing to apply for…". Abrí con un gancho específico: un logro relevante, un punto de conexión con la empresa, o por qué este rol te mueve.
|
|
25
|
+
- **Mostrá fit, no historia.** 1–2 logros que mapean directo a lo que piden, con número.
|
|
26
|
+
- **Específico de la empresa.** Una frase que demuestre que investigaste (producto, valor, problema que resuelven). Si la podés pegar en otra aplicación, no sirve.
|
|
27
|
+
- **Confiado, no arrogante; cálido, no servil.** Ni "would be honored", ni "I'm the best candidate".
|
|
28
|
+
- **CTA simple al final.** Disponibilidad / ganas de charlar, sin rogar.
|
|
29
|
+
|
|
30
|
+
## Estructura (carta formal)
|
|
31
|
+
|
|
32
|
+
1. **Hook** — gancho específico (logro o conexión real).
|
|
33
|
+
2. **Fit** — 1–2 logros mapeados a must-haves del JD, con métrica.
|
|
34
|
+
3. **Empresa** — por qué *esta* empresa/rol (research real).
|
|
35
|
+
4. **Cierre** — CTA breve + gracias.
|
|
36
|
+
|
|
37
|
+
## Estructura (mensaje corto / LinkedIn / email)
|
|
38
|
+
|
|
39
|
+
- Saludo personal (nombre del contacto si lo tenés).
|
|
40
|
+
- 1 oración: quién sos + el logro más relevante.
|
|
41
|
+
- 1 oración: por qué esta empresa/rol.
|
|
42
|
+
- 1 oración: CTA (charlar / te dejo el CV).
|
|
43
|
+
|
|
44
|
+
## Proceso
|
|
45
|
+
|
|
46
|
+
1. Leer JD + research. Identificar los 2 must-haves donde más brillás.
|
|
47
|
+
2. Elegir formato según canal.
|
|
48
|
+
3. Draftear. Después **cortar sin piedad** todo lo genérico.
|
|
49
|
+
4. Generar 2 variantes de apertura si el usuario quiere elegir.
|
|
50
|
+
5. Guardar en la nota de aplicación (`03-Aplicaciones/`, sección cover letter) o en `07-Recursos/` si es reutilizable.
|
|
51
|
+
|
|
52
|
+
## Idioma
|
|
53
|
+
|
|
54
|
+
Inglés para roles internacionales; español si la empresa es hispanohablante. Espejá el idioma del JD ante la duda.
|
|
55
|
+
|
|
56
|
+
## Anti-patrones (cortar siempre)
|
|
57
|
+
|
|
58
|
+
- "I am writing to express my interest in…" / "Por medio de la presente…".
|
|
59
|
+
- Recitar el CV en prosa.
|
|
60
|
+
- Adjetivos vacíos sin evidencia (passionate, hardworking, team player).
|
|
61
|
+
- Párrafos genéricos que sirven para cualquier empresa.
|
|
62
|
+
- Pedir disculpas o sonar desesperado.
|
|
63
|
+
|
|
64
|
+
## Handoff
|
|
65
|
+
|
|
66
|
+
Pedí aprobación (approval) antes de guardar la carta en la nota de aplicación o en `07-Recursos/`. Cuando la cover letter está READY, el siguiente paso es `/cold-outreach` si hay un contacto al que escribirle directo.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cv-ats-export
|
|
3
|
+
description: "Export a Markdown CV to an ATS-compliant PDF (single column, selectable text, A4) using headless Chrome/Edge — no Obsidian or design tool needed. Triggers: exportar CV a PDF, generar PDF del CV, CV ATS PDF, convertir CV markdown a PDF, imprimir CV."
|
|
4
|
+
argument-hint: "[cv-name | all] [--workspace <path>]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# CV ATS Export — Markdown → PDF ATS-compliant
|
|
11
|
+
|
|
12
|
+
Convertís un CV en Markdown a un **PDF que pasa filtros ATS**: una sola columna, texto seleccionable (no imagen), A4, tipografía limpia. Usa Chrome o Edge en modo headless — no requiere Obsidian, LaTeX ni herramienta de diseño.
|
|
13
|
+
|
|
14
|
+
El motor es `scripts/cv_export.py`. La primera vez, instalalo en el workspace (`tools/cv_export.py`) para que quede versionado con los CVs; o corrélo directo desde el skill.
|
|
15
|
+
|
|
16
|
+
## Requisitos
|
|
17
|
+
|
|
18
|
+
- **Python 3** en el PATH.
|
|
19
|
+
- **Google Chrome o Microsoft Edge** instalado (el script autodetecta rutas estándar en Windows/macOS/Linux).
|
|
20
|
+
- CVs en Markdown dentro de `02-CVs/` del career workspace, con headers (`# Nombre`, `## Sección`), bullets y `---` como separadores.
|
|
21
|
+
|
|
22
|
+
## Uso
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Todos los CVs base (CV - *.md) del workspace
|
|
26
|
+
python scripts/cv_export.py
|
|
27
|
+
|
|
28
|
+
# Uno solo (con o sin .md)
|
|
29
|
+
python scripts/cv_export.py "CV - Acme - Backend"
|
|
30
|
+
|
|
31
|
+
# Workspace explícito
|
|
32
|
+
python scripts/cv_export.py --workspace ./career-workspace "CV - Acme - Backend"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
El script:
|
|
36
|
+
1. Localiza el workspace (flag `--workspace`, env `CAREER_WORKSPACE`, o sube directorios buscando una carpeta `02-CVs`, o usa el cwd).
|
|
37
|
+
2. Lee el `.md`, separa frontmatter, convierte el cuerpo a HTML con el CSS ATS embebido.
|
|
38
|
+
3. Imprime a PDF con Chrome/Edge headless (`--headless=new --print-to-pdf`).
|
|
39
|
+
4. Guarda en `02-CVs/exports/`. El nombre sale del frontmatter `archivo_pdf` si existe; si no, del nombre del `.md` (sin el prefijo `CV - `).
|
|
40
|
+
|
|
41
|
+
## Markdown soportado
|
|
42
|
+
|
|
43
|
+
`# ## ### títulos` · `**negrita**` · `*itálica*` · `[texto](url)` · `- bullets` · `---` (regla horizontal). Un salto de línea simple dentro de un párrafo se renderiza como `<br>` (comportamiento tipo Obsidian).
|
|
44
|
+
|
|
45
|
+
## Por qué este pipeline (y no Word/Canva)
|
|
46
|
+
|
|
47
|
+
- **Texto seleccionable garantizado** → el ATS puede parsearlo (a diferencia de un PDF exportado como imagen).
|
|
48
|
+
- **Una columna, sin tablas** → no se rompe el parseo.
|
|
49
|
+
- **Reproducible y versionable** → el CV vive en Markdown (diffeable, en git), el PDF es un artefacto generado.
|
|
50
|
+
- **Mismo estilo siempre** → el CSS ATS está embebido en el script.
|
|
51
|
+
|
|
52
|
+
## Personalizar el estilo
|
|
53
|
+
|
|
54
|
+
El CSS ATS está en la constante `CSS` dentro de `scripts/cv_export.py` (tamaño de fuente, márgenes A4, estilos de h1/h2). Editá ahí si querés ajustar tipografía o espaciado — mantené una sola columna y texto real.
|
|
55
|
+
|
|
56
|
+
## Reglas
|
|
57
|
+
|
|
58
|
+
- No metas tablas, columnas ni imágenes en el CV: rompen el parseo ATS.
|
|
59
|
+
- Verificá el PDF generado: que el texto sea seleccionable y entre en 1–2 páginas.
|
|
60
|
+
- No commitees PDFs con datos sensibles a un remoto sin confirmación.
|
|
61
|
+
|
|
62
|
+
## Handoff
|
|
63
|
+
|
|
64
|
+
Confirmá (approval) antes de instalar `cv_export.py` en el workspace o sobrescribir PDFs. Cuando el PDF está READY y verificado, el siguiente paso suele ser `/cover-letter` para el mensaje de aplicación.
|