@saulwade/swl-ses 1.3.7 → 1.4.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/CLAUDE.md +12 -4
- package/README.md +1 -1
- package/bin/swl-mcp-server.js +187 -187
- package/bin/swl-webhook-server.js +198 -0
- package/comandos/swl/.evolved.json +22 -22
- package/comandos/swl/adoptar-proyecto.md +21 -1
- package/comandos/swl/claudemd.md +14 -1
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/exportar-vault.md +207 -7
- package/comandos/swl/nuevo-proyecto.md +24 -2
- package/gateway/adapters/base.js +109 -0
- package/gateway/adapters/discord.js +167 -0
- package/gateway/adapters/email.js +221 -0
- package/gateway/adapters/slack.js +192 -0
- package/gateway/adapters/telegram.js +183 -0
- package/gateway/adapters/webhook.js +113 -0
- package/gateway/adapters/whatsapp.js +214 -0
- package/gateway/agent-executor.js +322 -0
- package/gateway/command-relay.js +271 -0
- package/gateway/cron/jobs.js +263 -0
- package/gateway/cron/scheduler.js +322 -0
- package/gateway/cron/store.js +335 -0
- package/gateway/index.js +320 -0
- package/gateway/lib/event-channel.js +191 -0
- package/gateway/session.js +131 -0
- package/gateway/webhook-server.js +324 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/build-errors-nextjs/SKILL.md +55 -1
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/SKILL.md +171 -171
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/extractor-de-aprendizajes/SKILL.md +24 -10
- package/habilidades/harness-claude-code/SKILL.md +299 -299
- package/habilidades/infra-github-actions/SKILL.md +166 -166
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- package/habilidades/manejo-errores/.evolved.json +8 -8
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- package/habilidades/nextjs-testing/SKILL.md +89 -5
- package/habilidades/node-experto/SKILL.md +37 -1
- package/habilidades/patrones-python/SKILL.md +229 -229
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/planear-fase/SKILL.md +319 -319
- package/habilidades/react-experto/SKILL.md +45 -4
- package/habilidades/release-semver/.evolved.json +8 -8
- package/habilidades/swl-claudemd/SKILL.md +15 -1
- package/habilidades/tdd-workflow/SKILL.md +36 -4
- package/habilidades/testing-python/SKILL.md +340 -340
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/inyeccion-contexto.js +8 -3
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/rate-limit-ip.js +177 -0
- package/hooks/lib/rate-limit-tracker.js +253 -253
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/skill-auditor.js +588 -588
- package/hooks/lib/sync-status.js +228 -228
- package/hooks/lib/taint-tracker.js +107 -107
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/lib/webhook-dedup.js +184 -0
- package/hooks/lib/webhook-verify.js +123 -0
- package/hooks/proteccion-rutas.js +120 -15
- package/hooks/registro-turnos.js +209 -209
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-memoria-hook.js +218 -218
- package/instintos/prompt-appendices.yaml +57 -57
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/modulos.json +1 -0
- package/manifiestos/skills-lock.json +37 -37
- package/package.json +5 -3
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/README.md +47 -47
- package/plantillas/github-workflows/release-please.yml +44 -44
- package/plantillas/github-workflows/swl-ci.yml +107 -107
- package/plantillas/github-workflows/swl-security.yml +51 -51
- package/plugin.json +1 -1
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/arreglar-al-detectar.md +147 -147
- package/reglas/fragmentos-compartidos.md +152 -152
- package/reglas/harness-claude-code.md +213 -213
- package/reglas/usar-context7.md +226 -226
- package/reglas/usar-sistema-swl.md +251 -0
- package/schemas/diary-entry.schema.json +80 -80
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/comandos/skills.js +251 -2
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/field-report.js +199 -199
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-inventario.js +420 -420
- package/scripts/generar-matriz-lenguajes.js +271 -271
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/diary-entry.js +234 -234
- package/scripts/lib/eval-metrics-store.js +218 -218
- package/scripts/lib/eval-quality.js +171 -171
- package/scripts/lib/eval-schemas.js +144 -144
- package/scripts/lib/eval-self-correct.js +106 -106
- package/scripts/lib/eval-validator.js +185 -185
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-server/README.md +128 -128
- package/scripts/mcp-server/handlers.js +206 -206
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +201 -201
- package/scripts/publicar.js +511 -511
- package/scripts/run-eval.js +141 -141
- package/scripts/validar-manifest.js +195 -195
- package/scripts/validar-userland-vacio.js +110 -110
- package/scripts/verificar-release.js +110 -0
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
# Convención `EXAMPLES.md` — recurso opcional para skills críticos
|
|
2
|
-
|
|
3
|
-
Convención **opcional** para skills cuyo valor depende de ejemplos concretos
|
|
4
|
-
con diff MAL → BIEN. Esta convención NO es retroactiva: las 63 carpetas
|
|
5
|
-
`recursos/` existentes en `habilidades/` no se renombran. Solo aplica a:
|
|
6
|
-
|
|
7
|
-
- Skills nuevos cuyo dominio se entiende mejor con ejemplos lado a lado.
|
|
8
|
-
- Skills existentes que reciban actualización mayor y agreguen ejemplos.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Cuándo aplicarla
|
|
13
|
-
|
|
14
|
-
Aplicar cuando:
|
|
15
|
-
|
|
16
|
-
- El skill prescribe **decisiones técnicas** o **patrones** cuyo error es
|
|
17
|
-
sutil sin un caso concreto (ej: anti-patrones de async, gotchas de framework,
|
|
18
|
-
decisiones arquitecturales).
|
|
19
|
-
- El skill se beneficia de mostrar 2-4 ejemplos lado a lado: el caso aplicado
|
|
20
|
-
correctamente vs el caso degenerado.
|
|
21
|
-
- Los ejemplos suman > 100 líneas y meterlos en SKILL.md lo pasaría del
|
|
22
|
-
límite de 300 líneas.
|
|
23
|
-
|
|
24
|
-
NO aplicar cuando:
|
|
25
|
-
|
|
26
|
-
- El skill ya tiene `recursos/` con archivos temáticos específicos
|
|
27
|
-
(ej: `meta-skills-estandar/recursos/anti-patrones-y-leyes.md`). El nombre
|
|
28
|
-
temático es más informativo que `EXAMPLES.md`.
|
|
29
|
-
- El skill es un how-to procedural sin antipatrones contrastables.
|
|
30
|
-
- El skill tiene < 80 líneas en SKILL.md y los ejemplos caben en línea.
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Estructura recomendada
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
habilidades/<skill-name>/
|
|
38
|
-
├── SKILL.md
|
|
39
|
-
└── recursos/
|
|
40
|
-
└── EXAMPLES.md
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
`SKILL.md` enlaza al final con:
|
|
44
|
-
|
|
45
|
-
```markdown
|
|
46
|
-
Para ejemplos concretos de aplicación, ver [`recursos/EXAMPLES.md`](recursos/EXAMPLES.md).
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
`EXAMPLES.md` contiene 2-4 ejemplos siguiendo el patrón:
|
|
50
|
-
|
|
51
|
-
```markdown
|
|
52
|
-
## Ejemplo N — [título corto del escenario]
|
|
53
|
-
|
|
54
|
-
**Contexto**: [1-2 líneas]
|
|
55
|
-
|
|
56
|
-
### ❌ Sin <skill-name> (hipotético)
|
|
57
|
-
[código o descripción del enfoque incorrecto + consecuencia observable]
|
|
58
|
-
|
|
59
|
-
### ✓ Con <skill-name>
|
|
60
|
-
[código o descripción del enfoque correcto + por qué evita la consecuencia]
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Cierre de `EXAMPLES.md`: tabla resumen de los ejemplos con la dimensión
|
|
64
|
-
clave que cambió (costo, tiempo, severidad de bug, etc.).
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Por qué OPCIONAL y no obligatoria
|
|
69
|
-
|
|
70
|
-
- 63 carpetas `recursos/` ya existen con nomenclatura temática
|
|
71
|
-
(`anti-patrones-y-leyes.md`, `frameworks-seguridad.md`,
|
|
72
|
-
`idiomas-framework.md`). Forzar `EXAMPLES.md` rompería información
|
|
73
|
-
semántica del nombre.
|
|
74
|
-
- La regla core `reglas/skills-estandar.md` ya prescribe que `SKILL.md`
|
|
75
|
-
no exceda 300 líneas y que los `recursos/` se nombren en kebab-case
|
|
76
|
-
con sufijo `.md` — esa regla cubre el 95% de los casos.
|
|
77
|
-
- Esta convención **complementa** la regla core para skills donde un nombre
|
|
78
|
-
semántico genérico (`EXAMPLES.md`) comunica mejor el contenido que un
|
|
79
|
-
nombre específico (ej: `casos-decisiones-arquitecturales.md` es más largo
|
|
80
|
-
y menos buscable).
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Origen
|
|
85
|
-
|
|
86
|
-
Patrón observado en repos externos analizados el 2026-05-09
|
|
87
|
-
(`temp/agent-skills-main`, `temp/andrej-karpathy-skills-main`):
|
|
88
|
-
varios skills críticos exponen un `EXAMPLES.md` con diffs MAL/BIEN
|
|
89
|
-
auto-cargable como referencia rápida del agente.
|
|
90
|
-
|
|
91
|
-
Adoptado en `habilidades/doubt-driven-review/recursos/EXAMPLES.md` como
|
|
92
|
-
primera aplicación. Casos futuros: skills de decisiones arquitecturales,
|
|
93
|
-
seguridad, debugging avanzado.
|
|
1
|
+
# Convención `EXAMPLES.md` — recurso opcional para skills críticos
|
|
2
|
+
|
|
3
|
+
Convención **opcional** para skills cuyo valor depende de ejemplos concretos
|
|
4
|
+
con diff MAL → BIEN. Esta convención NO es retroactiva: las 63 carpetas
|
|
5
|
+
`recursos/` existentes en `habilidades/` no se renombran. Solo aplica a:
|
|
6
|
+
|
|
7
|
+
- Skills nuevos cuyo dominio se entiende mejor con ejemplos lado a lado.
|
|
8
|
+
- Skills existentes que reciban actualización mayor y agreguen ejemplos.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Cuándo aplicarla
|
|
13
|
+
|
|
14
|
+
Aplicar cuando:
|
|
15
|
+
|
|
16
|
+
- El skill prescribe **decisiones técnicas** o **patrones** cuyo error es
|
|
17
|
+
sutil sin un caso concreto (ej: anti-patrones de async, gotchas de framework,
|
|
18
|
+
decisiones arquitecturales).
|
|
19
|
+
- El skill se beneficia de mostrar 2-4 ejemplos lado a lado: el caso aplicado
|
|
20
|
+
correctamente vs el caso degenerado.
|
|
21
|
+
- Los ejemplos suman > 100 líneas y meterlos en SKILL.md lo pasaría del
|
|
22
|
+
límite de 300 líneas.
|
|
23
|
+
|
|
24
|
+
NO aplicar cuando:
|
|
25
|
+
|
|
26
|
+
- El skill ya tiene `recursos/` con archivos temáticos específicos
|
|
27
|
+
(ej: `meta-skills-estandar/recursos/anti-patrones-y-leyes.md`). El nombre
|
|
28
|
+
temático es más informativo que `EXAMPLES.md`.
|
|
29
|
+
- El skill es un how-to procedural sin antipatrones contrastables.
|
|
30
|
+
- El skill tiene < 80 líneas en SKILL.md y los ejemplos caben en línea.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Estructura recomendada
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
habilidades/<skill-name>/
|
|
38
|
+
├── SKILL.md
|
|
39
|
+
└── recursos/
|
|
40
|
+
└── EXAMPLES.md
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`SKILL.md` enlaza al final con:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
Para ejemplos concretos de aplicación, ver [`recursos/EXAMPLES.md`](recursos/EXAMPLES.md).
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`EXAMPLES.md` contiene 2-4 ejemplos siguiendo el patrón:
|
|
50
|
+
|
|
51
|
+
```markdown
|
|
52
|
+
## Ejemplo N — [título corto del escenario]
|
|
53
|
+
|
|
54
|
+
**Contexto**: [1-2 líneas]
|
|
55
|
+
|
|
56
|
+
### ❌ Sin <skill-name> (hipotético)
|
|
57
|
+
[código o descripción del enfoque incorrecto + consecuencia observable]
|
|
58
|
+
|
|
59
|
+
### ✓ Con <skill-name>
|
|
60
|
+
[código o descripción del enfoque correcto + por qué evita la consecuencia]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Cierre de `EXAMPLES.md`: tabla resumen de los ejemplos con la dimensión
|
|
64
|
+
clave que cambió (costo, tiempo, severidad de bug, etc.).
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Por qué OPCIONAL y no obligatoria
|
|
69
|
+
|
|
70
|
+
- 63 carpetas `recursos/` ya existen con nomenclatura temática
|
|
71
|
+
(`anti-patrones-y-leyes.md`, `frameworks-seguridad.md`,
|
|
72
|
+
`idiomas-framework.md`). Forzar `EXAMPLES.md` rompería información
|
|
73
|
+
semántica del nombre.
|
|
74
|
+
- La regla core `reglas/skills-estandar.md` ya prescribe que `SKILL.md`
|
|
75
|
+
no exceda 300 líneas y que los `recursos/` se nombren en kebab-case
|
|
76
|
+
con sufijo `.md` — esa regla cubre el 95% de los casos.
|
|
77
|
+
- Esta convención **complementa** la regla core para skills donde un nombre
|
|
78
|
+
semántico genérico (`EXAMPLES.md`) comunica mejor el contenido que un
|
|
79
|
+
nombre específico (ej: `casos-decisiones-arquitecturales.md` es más largo
|
|
80
|
+
y menos buscable).
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Origen
|
|
85
|
+
|
|
86
|
+
Patrón observado en repos externos analizados el 2026-05-09
|
|
87
|
+
(`temp/agent-skills-main`, `temp/andrej-karpathy-skills-main`):
|
|
88
|
+
varios skills críticos exponen un `EXAMPLES.md` con diffs MAL/BIEN
|
|
89
|
+
auto-cargable como referencia rápida del agente.
|
|
90
|
+
|
|
91
|
+
Adoptado en `habilidades/doubt-driven-review/recursos/EXAMPLES.md` como
|
|
92
|
+
primera aplicación. Casos futuros: skills de decisiones arquitecturales,
|
|
93
|
+
seguridad, debugging avanzado.
|
|
@@ -1,163 +1,163 @@
|
|
|
1
|
-
# Skills as Agents — patrón técnico avanzado
|
|
2
|
-
|
|
3
|
-
Documenta el patrón Anthropic nativo de ejecutar un skill SWL en su propio
|
|
4
|
-
sub-agente con `agent: true` + `model:` en el frontmatter. Origen: artículo
|
|
5
|
-
"Claude Code's Limits Are Generous. The Problem Is Your Harness." sección 2.3.
|
|
6
|
-
|
|
7
|
-
## Concepto
|
|
8
|
-
|
|
9
|
-
Un SKILL.md normal es contenido que se carga al contexto del padre cuando
|
|
10
|
-
se invoca con `Skill("nombre")`. El skill aporta reglas, conocimiento o
|
|
11
|
-
guía al modelo del padre, que las usa al razonar.
|
|
12
|
-
|
|
13
|
-
Con el patrón skills as agents, el skill se vuelve **invocable como
|
|
14
|
-
sub-agente independiente**: tiene su propio modelo, su propio contexto,
|
|
15
|
-
y solo devuelve un resultado acotado al padre. Útil cuando el skill
|
|
16
|
-
procesa un input grande y debe entregar un resumen.
|
|
17
|
-
|
|
18
|
-
## Cuándo usar este patrón
|
|
19
|
-
|
|
20
|
-
- El skill procesa un archivo o input grande y debe devolver solo un
|
|
21
|
-
resumen al padre (ejemplo: extraer TLDR de un PDF de 50 páginas, sin
|
|
22
|
-
que el texto completo entre al contexto del padre).
|
|
23
|
-
- El skill ejecuta búsqueda exhaustiva o crawling de un codebase completo
|
|
24
|
-
y el resultado es un set acotado de findings.
|
|
25
|
-
- El skill necesita un modelo distinto al del padre por costo o latencia
|
|
26
|
-
(Haiku para trabajo mecánico cuando el padre es Opus).
|
|
27
|
-
- El trabajo del skill es paralelizable y se va a invocar varias veces en
|
|
28
|
-
la misma sesión.
|
|
29
|
-
|
|
30
|
-
## Cuándo NO usar
|
|
31
|
-
|
|
32
|
-
- El skill solo aporta reglas o conocimiento estático que se aplica al
|
|
33
|
-
razonamiento del padre — esos son skills "passive" normales y NO
|
|
34
|
-
necesitan `agent: true`. Su valor es justamente que cargan reglas al
|
|
35
|
-
contexto del padre.
|
|
36
|
-
- El skill es referenciado dentro de otro skill como contenido de apoyo
|
|
37
|
-
— el contexto del padre lo necesita ver.
|
|
38
|
-
- El skill requiere acceso al contexto activo del padre (decisiones
|
|
39
|
-
tomadas mid-session, archivos ya leídos) — `agent: true` aísla del
|
|
40
|
-
padre, así que el sub-agente no vería esa información.
|
|
41
|
-
- El skill es invocado una sola vez en la sesión y su output es pequeño
|
|
42
|
-
— el overhead de spawn de sub-agente puede dominar.
|
|
43
|
-
|
|
44
|
-
## Ejemplo de skill como agent
|
|
45
|
-
|
|
46
|
-
```yaml
|
|
47
|
-
---
|
|
48
|
-
name: tldr-pdf
|
|
49
|
-
description: >
|
|
50
|
-
Extrae TLDR de 200 palabras de un PDF sin cargar el texto completo en
|
|
51
|
-
el contexto del padre. Cargar cuando se reciba ruta a un PDF que solo
|
|
52
|
-
necesita resumen ejecutivo.
|
|
53
|
-
agent: true
|
|
54
|
-
model: claude-haiku-4-5-20251001
|
|
55
|
-
herramientasPermitidas: [Bash, Read]
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
# tldr-pdf
|
|
59
|
-
|
|
60
|
-
Recibes la ruta de un PDF como input.
|
|
61
|
-
|
|
62
|
-
1. Ejecuta `pdftotext "$1" -` para extraer texto.
|
|
63
|
-
2. Lee la salida.
|
|
64
|
-
3. Devuelve SOLO:
|
|
65
|
-
- 5 bullets de TLDR
|
|
66
|
-
- 3 quotes que valga la pena conservar
|
|
67
|
-
- URLs citadas
|
|
68
|
-
|
|
69
|
-
Nunca devuelvas el texto completo. Nunca expandas más allá de la estructura.
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Flujo: el padre invoca `Skill("tldr-pdf")` con la ruta del PDF; el
|
|
73
|
-
sub-agente Haiku ejecuta `pdftotext`, lee la salida (que llena su propio
|
|
74
|
-
contexto, no el del padre), y devuelve ~200 palabras estructuradas. El PDF
|
|
75
|
-
completo nunca toca el contexto del padre.
|
|
76
|
-
|
|
77
|
-
## Reglas del patrón
|
|
78
|
-
|
|
79
|
-
### Frontmatter
|
|
80
|
-
|
|
81
|
-
- `agent: true` activa el modo sub-agente.
|
|
82
|
-
- `model:` debe ser un modelo Anthropic válido. Para skills mecánicos,
|
|
83
|
-
preferir Haiku (5× más barato que Sonnet, 25× más barato que Opus 4.7).
|
|
84
|
-
- El frontmatter sigue siendo válido SWL: incluir `name`, `description`,
|
|
85
|
-
`herramientasPermitidas`, `exclusiones` y demás campos obligatorios.
|
|
86
|
-
|
|
87
|
-
### Cuerpo
|
|
88
|
-
|
|
89
|
-
- Debe ser **autocontenido**: el sub-agente NO tiene acceso al contexto
|
|
90
|
-
del padre (CLAUDE.md del proyecto, instintos cargados, sesión activa,
|
|
91
|
-
archivos previamente leídos). Todo lo que necesite saber tiene que
|
|
92
|
-
estar en el cuerpo del skill o en lo que reciba como input.
|
|
93
|
-
- El output debe ser **acotado**: si el sub-agente devuelve un dump
|
|
94
|
-
masivo, se pierde el beneficio (terminamos pasando lo mismo al padre,
|
|
95
|
-
solo con un round-trip extra). Especificar formato exacto en el
|
|
96
|
-
cuerpo del skill: número de bullets, longitud máxima, qué incluir y
|
|
97
|
-
qué no.
|
|
98
|
-
|
|
99
|
-
### Errores comunes a evitar
|
|
100
|
-
|
|
101
|
-
- **Usar Opus en `model:` para skills mecánicos**: invalida el ahorro de
|
|
102
|
-
costo. La mayoría de skills as agents deberían ser Haiku o Sonnet.
|
|
103
|
-
- **Devolver el texto crudo del input**: si el skill recibe un PDF y
|
|
104
|
-
devuelve el texto completo, no estamos aislando nada. Devuelve siempre
|
|
105
|
-
la transformación, no el material crudo.
|
|
106
|
-
- **Asumir que el skill verá el CLAUDE.md del proyecto**: no lo verá.
|
|
107
|
-
Si el skill necesita seguir convenciones del proyecto, hay que
|
|
108
|
-
explicárselas en el cuerpo.
|
|
109
|
-
|
|
110
|
-
## Skills SWL candidatos al patrón (no migración masiva)
|
|
111
|
-
|
|
112
|
-
Evaluación caso por caso. NO aplicar masivamente — el patrón aporta solo
|
|
113
|
-
cuando el skill consume input grande y devuelve output acotado.
|
|
114
|
-
|
|
115
|
-
| Skill SWL | Por qué encaja | Modelo recomendado |
|
|
116
|
-
|-----------|----------------|--------------------|
|
|
117
|
-
| `extraccion-documentos` | Procesa PDFs/Office grandes | Haiku |
|
|
118
|
-
| `mapear-codebase` | Procesa codebase entero, devuelve reporte | Sonnet |
|
|
119
|
-
| `wiki-conocimiento` (modo query) | Búsqueda en wiki con respuesta acotada | Sonnet |
|
|
120
|
-
|
|
121
|
-
Skills NO candidatos (son passive, su valor es cargar reglas al contexto del padre):
|
|
122
|
-
|
|
123
|
-
- `manejo-errores`, `auth-patrones`, `api-rest-diseno`, `accesibilidad-a11y`, etc.
|
|
124
|
-
- Toda regla de estilo o convención por lenguaje.
|
|
125
|
-
- Toda regla SWL en `reglas/`.
|
|
126
|
-
|
|
127
|
-
## Implicaciones operativas
|
|
128
|
-
|
|
129
|
-
### Costo
|
|
130
|
-
|
|
131
|
-
Spawn de sub-agente tiene overhead (system prompt + carga del skill +
|
|
132
|
-
contexto inicial). Para inputs chicos, el overhead supera el ahorro.
|
|
133
|
-
Regla práctica: usar el patrón si el input que el skill procesa es
|
|
134
|
-
≥3,000 tokens (o ≥10K caracteres).
|
|
135
|
-
|
|
136
|
-
### Latencia
|
|
137
|
-
|
|
138
|
-
El padre espera al sub-agente antes de continuar. Si el skill demora >10s,
|
|
139
|
-
considerar si la operación cabe en el padre directamente (sin spawn).
|
|
140
|
-
|
|
141
|
-
### Trazabilidad
|
|
142
|
-
|
|
143
|
-
Los sub-agentes spawneados aparecen en `claude-usage` (vendor SWL) como
|
|
144
|
-
invocaciones separadas con su propio modelo. Útil para entender qué
|
|
145
|
-
porcentaje del costo viene de sub-agentes vs. trabajo del padre.
|
|
146
|
-
|
|
147
|
-
### Compatibilidad con SWL
|
|
148
|
-
|
|
149
|
-
- El skill sigue registrado normalmente en `manifiestos/modulos.json`.
|
|
150
|
-
- El skill se invoca igual: `Skill("nombre")`. La diferencia es interna
|
|
151
|
-
(el harness Anthropic decide si lo carga al padre o lo ejecuta como
|
|
152
|
-
sub-agente según el frontmatter).
|
|
153
|
-
- Hooks SWL siguen aplicando: `linea-estado.js`, `monitor-contexto.js`,
|
|
154
|
-
`audit-trail.js` registran las invocaciones del sub-agente.
|
|
155
|
-
|
|
156
|
-
## Referencias
|
|
157
|
-
|
|
158
|
-
- Artículo de origen: "Claude Code's Limits Are Generous. The Problem Is
|
|
159
|
-
Your Harness." (sección 2.3 — Skills Can Also Be Invoked as Agents).
|
|
160
|
-
- Documentación oficial Anthropic sobre Claude Skills (cuando esté
|
|
161
|
-
disponible).
|
|
162
|
-
- `Skill("harness-claude-code")` — uso operativo del patrón en sesiones
|
|
163
|
-
largas, junto con sub-agentes via Task tool y delegación explícita.
|
|
1
|
+
# Skills as Agents — patrón técnico avanzado
|
|
2
|
+
|
|
3
|
+
Documenta el patrón Anthropic nativo de ejecutar un skill SWL en su propio
|
|
4
|
+
sub-agente con `agent: true` + `model:` en el frontmatter. Origen: artículo
|
|
5
|
+
"Claude Code's Limits Are Generous. The Problem Is Your Harness." sección 2.3.
|
|
6
|
+
|
|
7
|
+
## Concepto
|
|
8
|
+
|
|
9
|
+
Un SKILL.md normal es contenido que se carga al contexto del padre cuando
|
|
10
|
+
se invoca con `Skill("nombre")`. El skill aporta reglas, conocimiento o
|
|
11
|
+
guía al modelo del padre, que las usa al razonar.
|
|
12
|
+
|
|
13
|
+
Con el patrón skills as agents, el skill se vuelve **invocable como
|
|
14
|
+
sub-agente independiente**: tiene su propio modelo, su propio contexto,
|
|
15
|
+
y solo devuelve un resultado acotado al padre. Útil cuando el skill
|
|
16
|
+
procesa un input grande y debe entregar un resumen.
|
|
17
|
+
|
|
18
|
+
## Cuándo usar este patrón
|
|
19
|
+
|
|
20
|
+
- El skill procesa un archivo o input grande y debe devolver solo un
|
|
21
|
+
resumen al padre (ejemplo: extraer TLDR de un PDF de 50 páginas, sin
|
|
22
|
+
que el texto completo entre al contexto del padre).
|
|
23
|
+
- El skill ejecuta búsqueda exhaustiva o crawling de un codebase completo
|
|
24
|
+
y el resultado es un set acotado de findings.
|
|
25
|
+
- El skill necesita un modelo distinto al del padre por costo o latencia
|
|
26
|
+
(Haiku para trabajo mecánico cuando el padre es Opus).
|
|
27
|
+
- El trabajo del skill es paralelizable y se va a invocar varias veces en
|
|
28
|
+
la misma sesión.
|
|
29
|
+
|
|
30
|
+
## Cuándo NO usar
|
|
31
|
+
|
|
32
|
+
- El skill solo aporta reglas o conocimiento estático que se aplica al
|
|
33
|
+
razonamiento del padre — esos son skills "passive" normales y NO
|
|
34
|
+
necesitan `agent: true`. Su valor es justamente que cargan reglas al
|
|
35
|
+
contexto del padre.
|
|
36
|
+
- El skill es referenciado dentro de otro skill como contenido de apoyo
|
|
37
|
+
— el contexto del padre lo necesita ver.
|
|
38
|
+
- El skill requiere acceso al contexto activo del padre (decisiones
|
|
39
|
+
tomadas mid-session, archivos ya leídos) — `agent: true` aísla del
|
|
40
|
+
padre, así que el sub-agente no vería esa información.
|
|
41
|
+
- El skill es invocado una sola vez en la sesión y su output es pequeño
|
|
42
|
+
— el overhead de spawn de sub-agente puede dominar.
|
|
43
|
+
|
|
44
|
+
## Ejemplo de skill como agent
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
---
|
|
48
|
+
name: tldr-pdf
|
|
49
|
+
description: >
|
|
50
|
+
Extrae TLDR de 200 palabras de un PDF sin cargar el texto completo en
|
|
51
|
+
el contexto del padre. Cargar cuando se reciba ruta a un PDF que solo
|
|
52
|
+
necesita resumen ejecutivo.
|
|
53
|
+
agent: true
|
|
54
|
+
model: claude-haiku-4-5-20251001
|
|
55
|
+
herramientasPermitidas: [Bash, Read]
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
# tldr-pdf
|
|
59
|
+
|
|
60
|
+
Recibes la ruta de un PDF como input.
|
|
61
|
+
|
|
62
|
+
1. Ejecuta `pdftotext "$1" -` para extraer texto.
|
|
63
|
+
2. Lee la salida.
|
|
64
|
+
3. Devuelve SOLO:
|
|
65
|
+
- 5 bullets de TLDR
|
|
66
|
+
- 3 quotes que valga la pena conservar
|
|
67
|
+
- URLs citadas
|
|
68
|
+
|
|
69
|
+
Nunca devuelvas el texto completo. Nunca expandas más allá de la estructura.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Flujo: el padre invoca `Skill("tldr-pdf")` con la ruta del PDF; el
|
|
73
|
+
sub-agente Haiku ejecuta `pdftotext`, lee la salida (que llena su propio
|
|
74
|
+
contexto, no el del padre), y devuelve ~200 palabras estructuradas. El PDF
|
|
75
|
+
completo nunca toca el contexto del padre.
|
|
76
|
+
|
|
77
|
+
## Reglas del patrón
|
|
78
|
+
|
|
79
|
+
### Frontmatter
|
|
80
|
+
|
|
81
|
+
- `agent: true` activa el modo sub-agente.
|
|
82
|
+
- `model:` debe ser un modelo Anthropic válido. Para skills mecánicos,
|
|
83
|
+
preferir Haiku (5× más barato que Sonnet, 25× más barato que Opus 4.7).
|
|
84
|
+
- El frontmatter sigue siendo válido SWL: incluir `name`, `description`,
|
|
85
|
+
`herramientasPermitidas`, `exclusiones` y demás campos obligatorios.
|
|
86
|
+
|
|
87
|
+
### Cuerpo
|
|
88
|
+
|
|
89
|
+
- Debe ser **autocontenido**: el sub-agente NO tiene acceso al contexto
|
|
90
|
+
del padre (CLAUDE.md del proyecto, instintos cargados, sesión activa,
|
|
91
|
+
archivos previamente leídos). Todo lo que necesite saber tiene que
|
|
92
|
+
estar en el cuerpo del skill o en lo que reciba como input.
|
|
93
|
+
- El output debe ser **acotado**: si el sub-agente devuelve un dump
|
|
94
|
+
masivo, se pierde el beneficio (terminamos pasando lo mismo al padre,
|
|
95
|
+
solo con un round-trip extra). Especificar formato exacto en el
|
|
96
|
+
cuerpo del skill: número de bullets, longitud máxima, qué incluir y
|
|
97
|
+
qué no.
|
|
98
|
+
|
|
99
|
+
### Errores comunes a evitar
|
|
100
|
+
|
|
101
|
+
- **Usar Opus en `model:` para skills mecánicos**: invalida el ahorro de
|
|
102
|
+
costo. La mayoría de skills as agents deberían ser Haiku o Sonnet.
|
|
103
|
+
- **Devolver el texto crudo del input**: si el skill recibe un PDF y
|
|
104
|
+
devuelve el texto completo, no estamos aislando nada. Devuelve siempre
|
|
105
|
+
la transformación, no el material crudo.
|
|
106
|
+
- **Asumir que el skill verá el CLAUDE.md del proyecto**: no lo verá.
|
|
107
|
+
Si el skill necesita seguir convenciones del proyecto, hay que
|
|
108
|
+
explicárselas en el cuerpo.
|
|
109
|
+
|
|
110
|
+
## Skills SWL candidatos al patrón (no migración masiva)
|
|
111
|
+
|
|
112
|
+
Evaluación caso por caso. NO aplicar masivamente — el patrón aporta solo
|
|
113
|
+
cuando el skill consume input grande y devuelve output acotado.
|
|
114
|
+
|
|
115
|
+
| Skill SWL | Por qué encaja | Modelo recomendado |
|
|
116
|
+
|-----------|----------------|--------------------|
|
|
117
|
+
| `extraccion-documentos` | Procesa PDFs/Office grandes | Haiku |
|
|
118
|
+
| `mapear-codebase` | Procesa codebase entero, devuelve reporte | Sonnet |
|
|
119
|
+
| `wiki-conocimiento` (modo query) | Búsqueda en wiki con respuesta acotada | Sonnet |
|
|
120
|
+
|
|
121
|
+
Skills NO candidatos (son passive, su valor es cargar reglas al contexto del padre):
|
|
122
|
+
|
|
123
|
+
- `manejo-errores`, `auth-patrones`, `api-rest-diseno`, `accesibilidad-a11y`, etc.
|
|
124
|
+
- Toda regla de estilo o convención por lenguaje.
|
|
125
|
+
- Toda regla SWL en `reglas/`.
|
|
126
|
+
|
|
127
|
+
## Implicaciones operativas
|
|
128
|
+
|
|
129
|
+
### Costo
|
|
130
|
+
|
|
131
|
+
Spawn de sub-agente tiene overhead (system prompt + carga del skill +
|
|
132
|
+
contexto inicial). Para inputs chicos, el overhead supera el ahorro.
|
|
133
|
+
Regla práctica: usar el patrón si el input que el skill procesa es
|
|
134
|
+
≥3,000 tokens (o ≥10K caracteres).
|
|
135
|
+
|
|
136
|
+
### Latencia
|
|
137
|
+
|
|
138
|
+
El padre espera al sub-agente antes de continuar. Si el skill demora >10s,
|
|
139
|
+
considerar si la operación cabe en el padre directamente (sin spawn).
|
|
140
|
+
|
|
141
|
+
### Trazabilidad
|
|
142
|
+
|
|
143
|
+
Los sub-agentes spawneados aparecen en `claude-usage` (vendor SWL) como
|
|
144
|
+
invocaciones separadas con su propio modelo. Útil para entender qué
|
|
145
|
+
porcentaje del costo viene de sub-agentes vs. trabajo del padre.
|
|
146
|
+
|
|
147
|
+
### Compatibilidad con SWL
|
|
148
|
+
|
|
149
|
+
- El skill sigue registrado normalmente en `manifiestos/modulos.json`.
|
|
150
|
+
- El skill se invoca igual: `Skill("nombre")`. La diferencia es interna
|
|
151
|
+
(el harness Anthropic decide si lo carga al padre o lo ejecuta como
|
|
152
|
+
sub-agente según el frontmatter).
|
|
153
|
+
- Hooks SWL siguen aplicando: `linea-estado.js`, `monitor-contexto.js`,
|
|
154
|
+
`audit-trail.js` registran las invocaciones del sub-agente.
|
|
155
|
+
|
|
156
|
+
## Referencias
|
|
157
|
+
|
|
158
|
+
- Artículo de origen: "Claude Code's Limits Are Generous. The Problem Is
|
|
159
|
+
Your Harness." (sección 2.3 — Skills Can Also Be Invoked as Agents).
|
|
160
|
+
- Documentación oficial Anthropic sobre Claude Skills (cuando esté
|
|
161
|
+
disponible).
|
|
162
|
+
- `Skill("harness-claude-code")` — uso operativo del patrón en sesiones
|
|
163
|
+
largas, junto con sub-agentes via Task tool y delegación explícita.
|
|
@@ -4,12 +4,12 @@ description: >
|
|
|
4
4
|
Testing Next.js con Vitest, React Testing Library, Playwright y MSW.
|
|
5
5
|
Cubre Server Components, Server Actions, page objects E2E y mocking de API.
|
|
6
6
|
Cargar cuando se escriban tests de componentes, integración o E2E en Next.js.
|
|
7
|
-
version: "1.0
|
|
7
|
+
version: "1.1.0"
|
|
8
8
|
evolved: true
|
|
9
|
-
evolved-from: "1.0.
|
|
10
|
-
evolved-at: "2026-05-
|
|
9
|
+
evolved-from: "1.0.1"
|
|
10
|
+
evolved-at: "2026-05-12"
|
|
11
11
|
evolved-by: "aprender"
|
|
12
|
-
evolved-note: "L-
|
|
12
|
+
evolved-note: "Backport L-139 SIGM: tests con vi.stubGlobal('fetch') no validan contrato real backend↔frontend; añadir test de contrato con codegen api-types.ts; previo L-106 getByText vs getAllByText"
|
|
13
13
|
herramientasPermitidas: [Read]
|
|
14
14
|
exclusiones:
|
|
15
15
|
- "No cargar para tests React puros fuera del contexto de Next.js (Vite, CRA, Remix) — los mocks del router de Next.js y los Server Components son específicos del framework."
|
|
@@ -346,11 +346,95 @@ Regla práctica: si el texto aparece duplicado, casi siempre la intención del t
|
|
|
346
346
|
- [ ] E2E con Page Objects para reutilizar selectores
|
|
347
347
|
- [ ] `onUnhandledRequest: 'error'` en MSW para detectar fetches sin handler
|
|
348
348
|
|
|
349
|
+
## Anti-patrón crítico — Mocks `fetch` globales NO validan contrato con backend
|
|
350
|
+
|
|
351
|
+
**Síntoma** (L-139 SIGM 2026-05-12): la suite Vitest pasa 538/538 con `vi.stubGlobal('fetch')` retornando responses arbitrarios. Cero confianza real en el contrato API porque los mocks aceptan cualquier shape de request/response.
|
|
352
|
+
|
|
353
|
+
**Caso real**: `useCajaCobro.ts` construía `CobroConsolidadoRequest` con campos `contribuyente_id`/`caja_id`/`modalidad_facturacion`/`forma_pago: "01"` (códigos SAT). El backend espera `persona_id`/`corte_caja_id`/`modalidad`/`forma_pago: Literal["efectivo","tarjeta","documento"]` + desglose `monto_efectivo/tarjeta/documento/monto_total_declarado`. El cobro NO funcionaba end-to-end. Tests pasaban porque el mock global aceptaba el payload mal-formado sin validación.
|
|
354
|
+
|
|
355
|
+
**Causa raíz**: `vi.stubGlobal('fetch')` reemplaza fetch con un mock que no verifica el shape del body — solo registra que fue llamado.
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
// MAL — el test pasa con cualquier shape de body
|
|
359
|
+
beforeEach(() => {
|
|
360
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
361
|
+
ok: true,
|
|
362
|
+
json: async () => ({ data: { folio_operacion: 'X', total: '100' } })
|
|
363
|
+
}))
|
|
364
|
+
})
|
|
365
|
+
|
|
366
|
+
it('envía cobro', async () => {
|
|
367
|
+
await ejecutarCobro(...)
|
|
368
|
+
expect(fetch).toHaveBeenCalledWith(
|
|
369
|
+
'/api/v1/caja/cobro',
|
|
370
|
+
expect.objectContaining({ method: 'POST' }) // no valida body
|
|
371
|
+
)
|
|
372
|
+
})
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
// BIEN — agregar test de contrato que valide shape contra codegen
|
|
377
|
+
import type { components } from '@/lib/api-types'
|
|
378
|
+
import { z } from 'zod'
|
|
379
|
+
|
|
380
|
+
// Schema zod derivado del codegen (regenerable con openapi-zod-client)
|
|
381
|
+
const CobroConsolidadoRequestSchema = z.object({
|
|
382
|
+
persona_id: z.string().uuid(),
|
|
383
|
+
lineas: z.array(z.object({...})).min(1),
|
|
384
|
+
modalidad: z.enum(['consolidado', 'por_concepto']),
|
|
385
|
+
forma_pago: z.enum(['efectivo', 'tarjeta', 'documento']),
|
|
386
|
+
monto_efectivo: z.union([z.number(), z.string()]),
|
|
387
|
+
// ... resto de campos
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
it('payload de cobro cumple el contrato del backend', async () => {
|
|
391
|
+
let payloadCapturado: unknown
|
|
392
|
+
vi.stubGlobal('fetch', vi.fn().mockImplementation(async (url, opts) => {
|
|
393
|
+
payloadCapturado = JSON.parse(opts.body)
|
|
394
|
+
return { ok: true, json: async () => ({ data: {...}, meta: {} }) }
|
|
395
|
+
}))
|
|
396
|
+
|
|
397
|
+
await ejecutarCobro(...)
|
|
398
|
+
|
|
399
|
+
// VALIDA QUE EL SHAPE COINCIDE CON EL BACKEND
|
|
400
|
+
const r = CobroConsolidadoRequestSchema.safeParse(payloadCapturado)
|
|
401
|
+
expect(r.success).toBe(true)
|
|
402
|
+
if (!r.success) console.error(r.error.issues)
|
|
403
|
+
})
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
**Alternativa simple — solo TypeScript** (sin zod):
|
|
407
|
+
|
|
408
|
+
```typescript
|
|
409
|
+
// Asegurar que el código produce un objeto asignable al tipo del codegen
|
|
410
|
+
type ExpectedRequest = components['schemas']['CobroConsolidadoRequest']
|
|
411
|
+
|
|
412
|
+
it('payload tipo TypeScript matchea backend', async () => {
|
|
413
|
+
let payload: ExpectedRequest | undefined
|
|
414
|
+
vi.stubGlobal('fetch', vi.fn().mockImplementation(async (url, opts) => {
|
|
415
|
+
// Si TS compila sin error en esta asignación, el shape es compatible
|
|
416
|
+
payload = JSON.parse(opts.body) as ExpectedRequest
|
|
417
|
+
return { ok: true, json: async () => ({...}) }
|
|
418
|
+
}))
|
|
419
|
+
|
|
420
|
+
await ejecutarCobro(...)
|
|
421
|
+
expect(payload?.persona_id).toBeDefined() // campo del schema correcto
|
|
422
|
+
})
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Reglas para evitar el anti-patrón**:
|
|
426
|
+
|
|
427
|
+
1. **Mocks de `fetch` NO son sustituto de tests de contrato**. Útiles para UI y flujo, pero ciegos al shape.
|
|
428
|
+
2. **Agregar al menos 1 test de contrato por módulo** que use mockup que captura el body y lo valida contra schema (zod del codegen, TypeScript tipo del codegen, o JSON Schema de OpenAPI).
|
|
429
|
+
3. **Regenerar `api-types.ts` ante cualquier cambio de schema backend** y dejar que `tsc` falle si los tipos no cuadran.
|
|
430
|
+
4. **MSW (Mock Service Worker) > `vi.stubGlobal('fetch')`** cuando se quiere semántica más realista — MSW intercepta a nivel de red y permite definir handlers tipados.
|
|
431
|
+
|
|
349
432
|
## Referencias
|
|
350
433
|
|
|
351
434
|
- [Testing Next.js](https://nextjs.org/docs/app/building-your-application/testing)
|
|
352
435
|
- [MSW](https://mswjs.io/docs)
|
|
353
436
|
- [Playwright](https://playwright.dev/docs/intro)
|
|
437
|
+
- [openapi-zod-client](https://github.com/astahmer/openapi-zod-client) — generador de schemas zod desde OpenAPI
|
|
354
438
|
|
|
355
439
|
---
|
|
356
|
-
*Skill creado con swl:crear-skill el 2026-03-31. Versión 1.
|
|
440
|
+
*Skill creado con swl:crear-skill el 2026-03-31. Versión 1.1.0 (2026-05-12).*
|