@saulwade/swl-ses 1.8.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +8 -8
- package/README.md +13 -13
- package/agentes/accesibilidad-wcag-swl.md +3 -3
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/disenador-ui-swl.md +6 -5
- package/agentes/frontend-angular-swl.md +2 -2
- package/agentes/frontend-css-swl.md +2 -2
- package/agentes/frontend-react-swl.md +4 -4
- package/agentes/frontend-swl.md +6 -6
- package/agentes/investigador-ux-swl.md +5 -5
- package/agentes/orquestador-swl.md +96 -8
- package/agentes/perfilador-usuario-swl.md +308 -308
- package/agentes/producto-prd-swl.md +1 -1
- package/agentes/red-team-swl.md +218 -218
- package/agentes/revisor-codigo-swl.md +34 -10
- package/agentes/revisor-seguridad-swl.md +7 -0
- package/agentes/tdd-qa-swl.md +39 -2
- package/comandos/swl/actualizar.md +1 -1
- package/comandos/swl/aprender.md +2 -2
- package/comandos/swl/aprobar-plan.md +152 -0
- package/comandos/swl/autoresearch.md +102 -6
- package/comandos/swl/ayuda.md +3 -3
- package/comandos/swl/discutir-fase.md +20 -2
- package/comandos/swl/ejecutar-fase.md +53 -6
- package/comandos/swl/evolucionar.md +1 -1
- package/comandos/swl/inbox.md +1 -1
- package/comandos/swl/instalar.md +1 -1
- package/comandos/swl/nemesis.md +42 -1
- package/comandos/swl/planear-fase.md +25 -1
- package/comandos/swl/plugins.md +1 -1
- package/comandos/swl/predecir.md +139 -0
- package/comandos/swl/release.md +1 -1
- package/comandos/swl/status.md +279 -0
- package/comandos/swl/verificar.md +75 -7
- package/habilidades/ai-runtime-security/SKILL.md +1 -1
- package/habilidades/angular-moderno/SKILL.md +44 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/autoresearch/SKILL.md +15 -1
- package/habilidades/benchmark-memoria/SKILL.md +1 -1
- package/habilidades/calidad-contract-testing/SKILL.md +165 -0
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
- package/habilidades/changelog-generator/SKILL.md +9 -2
- package/habilidades/changelog-generator/scripts/parse-commits.js +12 -1
- package/habilidades/checklist-seguridad/SKILL.md +29 -1
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
- package/habilidades/css-moderno/SKILL.md +3 -1
- package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-fase/SKILL.md +64 -14
- package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
- package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
- package/habilidades/fastapi-experto/SKILL.md +56 -5
- package/habilidades/harness-claude-code/SKILL.md +10 -7
- package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
- package/habilidades/instalar-sistema/SKILL.md +3 -3
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
- package/habilidades/patrones-python/SKILL.md +8 -5
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/planear-fase/SKILL.md +25 -4
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
- package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
- package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
- package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
- package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
- package/habilidades/swl-claudemd/SKILL.md +50 -210
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
- package/habilidades/swl-dashboard/SKILL.md +9 -9
- package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
- package/habilidades/tdd-workflow/SKILL.md +58 -5
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
- package/hooks/calidad-pre-commit.js +340 -3
- package/hooks/ciclo-evolucion-subagente.js +26 -0
- package/hooks/ciclo-evolucion.js +26 -0
- package/hooks/contexto-iteracion.js +144 -0
- package/hooks/extraccion-aprendizajes.js +13 -0
- package/hooks/lib/ciclo-evolucion.js +47 -0
- package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
- package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
- package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
- package/hooks/lib/evolution-tracker.js +24 -3
- package/hooks/lib/loop-telemetry.js +321 -0
- package/hooks/notificacion-telegram.js +11 -3
- package/hooks/spec-gate.js +211 -0
- package/hooks/tdd-gate.js +241 -0
- package/hooks/validar-intent-spec.js +30 -10
- package/llms.txt +29 -0
- package/manifiestos/hooks-config.json +36 -18
- package/manifiestos/modulos.json +23 -14
- package/manifiestos/skills-lock.json +100 -72
- package/package.json +4 -3
- package/plugin.json +9 -10
- package/reglas/accesibilidad.md +10 -0
- package/reglas/api-diseno.md +9 -0
- package/reglas/arquitectura.evolved.json +7 -0
- package/reglas/arquitectura.md +65 -0
- package/reglas/auditorias-documentales-estructurales.md +7 -0
- package/reglas/cloud-infra.md +8 -0
- package/reglas/fragmentos-compartidos.md +5 -0
- package/reglas/gobernanza.md +4 -4
- package/reglas/hooks.md +6 -0
- package/reglas/intent-engineering.md +4 -0
- package/reglas/markitdown.md +8 -0
- package/reglas/memoria-consolidada.md +1 -1
- package/reglas/patrones.md +6 -0
- package/reglas/registro-componentes-nuevos.md +10 -1
- package/reglas/seguridad-agentes.md +1 -1
- package/reglas/seguridad.evolved.json +7 -0
- package/reglas/seguridad.md +144 -0
- package/reglas/skills-estandar.md +6 -0
- package/reglas/testing.md +7 -0
- package/reglas/tests-cleanup.md +4 -0
- package/reglas/usar-sistema-swl.md +1 -1
- package/scripts/generar-inventario.js +64 -1
- package/scripts/instalador.js +32 -2
- package/scripts/lib/gitignore-manifest.js +29 -1
- package/scripts/lib/plan-lock.js +275 -0
- package/scripts/migrar-fase-dominio.js +0 -1
- package/scripts/smoke-test.js +24 -2
- package/scripts/verificar-trazabilidad.js +292 -0
- package/agentes/ux-disenador-swl.md +0 -503
- package/comandos/swl/dashboard.md +0 -146
- package/comandos/swl/evolucion-estado.md +0 -191
- package/comandos/swl/metricas.md +0 -342
- package/comandos/swl/salud.md +0 -481
- package/reglas/verificar-citas-temporales.md +0 -139
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl:predecir
|
|
3
|
+
description: >
|
|
4
|
+
Análisis predictivo pre-implementación: 5 personas expertas (Arquitecto,
|
|
5
|
+
Seguridad, Rendimiento, Confiabilidad, Abogado del Diablo) analizan EN FRÍO
|
|
6
|
+
un cambio propuesto antes de implementarlo, un sintetizador deduplica con
|
|
7
|
+
anti-herd check y entrega hallazgos rankeados por severidad × confianza ×
|
|
8
|
+
acuerdo. Usar antes de /swl:planear-fase en fases de riesgo, antes de un
|
|
9
|
+
refactor grande, o cuando el costo de descubrir un problema DESPUÉS de
|
|
10
|
+
implementar es alto. Con --adversarial usa el set atacante (Rompedor,
|
|
11
|
+
Tramposo, Escalador, Novato, Insider).
|
|
12
|
+
argument-hint: "[descripción del cambio] [--scope <glob>] [--adversarial] [--presupuesto N] [--chain planear-fase]"
|
|
13
|
+
allowed-tools: [Read, Grep, Glob, Bash, Write, Agent, Skill]
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# /swl:predecir — Análisis predictivo pre-implementación
|
|
17
|
+
|
|
18
|
+
Eres el coordinador de un panel de personas expertas que evalúan un cambio
|
|
19
|
+
propuesto ANTES de que se implemente. El valor del comando está en el
|
|
20
|
+
aislamiento: cada persona analiza en frío, sin ver a las demás — los sesgos
|
|
21
|
+
de manada y de confirmación se eliminan por construcción.
|
|
22
|
+
|
|
23
|
+
Complementa (no reemplaza) a `/swl:verificar` y `/swl:nemesis`: esos auditan
|
|
24
|
+
código que YA existe; `predecir` ataca el plan cuando corregirlo cuesta una
|
|
25
|
+
conversación, no un refactor.
|
|
26
|
+
|
|
27
|
+
## Cuándo usar
|
|
28
|
+
|
|
29
|
+
- Antes de `/swl:planear-fase` en fases que tocan auth, dinero, datos
|
|
30
|
+
productivos o contratos públicos de API.
|
|
31
|
+
- Antes de un refactor cross-módulo o una migración de schema.
|
|
32
|
+
- Cuando el usuario duda entre implementar o no un cambio con blast radius alto.
|
|
33
|
+
|
|
34
|
+
**Cuándo NO usar**: cambios triviales (1-2 archivos), código ya implementado
|
|
35
|
+
(usar `/swl:verificar`), o decisiones entre 2+ alternativas (usar el debate
|
|
36
|
+
adversarial de `Skill("proceso-debate-adversarial")` — predecir analiza UNA
|
|
37
|
+
propuesta, el debate compara varias).
|
|
38
|
+
|
|
39
|
+
## Flags
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
[descripción] La propuesta de cambio a analizar (obligatoria; si falta, preguntar)
|
|
43
|
+
--scope <glob> Archivos relevantes para grounding (default: derivar del texto)
|
|
44
|
+
--adversarial Set de personas atacantes en vez del set default
|
|
45
|
+
--presupuesto N Máximo de hallazgos totales (default: 40 → 8 por persona)
|
|
46
|
+
--chain planear-fase Al terminar, ofrecer arrancar /swl:planear-fase con los hallazgos como contexto
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Paso 0 — Carga y configuración
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Skill("proceso-debate-adversarial")
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
El skill define el protocolo COLD START, el anti-herd check y el formato de
|
|
56
|
+
síntesis. Las definiciones de personas viven en
|
|
57
|
+
`habilidades/proceso-debate-adversarial/recursos/personas.md`.
|
|
58
|
+
|
|
59
|
+
Confirmar con el usuario: propuesta, scope, set de personas, presupuesto.
|
|
60
|
+
|
|
61
|
+
## Paso 1 — Reconocimiento del codebase
|
|
62
|
+
|
|
63
|
+
Construir el paquete de conocimiento que recibirá CADA persona (idéntico para
|
|
64
|
+
todas): descripción de la propuesta + inventario de archivos del scope +
|
|
65
|
+
dependencias relevantes + superficie de API afectada + cobertura de tests del
|
|
66
|
+
área. Usar `code-review-graph` si está disponible (blast radius, callers);
|
|
67
|
+
si no, Grep/Glob dirigidos. Máximo ~1,500 tokens — las personas analizan, no
|
|
68
|
+
exploran.
|
|
69
|
+
|
|
70
|
+
## Paso 2 — Análisis en frío (5 invocaciones Agent independientes)
|
|
71
|
+
|
|
72
|
+
Por cada persona, UNA invocación del Agent tool (general-purpose o el agente
|
|
73
|
+
afín al dominio) con prompt autocontenido:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Eres [persona] — [enfoque de recursos/personas.md].
|
|
77
|
+
Propuesta: [descripción]
|
|
78
|
+
Contexto del codebase: [paquete del Paso 1]
|
|
79
|
+
Tu tarea: encuentra hasta [presupuesto/5] problemas que esta propuesta
|
|
80
|
+
causaría, desde tu perspectiva. Por cada uno: título, severidad
|
|
81
|
+
(crítico/alto/medio/bajo), confianza 0-100%, archivo:línea si aplica,
|
|
82
|
+
recomendación concreta. Preguntas guía: [de la persona]. Red flags: [de la
|
|
83
|
+
persona]. NO incluyas elogios ni evaluación general — solo hallazgos.
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Las 5 invocaciones pueden correr en paralelo. NUNCA pasar el output de una
|
|
87
|
+
persona a otra — el aislamiento es el mecanismo del comando.
|
|
88
|
+
|
|
89
|
+
## Paso 3 — Síntesis con anti-herd check
|
|
90
|
+
|
|
91
|
+
Aplicar el protocolo de síntesis del skill:
|
|
92
|
+
|
|
93
|
+
1. Deduplicar (mismo archivo:línea + mismo problema → fusionar, severidad más alta gana).
|
|
94
|
+
2. Registrar disensos (dos personas en desacuerdo → ambas posturas visibles).
|
|
95
|
+
3. **Anti-herd check**: si todas las personas coinciden en el hallazgo top,
|
|
96
|
+
generar explícitamente ≥1 contraargumento antes de aceptarlo.
|
|
97
|
+
4. Rankear: `severidad × confianza promedio × número de personas que coinciden`.
|
|
98
|
+
|
|
99
|
+
## Paso 4 — Reporte y persistencia
|
|
100
|
+
|
|
101
|
+
Persistir en `.planning/loops/predecir-[timestamp]/` con
|
|
102
|
+
`hooks/lib/loop-telemetry.js` (tipo `predecir`, columnas `iteracion,
|
|
103
|
+
timestamp, hallazgo, severidad, confianza, personas, archivo_linea`; una fila
|
|
104
|
+
por hallazgo consensuado) + `escribirHandoff` con `source: 'swl:predecir'`,
|
|
105
|
+
`findings` rankeados y `config: {propuesta, scope}`.
|
|
106
|
+
|
|
107
|
+
Reportar al usuario:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
=== Predicción — [propuesta resumida] ===
|
|
111
|
+
Personas: [set] | Hallazgos brutos: N | Tras dedup: M
|
|
112
|
+
|
|
113
|
+
## Top hallazgos (rankeados)
|
|
114
|
+
| # | Hallazgo | Severidad | Confianza | Acuerdo | archivo:línea | Recomendación |
|
|
115
|
+
|
|
116
|
+
## Disensos registrados
|
|
117
|
+
- [persona X sostiene A; persona Y sostiene B — evidencia de cada una]
|
|
118
|
+
|
|
119
|
+
## Veredicto del panel
|
|
120
|
+
[PROCEDER | PROCEDER CON AJUSTES (lista) | REPLANTEAR (razón)]
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Paso 5 — Encadenamiento (si `--chain planear-fase`)
|
|
124
|
+
|
|
125
|
+
Ofrecer arrancar `/swl:planear-fase` indicando el directorio del handoff. El
|
|
126
|
+
planificador incorpora los hallazgos `crítico`/`alto` como restricciones del
|
|
127
|
+
PLAN.md — cada uno se atiende con una tarea o se descarta con justificación
|
|
128
|
+
explícita (nunca silenciosamente).
|
|
129
|
+
|
|
130
|
+
## Reglas de comportamiento
|
|
131
|
+
|
|
132
|
+
- NUNCA compartir contexto entre personas — una invocación Agent por persona.
|
|
133
|
+
- NUNCA omitir el anti-herd check cuando hay unanimidad.
|
|
134
|
+
- Los hallazgos con archivo:línea citan código REAL verificado en el Paso 1 —
|
|
135
|
+
regla `verificar-citas-normativas.md § Familia 2` aplica al propio output.
|
|
136
|
+
- El comando NO modifica código — produce análisis. Implementar es del flujo
|
|
137
|
+
planear → ejecutar.
|
|
138
|
+
- Con 0 hallazgos crítico/alto: decirlo claramente y no inflar hallazgos
|
|
139
|
+
menores para justificar el costo del panel.
|
package/comandos/swl/release.md
CHANGED
|
@@ -167,7 +167,7 @@ node scripts/generar-skills-lock.js
|
|
|
167
167
|
git add manifiestos/skills-lock.json
|
|
168
168
|
```
|
|
169
169
|
|
|
170
|
-
El lock contiene SHA256 de cada SKILL.md y permite que `/swl:salud` detecte
|
|
170
|
+
El lock contiene SHA256 de cada SKILL.md y permite que `/swl:status salud` detecte
|
|
171
171
|
drift silencioso entre releases. Si el lock no cambió respecto al anterior,
|
|
172
172
|
el commit lo refleja como no-op (idempotente). El archivo es pequeño (~37KB)
|
|
173
173
|
y debe versionarse.
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl:status
|
|
3
|
+
description: Comando unificado de observabilidad del sistema y la sesión. Enruta a subcomandos [salud | metricas | loops | evolucion | historico | dashboard] que reportan salud del sistema SWL, métricas de la sesión actual, trayectorias de loops iterativos, estado del ciclo de auto-evolución y dashboard histórico multi-sesión. Reemplaza los comandos previos /swl:salud, /swl:metricas, /swl:dashboard y /swl:evolucion-estado (fusionados en este desde la Fase 09).
|
|
4
|
+
allowed_tools: ["Read", "Write", "Bash", "Glob", "Grep"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:status <subcomando> — Observabilidad unificada
|
|
8
|
+
|
|
9
|
+
Punto único de observabilidad de swl-ses. Fusiona los cuatro comandos previos de
|
|
10
|
+
diagnóstico en un router con subcomandos. Cada subcomando delega exactamente en
|
|
11
|
+
la misma lógica (skill o script) que usaba el comando original — sin pérdida de
|
|
12
|
+
funcionalidad ni de flags.
|
|
13
|
+
|
|
14
|
+
## Uso
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/swl:status salud — Diagnóstico de salud del sistema SWL (genera SALUD.md)
|
|
18
|
+
/swl:status metricas — Métricas de la sesión actual (tokens, costo, herramientas)
|
|
19
|
+
/swl:status metricas detalle — Desglose completo por herramienta, agente y timeline
|
|
20
|
+
/swl:status metricas fases — Progreso de fases del proyecto (desde feature-list.json)
|
|
21
|
+
/swl:status loops — Trayectorias de loops iterativos (.planning/loops/)
|
|
22
|
+
/swl:status evolucion — Estado del ciclo de auto-evolución (health_score, nudges…)
|
|
23
|
+
/swl:status evolucion --json — JSON crudo de metricas.json (para pipes)
|
|
24
|
+
/swl:status evolucion --dias=N — Regenera métricas con ventana de N días (default 14)
|
|
25
|
+
/swl:status evolucion --regenerar — Fuerza recomputo del hook ciclo-evolucion.js (etapa métricas)
|
|
26
|
+
/swl:status historico — Dashboard histórico multi-sesión (web, auto-puerto)
|
|
27
|
+
/swl:status dashboard — Alias de historico
|
|
28
|
+
/swl:status dashboard --port 9090 — Fuerza puerto específico del dashboard
|
|
29
|
+
/swl:status dashboard today — Resumen de consumo del día (terminal)
|
|
30
|
+
/swl:status dashboard stats — Estadísticas históricas all-time (terminal)
|
|
31
|
+
/swl:status dashboard scan — Sincroniza JSONL → SQLite sin abrir el dashboard
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Sin subcomando: pide al usuario cuál quiere, o muestra `salud` + `metricas`
|
|
35
|
+
como vista por defecto si el contexto lo sugiere.
|
|
36
|
+
|
|
37
|
+
## Tabla de enrutamiento (delegación 1:1)
|
|
38
|
+
|
|
39
|
+
| Subcomando | Delega en | Origen previo |
|
|
40
|
+
|------------|-----------|---------------|
|
|
41
|
+
| `salud` | `Skill("validacion-ci-sistema")` | `/swl:salud` |
|
|
42
|
+
| `metricas` (+ `detalle`, `fases`) | scripts de métricas de sesión + `derivar-feature-list.js` | `/swl:metricas` |
|
|
43
|
+
| `loops` | `hooks/lib/loop-telemetry.js` | `/swl:metricas loops` |
|
|
44
|
+
| `evolucion` | `hooks/ciclo-evolucion.js` (etapa métricas) + `.planning/evolution/metricas.json` | `/swl:evolucion-estado` |
|
|
45
|
+
| `historico` / `dashboard` | `Skill("swl-dashboard")` | `/swl:dashboard` |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Subcomando: `salud`
|
|
50
|
+
|
|
51
|
+
Diagnóstico de salud del sistema SWL con **verificaciones deterministas**
|
|
52
|
+
(conteos, existencia de campos, sintaxis). Genera `SALUD.md` con score objetivo.
|
|
53
|
+
**Solo lectura** — no modifica nada salvo `SALUD.md`. Para corregir problemas,
|
|
54
|
+
usar `/swl:evolucionar`.
|
|
55
|
+
|
|
56
|
+
**Carga**: `Skill("validacion-ci-sistema")` — contiene las reglas de validación
|
|
57
|
+
por componente (agentes, skills, hooks, comandos, reglas), la tabla de exit codes
|
|
58
|
+
y el checklist de integridad. Toda la lógica de verificación vive en el skill.
|
|
59
|
+
|
|
60
|
+
**Cuándo usar**: antes de iniciar proyecto nuevo, tras modificar agentes/skills
|
|
61
|
+
manualmente, tras merge/pull, o como mantenimiento mensual.
|
|
62
|
+
|
|
63
|
+
**Score global ponderado**:
|
|
64
|
+
```
|
|
65
|
+
Score = agentes×0.30 + skills×0.25 + comandos×0.20 + reglas×0.15 + hooks×0.10
|
|
66
|
+
90-100 Excelente · 75-89 Saludable · 60-74 Funcional · <60 Crítico
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Pasos siempre activos**: inventario determinista, detección de tier del proyecto
|
|
70
|
+
(Simple <500 / Standard 500-5000 / Complex >5000 archivos), diagnóstico de los 5
|
|
71
|
+
componentes, y calidad de `CLAUDE.md` (ADR-0016):
|
|
72
|
+
```bash
|
|
73
|
+
npx -y @saulwade/swl-ses@latest audit-claudemd --json
|
|
74
|
+
```
|
|
75
|
+
Umbrales ajustables: `SWL_CLAUDEMD_MAX_LINES` (default 200),
|
|
76
|
+
`SWL_CLAUDEMD_MAX_BULLET_CHARS` (default 1000).
|
|
77
|
+
|
|
78
|
+
**Auditorías opt-in** (cada una se activa con su variable de entorno; si no está
|
|
79
|
+
definida, el paso se omite sin afectar el score — diseño zero-config):
|
|
80
|
+
|
|
81
|
+
| Variable | Qué audita | Comando |
|
|
82
|
+
|----------|-----------|---------|
|
|
83
|
+
| `SWL_AUDIT_SKILLS=1` | Prompt injection, secretos, URLs sospechosas y estructura en SKILL.md | `bash scripts/audit-skills.sh` (requiere `uv`) |
|
|
84
|
+
| `SWL_AUDIT_FRAMEWORKS=1` | Cobertura de NIST CSF/AI RMF, MITRE ATLAS/ATT&CK, D3FEND en skills de seguridad | `npx -y @saulwade/swl-ses@latest audit-coverage-frameworks --resumen` |
|
|
85
|
+
| `SWL_AUDIT_AGENTES=1` | Agentes sin Exclusion Clause o Gotchas (anti agent-hijacking) | `npx -y @saulwade/swl-ses@latest audit-agents-gaps --resumen` |
|
|
86
|
+
|
|
87
|
+
**Verificación de drift de skills** (si existe `manifiestos/skills-lock.json`):
|
|
88
|
+
```bash
|
|
89
|
+
npx -y @saulwade/swl-ses@latest generate-skills-lock --check
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Smoke test de MCP** (si hay servers en `.claude/settings.json` o configs globales):
|
|
93
|
+
```bash
|
|
94
|
+
python scripts/mcp-orchestrator.py status --json 2>/dev/null
|
|
95
|
+
```
|
|
96
|
+
Detecta drift de apiKeys (`40101`), binarios faltantes y `"env": {}` que rompe la
|
|
97
|
+
herencia de variables — antes de que fallen en uso interactivo.
|
|
98
|
+
|
|
99
|
+
Formato de salida enriquecido vía `scripts/lib/health-row.js` (barras Unicode;
|
|
100
|
+
respeta `NO_COLOR` y `SWL_ASCII_SIMPLE=1`). Genera `SALUD.md` con los datos
|
|
101
|
+
exactos de los scripts — sin ajustar el score "porque parece sano".
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Subcomando: `metricas`
|
|
106
|
+
|
|
107
|
+
Métricas acumuladas de la **sesión actual**: tokens, costo estimado USD, tool
|
|
108
|
+
calls y distribución por herramienta, más el estado del presupuesto configurado.
|
|
109
|
+
|
|
110
|
+
**Fuentes de datos**:
|
|
111
|
+
```bash
|
|
112
|
+
# 1. Bridge de tracking de la sesión (generado por el hook de costos)
|
|
113
|
+
ls /tmp/swl-costs-*.json 2>/dev/null | sort -t- -k3 -n | tail -1
|
|
114
|
+
# 2. Métricas persistidas del proyecto
|
|
115
|
+
cat .planning/METRICAS.md 2>/dev/null || echo "(sin métricas previas)"
|
|
116
|
+
# 3. Presupuesto configurado
|
|
117
|
+
node -e "const c=require('./manifiestos/hooks-config.json').costBudget||{}; console.log('maxUsd:',c.maxUsd??'no configurado','| maxTokens:',c.maxTokens??'no configurado','| alertAt:',c.alertAt??'no configurado')"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Construir el resumen con: tool calls totales, tokens, costo estimado, modelo
|
|
121
|
+
predominante, estado de presupuesto (`OK`/`ALERTA`/`EXCEDIDO`) y top 5
|
|
122
|
+
herramientas por costo. Si el estado es ALERTA (≥ `alertAt`), sugerir
|
|
123
|
+
`/swl:compactar`. Si EXCEDIDO, recomendar revisar `manifiestos/hooks-config.json`.
|
|
124
|
+
|
|
125
|
+
### `metricas detalle`
|
|
126
|
+
|
|
127
|
+
Desglose completo: tabla por herramienta (calls, tokens entrada/salida, costo),
|
|
128
|
+
desglose por agente SWL desde `costePorAgente` del bridge, comparativa histórica
|
|
129
|
+
contra `~/.claude/usage.db` (últimos 30 días) y timeline de actividad por bloques
|
|
130
|
+
de 5 minutos.
|
|
131
|
+
|
|
132
|
+
### `metricas fases`
|
|
133
|
+
|
|
134
|
+
Progreso de fases del proyecto. Regenera primero el JSON derivado de
|
|
135
|
+
`HOJA-RUTA.md` (fuente de verdad) y lo lee:
|
|
136
|
+
```bash
|
|
137
|
+
node scripts/derivar-feature-list.js
|
|
138
|
+
cat .planning/feature-list.json
|
|
139
|
+
```
|
|
140
|
+
Reporta totales por estado canónico (`completado`, `en_progreso`, `pendiente`,
|
|
141
|
+
`bloqueado`, `spec_listo`), lista de fases con marca visual y artefactos
|
|
142
|
+
presentes (`[PLAN]`/`[RESUMEN]`), y timestamp de generación. Detección de drift:
|
|
143
|
+
`node scripts/derivar-feature-list.js --check` (exit 2 si drift).
|
|
144
|
+
|
|
145
|
+
### Notas de precisión
|
|
146
|
+
|
|
147
|
+
Los costos son estimaciones según precios publicados de la API de Anthropic. El
|
|
148
|
+
real varía por modelo efectivo, caché de prompt y región/plan. Para costos
|
|
149
|
+
exactos, el dashboard de Anthropic Console.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Subcomando: `loops`
|
|
154
|
+
|
|
155
|
+
Trayectorias de loops iterativos registradas por `hooks/lib/loop-telemetry.js`
|
|
156
|
+
en `.planning/loops/`:
|
|
157
|
+
```bash
|
|
158
|
+
node -e "
|
|
159
|
+
const fs = require('fs'), path = require('path');
|
|
160
|
+
const lt = require('./hooks/lib/loop-telemetry');
|
|
161
|
+
const base = path.join(process.cwd(), lt.DIR_LOOPS);
|
|
162
|
+
let dirs = [];
|
|
163
|
+
try { dirs = fs.readdirSync(base).map(d => path.join(base, d)).filter(d => fs.statSync(d).isDirectory()); } catch {}
|
|
164
|
+
if (dirs.length === 0) { console.log('(sin corridas de loops registradas)'); process.exit(0); }
|
|
165
|
+
for (const dir of dirs.sort().slice(-10)) {
|
|
166
|
+
try {
|
|
167
|
+
const t = lt.analizarTrayectoria(dir);
|
|
168
|
+
const h = lt.leerHandoff(dir);
|
|
169
|
+
console.log(path.basename(dir) + ' | iters: ' + t.totalIteraciones +
|
|
170
|
+
' | keep/revert: ' + t.keeps + '/' + t.reverts +
|
|
171
|
+
' | métrica: ' + t.metricaInicial + ' → ' + t.metricaFinal +
|
|
172
|
+
' | plateau: ' + (t.plateau ? 'SÍ' : 'no') +
|
|
173
|
+
' | status: ' + (h ? h.status : 'en curso'));
|
|
174
|
+
} catch (e) { console.log(path.basename(dir) + ' | (ilegible: ' + e.message + ')'); }
|
|
175
|
+
}
|
|
176
|
+
"
|
|
177
|
+
```
|
|
178
|
+
Reportar en tabla: corrida, iteraciones, keep/revert rate, métrica inicial →
|
|
179
|
+
final, plateau y status. Si una corrida activa muestra plateau, sugerir cerrarla
|
|
180
|
+
— iterar sin mejora quema tokens.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Subcomando: `evolucion`
|
|
185
|
+
|
|
186
|
+
Estado del ciclo de auto-evolución en la ventana reciente (default 14 días).
|
|
187
|
+
Responde con datos a "¿el sistema está aprendiendo?".
|
|
188
|
+
|
|
189
|
+
**Flags**: `--json` (emite el JSON crudo de `metricas.json`), `--dias=N`
|
|
190
|
+
(ventana de N días), `--regenerar` (fuerza recomputo del hook).
|
|
191
|
+
|
|
192
|
+
**Paso 0 — métricas frescas** (si `--regenerar` o `metricas.json` > 24h):
|
|
193
|
+
```bash
|
|
194
|
+
echo '{}' | node hooks/ciclo-evolucion.js
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Paso 1 — cargar**:
|
|
198
|
+
```bash
|
|
199
|
+
cat .planning/evolution/metricas.json
|
|
200
|
+
```
|
|
201
|
+
Si no existe, ejecutar el regenerado; si sigue sin existir, reportar que el ciclo
|
|
202
|
+
no ha corrido aún.
|
|
203
|
+
|
|
204
|
+
**Dashboard** (formato humano) con secciones: health_score + badge, NUDGES
|
|
205
|
+
(emitidos/accionados/pendientes por tipo), INSTINTOS (proyecto/global/perfil),
|
|
206
|
+
AGENTES (runs/fallos/tasa), EVOLUCIONES (aplicadas/revertidas/rollback ratio),
|
|
207
|
+
CALIDAD CONDUCTUAL (fallos por tipo, reintentos, latencia), ALERTAS PERSISTENTES
|
|
208
|
+
y KERNEL (gobernanza: política evolvable, último ADR kernel, ratio
|
|
209
|
+
`evolvable=false`/total).
|
|
210
|
+
|
|
211
|
+
**Badges**: ≥90 🏆 Óptimo · ≥75 🥇 Saludable · ≥60 🥈 Parcial · ≥40 🥉 Esqueleto
|
|
212
|
+
· <40 ⚠️ Dormido.
|
|
213
|
+
|
|
214
|
+
**Recomendaciones contextuales** (máx 3, al final): bootstrap de instintos si
|
|
215
|
+
`instintos.proyecto==0` y `aprendizajes>10`; revisar alertas si `tasaAccion<0.3`;
|
|
216
|
+
candidatos a `/swl:evolucionar` si `tasaExito<70`; etc.
|
|
217
|
+
|
|
218
|
+
**Anti-substitution**: el archivo de métricas es **siempre**
|
|
219
|
+
`.planning/evolution/metricas.json` (nunca `.planning/metricas.json` ni variantes);
|
|
220
|
+
el hook que regenera es **siempre** `hooks/ciclo-evolucion.js` (etapa métricas, Fase 11); para forzar
|
|
221
|
+
regen usar el pipe `echo '{}' | node ...`, nunca `require()` directo.
|
|
222
|
+
|
|
223
|
+
**Response discipline**: con `--json`, la respuesta es el contenido crudo del
|
|
224
|
+
archivo, sin prosa.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Subcomando: `historico` / `dashboard`
|
|
229
|
+
|
|
230
|
+
Dashboard histórico multi-sesión vía `claude-usage` (vendored). Complementa
|
|
231
|
+
`metricas` (sesión actual) con perspectiva multi-sesión y gráficos interactivos.
|
|
232
|
+
|
|
233
|
+
**Carga**: `Skill("swl-dashboard")` con el subcomando indicado:
|
|
234
|
+
- (vacío) o `historico` → dashboard web (auto-detecta puerto: 8888, 9090, 9191…)
|
|
235
|
+
- `--port N` → fuerza un puerto
|
|
236
|
+
- `today` → resumen del día en terminal
|
|
237
|
+
- `stats` → estadísticas históricas all-time en terminal
|
|
238
|
+
- `scan` → solo sincroniza JSONL → SQLite sin abrir el dashboard
|
|
239
|
+
|
|
240
|
+
### Integración con Mission Control (opt-in)
|
|
241
|
+
|
|
242
|
+
Dashboard web externo para orquestación de flotas de agentes. **Completamente
|
|
243
|
+
opcional** — el dashboard local funciona igual sin configurarlo.
|
|
244
|
+
|
|
245
|
+
| Variable | Descripción | Ejemplo |
|
|
246
|
+
|----------|-------------|---------|
|
|
247
|
+
| `SWL_MC_URL` | URL base de la instancia de MC | `http://localhost:3000` |
|
|
248
|
+
| `SWL_MC_TOKEN` | API key de MC (si hay auth) | `mc-key-abc123` |
|
|
249
|
+
|
|
250
|
+
- Con `SWL_MC_URL` definida: el comando detecta MC (vía `scripts/lib/mc-client.js`)
|
|
251
|
+
y ofrece redirigir al panel web. Si MC no responde en 2s, fallback graceful al
|
|
252
|
+
dashboard local con mensaje informativo (sin crash ni degradación silenciosa).
|
|
253
|
+
- Sin `SWL_MC_URL`: dashboard local sin cambios (zero-config).
|
|
254
|
+
|
|
255
|
+
Instalar MC (opcional): `git clone https://github.com/builderzlabs/mission-control`
|
|
256
|
+
→ `docker compose up` (requiere Node ≥22, pnpm; genera su API key al primer
|
|
257
|
+
arranque). MC expone además un **servidor MCP con ~49 tools** (agentes, memoria,
|
|
258
|
+
soul, tareas, sesiones, tokens/costos, skills, cron, runs/evals). swl-ses **NO**
|
|
259
|
+
modifica `.claude/settings.json` automáticamente — el registro del MCP es manual.
|
|
260
|
+
|
|
261
|
+
**Seguridad**: el MCP de MC incluye tools de **escritura** (`mc_create_task`,
|
|
262
|
+
`mc_write_memory`, `mc_write_soul`…). Antes de activarlo, evaluar exposición de
|
|
263
|
+
red, permisos mínimos de la API key y confianza en los agentes que lo invocarán.
|
|
264
|
+
La regla `seguridad-agentes.md` recomienda documentarlo en
|
|
265
|
+
`.planning/MCP_REGISTRY.md`.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Reglas de comportamiento
|
|
270
|
+
|
|
271
|
+
- `salud` y `evolucion` son **solo lectura** (salvo que `salud` genera `SALUD.md`).
|
|
272
|
+
Para corregir, usar `/swl:evolucionar`.
|
|
273
|
+
- Las verificaciones de `salud` son scripts deterministas — no usar juicio
|
|
274
|
+
subjetivo ni ajustar scores "porque parece sano".
|
|
275
|
+
- Los reportes opt-in de auditoría (`SWL_AUDIT_SKILLS`, `SWL_AUDIT_FRAMEWORKS`,
|
|
276
|
+
`SWL_AUDIT_AGENTES`) nunca bloquean el diagnóstico: si fallan (red,
|
|
277
|
+
dependencia, paquete no publicado), el flujo continúa.
|
|
278
|
+
- Respetar `--json` como salida cruda sin prosa donde aplique (`evolucion`).
|
|
279
|
+
- No reintroducir los comandos eliminados: este comando los reemplaza.
|
|
@@ -137,18 +137,30 @@ Verifica que los mensajes de commit siguen la convención del proyecto (si está
|
|
|
137
137
|
|
|
138
138
|
Delega al agente `revisor-codigo-swl` para revisión de código en profundidad.
|
|
139
139
|
|
|
140
|
+
**Presupuesto de contexto (anti-thrashing):** el subagente hereda `CLAUDE.md` +
|
|
141
|
+
reglas globales del proyecto; en proyectos rule-heavy eso consume buena parte de
|
|
142
|
+
su ventana antes de leer código (causa de autocompact thrashing con 0 tokens
|
|
143
|
+
útiles, observado 2026-06-05). Para evitarlo:
|
|
144
|
+
- Pasa al agente SOLO el diff / los archivos del alcance — nunca "revisa el proyecto".
|
|
145
|
+
- Instruye leer los archivos del alcance PRIMERO y cargar skills bajo demanda (solo
|
|
146
|
+
si el alcance lo amerita), no al inicio.
|
|
147
|
+
- Si el alcance > ~15 archivos o > ~2000 LOC, divídelo en lotes y delega uno por
|
|
148
|
+
invocación (cada subagente arranca con ventana limpia).
|
|
149
|
+
|
|
140
150
|
**Instrucción al agente revisor-codigo-swl:**
|
|
141
151
|
|
|
142
152
|
```
|
|
143
|
-
Revisa
|
|
153
|
+
Revisa SOLO los archivos del alcance de la Fase N del proyecto [nombre].
|
|
154
|
+
No explores el codebase completo: tu ventana ya hereda CLAUDE.md + reglas
|
|
155
|
+
globales; lee primero los archivos del alcance para no saturarla.
|
|
144
156
|
|
|
145
157
|
Archivos a revisar (en orden de prioridad):
|
|
146
|
-
[lista del RESUMEN.md]
|
|
158
|
+
[lista del RESUMEN.md / git diff del alcance]
|
|
147
159
|
|
|
148
|
-
Lee también:
|
|
149
|
-
- .planning/fases/0N-CONTEXTO.md (
|
|
150
|
-
- .planning/fases/0N-PLAN.md (
|
|
151
|
-
|
|
160
|
+
Lee también (solo lo necesario, bajo demanda):
|
|
161
|
+
- .planning/fases/0N-CONTEXTO.md (requisitos)
|
|
162
|
+
- .planning/fases/0N-PLAN.md (qué se debía hacer)
|
|
163
|
+
(CLAUDE.md ya está en tu contexto heredado — no lo releas.)
|
|
152
164
|
|
|
153
165
|
Para cada archivo revisado, verifica:
|
|
154
166
|
|
|
@@ -391,7 +403,38 @@ El VERIFICACION.md reportado al usuario al final del loop incluye una sección a
|
|
|
391
403
|
- Estado persistido: `.planning/fases/0N-converge-run-[timestamp].json`
|
|
392
404
|
```
|
|
393
405
|
|
|
394
|
-
### 4.6.7 —
|
|
406
|
+
### 4.6.7 — Telemetría de loop (obligatoria en `--until-converge`)
|
|
407
|
+
|
|
408
|
+
Además del estado estructurado de 4.6.5, cada corrida del loop registra su
|
|
409
|
+
trayectoria en el formato estándar de telemetría de loops
|
|
410
|
+
(`hooks/lib/loop-telemetry.js`), que habilita: inyección de estado por el hook
|
|
411
|
+
`contexto-iteracion.js` (anti-context-rot en sesiones largas), detección de
|
|
412
|
+
plateau, y lectura por `/swl:status metricas`.
|
|
413
|
+
|
|
414
|
+
Al iniciar el loop (antes de la pasada 1):
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'verificar',direccion:'lower_is_better',config:{fase:'0N',maxIter:5}});console.log(r.dir)"
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
Tras CADA pasada, registrar una fila (métrica = hallazgos CRÍTICO+ALTO+MAYOR):
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');lt.registrarIteracion('<dir>',{iteracion:N,metrica:M,delta:D,estado:'keep',descripcion:'pasada N: X criticos, Y altos, Z mayores'})"
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Al cerrar el loop (cualquier señal de salida), escribir el handoff:
|
|
427
|
+
|
|
428
|
+
```bash
|
|
429
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');lt.escribirHandoff('<dir>',{source:'swl:verificar',status:'COMPLETO',findings:[/* hallazgos MEDIO/BAJO residuales */],config:{fase:'0N'}})"
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
`status` según la señal: A/D → `COMPLETO`, B → `INTERRUMPIDO`, C → `ACOTADO`.
|
|
433
|
+
Si `analizarTrayectoria()` reporta plateau antes de `--max-iter`, tratarlo como
|
|
434
|
+
señal C anticipada: seguir iterando sin mejora de métrica quema tokens sin
|
|
435
|
+
reducir hallazgos.
|
|
436
|
+
|
|
437
|
+
### 4.6.8 — Protocolo `--ci-aware` (Señal D)
|
|
395
438
|
|
|
396
439
|
Cuando `--ci-aware` está activo, el bucle de convergencia se extiende con un gate adicional ANTES de declarar Señal A como cierre definitivo:
|
|
397
440
|
|
|
@@ -451,6 +494,31 @@ Sin `--until-converge`, el comportamiento del comando es idéntico al actual: un
|
|
|
451
494
|
|
|
452
495
|
## Paso 5 — Verificación de criterios de aceptación
|
|
453
496
|
|
|
497
|
+
### 5.0 — Trazabilidad REQ→T→commit→test (si el CONTEXTO tiene REQ-IDs)
|
|
498
|
+
|
|
499
|
+
Si la sección de criterios del CONTEXTO usa IDs `REQ-NN:` (formato Fase 10+),
|
|
500
|
+
ejecuta el validador de cadena ANTES de la verificación criterio por criterio:
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
node scripts/verificar-trazabilidad.js --fase=N
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
- Exit 0 → cadena completa; adjunta la tabla REQ→tareas/commits/tests al VERIFICACION.md.
|
|
507
|
+
- Exit 1 → **cada REQ huérfano es hallazgo CRÍTICO** (requisito sin implementar,
|
|
508
|
+
sin commit trazable o sin test que lo verifique). Listarlos en el VERIFICACION.md
|
|
509
|
+
con la dirección del gap (sin tarea / sin commit / sin test).
|
|
510
|
+
- Exit 2 → error de invocación; reportar sin bloquear el resto de la verificación.
|
|
511
|
+
|
|
512
|
+
En CONTEXTOs legacy sin REQ-IDs el script sale 0 con nota — continuar normal.
|
|
513
|
+
|
|
514
|
+
### 5.0b — Contract testing (si la fase declaró schemas en el PLAN)
|
|
515
|
+
|
|
516
|
+
Si el PLAN declara schemas (Pydantic/Zod/JSON Schema/OpenAPI) o la fase expone
|
|
517
|
+
una API consumida por otro componente, cargar `Skill("calidad-contract-testing")`
|
|
518
|
+
y verificar que la implementación honra el contrato (schema-based con
|
|
519
|
+
schemathesis/Dredd contra la API real, o validación de forma con el modelo en
|
|
520
|
+
el test de integración). Cada violación de contrato = hallazgo CRÍTICO.
|
|
521
|
+
|
|
454
522
|
Lee los criterios de aceptación del `.planning/fases/0N-CONTEXTO.md` y verifica cada uno:
|
|
455
523
|
|
|
456
524
|
Para cada criterio:
|
|
@@ -141,7 +141,7 @@ Checklist para cualquier aplicación LLM en producción:
|
|
|
141
141
|
| Tiempo | Estático (pre-incorporación) | Dinámico (runtime) |
|
|
142
142
|
| Objetivo | Artefactos (SKILL.md, scripts) | Sesiones del agente en producción |
|
|
143
143
|
| Amenazas cubiertas | Supply chain, credenciales hardcodeadas, autonomy abuse declarada | Prompt injection directo/indirecto, context poisoning, tool abuse en runtime |
|
|
144
|
-
| Cuándo ejecuta | `/swl:crear-skill`, `/swl:plugins install`, `/swl:salud` | Durante cada request del agente en producción |
|
|
144
|
+
| Cuándo ejecuta | `/swl:crear-skill`, `/swl:plugins install`, `/swl:status salud` | Durante cada request del agente en producción |
|
|
145
145
|
| Herramientas recomendadas | Grep, SAST sobre SKILL.md | Regex + heurístico + clasificador + guardrails |
|
|
146
146
|
|
|
147
147
|
Ambos skills son necesarios. Ninguno reemplaza al otro.
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: angular-moderno
|
|
3
3
|
description: Angular v17+/v20+. Signals, standalone components, OnPush, host bindings, nueva sintaxis de control flow (@if/@for/@switch), defer blocks y patrones modernos.
|
|
4
|
-
version: "1.0.
|
|
4
|
+
version: "1.0.1"
|
|
5
|
+
evolved: true
|
|
6
|
+
evolved-from: "1.0.0"
|
|
7
|
+
evolved-at: "2026-06-04"
|
|
8
|
+
evolved-by: "evolucionar"
|
|
9
|
+
evolved-note: "PE-009 patrón Angular 19+ ErrorHandler custom con provideBrowserGlobalErrorListeners (NO listeners manuales window.onerror). Origen: OIC v1.5 Slice 6 2026-06-04."
|
|
5
10
|
herramientasPermitidas: [Read]
|
|
6
11
|
exclusiones:
|
|
7
12
|
- "No cargar para patrones Angular avanzados (zoneless, SSR, Resource API, interceptores funcionales) — para eso cargar `angular-avanzado`."
|
|
@@ -184,3 +189,41 @@ Para ejemplos completos de host bindings con clases dinámicas, services store c
|
|
|
184
189
|
**`input.required<T>()` accedido fuera del contexto de renderizado (en `constructor`) lanza error de runtime**: `this.factura()` dentro del `constructor` de un componente que usa `input.required<Factura>()` lanza `NG0950: Input is required but no value is available yet`. Causa: los inputs signal no tienen valor hasta que Angular completa la inicialización del componente. Fix: acceder a inputs en `ngOnInit`, en `computed()`, o en métodos del template — nunca en el constructor.
|
|
185
190
|
|
|
186
191
|
**`takeUntilDestroyed()` usado fuera del contexto de inyección lanza error**: `takeUntilDestroyed()` sin argumentos requiere un `DestroyRef` del contexto de inyección activo — si se llama dentro de un callback asíncrono (como `.then()` o `setTimeout`), el injection context ya no está activo. Causa: `inject()` solo funciona en contextos de inyección síncronos. Fix: capturar `DestroyRef` en el constructor con `private destroyRef = inject(DestroyRef)` y pasarlo explícitamente: `takeUntilDestroyed(this.destroyRef)`.
|
|
192
|
+
|
|
193
|
+
**Para captura global de errores runtime (window.onerror + unhandledrejection), usar `ErrorHandler` custom con `provideBrowserGlobalErrorListeners` — NO `window.addEventListener('error', ...)` manual** (Angular 19+; patrón portable OIC v1.5 2026-06-04): Angular 19+ provee `provideBrowserGlobalErrorListeners()` que ya registra los listeners nativos. Para reportar errores no controlados al backend (Sentry-style, audit handler, logs centralizados), proveer un `ErrorHandler` custom — listeners manuales duplican el registro y rompen la integración con el ciclo de DI/zone de Angular.
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
// app.config.ts
|
|
197
|
+
import { ApplicationConfig, ErrorHandler, provideBrowserGlobalErrorListeners } from '@angular/core';
|
|
198
|
+
|
|
199
|
+
export const appConfig: ApplicationConfig = {
|
|
200
|
+
providers: [
|
|
201
|
+
provideBrowserGlobalErrorListeners(), // 1. Listeners nativos
|
|
202
|
+
{ provide: ErrorHandler, useClass: GlobalErrorHandler }, // 2. Tu handler custom
|
|
203
|
+
// ...
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
// global-error-handler.service.ts
|
|
208
|
+
@Injectable({ providedIn: 'root' })
|
|
209
|
+
export class GlobalErrorHandler implements ErrorHandler {
|
|
210
|
+
private readonly reporter = inject(ErrorReporterService);
|
|
211
|
+
|
|
212
|
+
handleError(error: unknown): void {
|
|
213
|
+
try {
|
|
214
|
+
this.reporter.reportarErrorGlobal(error, 'global-error-handler');
|
|
215
|
+
} catch {
|
|
216
|
+
// Silenciar fallos del reporter — un handler global NUNCA debe propagar.
|
|
217
|
+
}
|
|
218
|
+
console.error(error); // Preservar visibilidad en DevTools.
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Causa**: con `provideBrowserGlobalErrorListeners` activo, Angular ya escucha `window.onerror`/`unhandledrejection` y los enruta a `ErrorHandler.handleError()`. Registrar listeners manuales propios duplica el callback (cada error se reporta dos veces) y se pierde la integración con el lifecycle Angular (zone tracking, DI context). **Fix**: usar EXCLUSIVAMENTE el `ErrorHandler` custom + `provideBrowserGlobalErrorListeners`.
|
|
224
|
+
|
|
225
|
+
**Reglas del handler**:
|
|
226
|
+
- `try/except` agresivo: el reporter NUNCA debe propagar al `handleError` (riesgo de recursión si el propio POST de reporte falla).
|
|
227
|
+
- Delegar a `console.error(error)` para preservar DevTools (no silenciar para devs).
|
|
228
|
+
- El reporter debe tener throttle propio (ej: 10 eventos/5s) y silenciar respuestas esperadas (401/403/404/429) — los detalles del reporter viven en su propio service, no en el `ErrorHandler`.
|
|
229
|
+
- Anti-bucle: el `ErrorReporterInterceptor` (si existe) debe excluir llamadas al propio endpoint POST de reportes.
|