@saulwade/swl-ses 1.9.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.
Files changed (108) hide show
  1. package/CLAUDE.md +8 -8
  2. package/README.md +12 -12
  3. package/agentes/accesibilidad-wcag-swl.md +3 -3
  4. package/agentes/auto-evolucion-swl.md +908 -908
  5. package/agentes/disenador-ui-swl.md +6 -5
  6. package/agentes/frontend-angular-swl.md +2 -2
  7. package/agentes/frontend-css-swl.md +2 -2
  8. package/agentes/frontend-react-swl.md +4 -4
  9. package/agentes/frontend-swl.md +6 -6
  10. package/agentes/investigador-ux-swl.md +5 -5
  11. package/agentes/orquestador-swl.md +7 -7
  12. package/agentes/perfilador-usuario-swl.md +308 -308
  13. package/agentes/producto-prd-swl.md +1 -1
  14. package/agentes/red-team-swl.md +218 -218
  15. package/agentes/tdd-qa-swl.md +17 -1
  16. package/comandos/swl/actualizar.md +1 -1
  17. package/comandos/swl/aprender.md +2 -2
  18. package/comandos/swl/aprobar-plan.md +152 -0
  19. package/comandos/swl/ayuda.md +3 -3
  20. package/comandos/swl/discutir-fase.md +20 -2
  21. package/comandos/swl/ejecutar-fase.md +53 -6
  22. package/comandos/swl/evolucionar.md +1 -1
  23. package/comandos/swl/inbox.md +1 -1
  24. package/comandos/swl/instalar.md +1 -1
  25. package/comandos/swl/nemesis.md +1 -1
  26. package/comandos/swl/planear-fase.md +17 -1
  27. package/comandos/swl/plugins.md +1 -1
  28. package/comandos/swl/release.md +1 -1
  29. package/comandos/swl/status.md +279 -0
  30. package/comandos/swl/verificar.md +26 -1
  31. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  32. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  33. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  34. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  35. package/habilidades/changelog-generator/SKILL.md +9 -2
  36. package/habilidades/changelog-generator/scripts/parse-commits.js +11 -1
  37. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  38. package/habilidades/drift-detection/SKILL.md +179 -179
  39. package/habilidades/ejecutar-fase/SKILL.md +64 -14
  40. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  41. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  42. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  43. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  44. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  45. package/habilidades/harness-claude-code/SKILL.md +10 -7
  46. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  47. package/habilidades/instalar-sistema/SKILL.md +3 -3
  48. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  49. package/habilidades/perfil-usuario/SKILL.md +200 -200
  50. package/habilidades/planear-fase/SKILL.md +25 -4
  51. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  52. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  53. package/habilidades/proceso-debate-adversarial/SKILL.md +2 -2
  54. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  55. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  56. package/habilidades/swl-claudemd/SKILL.md +50 -210
  57. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  58. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  59. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  60. package/habilidades/swl-dashboard/SKILL.md +9 -9
  61. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  62. package/habilidades/tdd-workflow/SKILL.md +45 -5
  63. package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
  64. package/hooks/calidad-pre-commit.js +340 -3
  65. package/hooks/ciclo-evolucion-subagente.js +26 -0
  66. package/hooks/ciclo-evolucion.js +26 -0
  67. package/hooks/extraccion-aprendizajes.js +13 -0
  68. package/hooks/lib/ciclo-evolucion.js +47 -0
  69. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  70. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  71. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  72. package/hooks/lib/evolution-tracker.js +24 -3
  73. package/hooks/spec-gate.js +211 -0
  74. package/hooks/tdd-gate.js +241 -0
  75. package/hooks/validar-intent-spec.js +30 -10
  76. package/llms.txt +6 -6
  77. package/manifiestos/hooks-config.json +26 -17
  78. package/manifiestos/modulos.json +17 -14
  79. package/manifiestos/skills-lock.json +63 -56
  80. package/package.json +2 -2
  81. package/plugin.json +6 -10
  82. package/reglas/accesibilidad.md +10 -0
  83. package/reglas/api-diseno.md +9 -0
  84. package/reglas/auditorias-documentales-estructurales.md +7 -0
  85. package/reglas/cloud-infra.md +8 -0
  86. package/reglas/fragmentos-compartidos.md +5 -0
  87. package/reglas/gobernanza.md +4 -4
  88. package/reglas/hooks.md +6 -0
  89. package/reglas/intent-engineering.md +4 -0
  90. package/reglas/markitdown.md +8 -0
  91. package/reglas/memoria-consolidada.md +1 -1
  92. package/reglas/patrones.md +6 -0
  93. package/reglas/registro-componentes-nuevos.md +10 -1
  94. package/reglas/seguridad-agentes.md +1 -1
  95. package/reglas/skills-estandar.md +6 -0
  96. package/reglas/testing.md +7 -0
  97. package/reglas/tests-cleanup.md +4 -0
  98. package/reglas/usar-sistema-swl.md +1 -1
  99. package/scripts/lib/gitignore-manifest.js +29 -1
  100. package/scripts/lib/plan-lock.js +275 -0
  101. package/scripts/migrar-fase-dominio.js +0 -1
  102. package/scripts/verificar-trazabilidad.js +292 -0
  103. package/agentes/ux-disenador-swl.md +0 -503
  104. package/comandos/swl/dashboard.md +0 -146
  105. package/comandos/swl/evolucion-estado.md +0 -191
  106. package/comandos/swl/metricas.md +0 -376
  107. package/comandos/swl/salud.md +0 -481
  108. package/reglas/verificar-citas-temporales.md +0 -139
@@ -1,481 +0,0 @@
1
- ---
2
- name: swl:salud
3
- description: Diagnóstico completo de salud del sistema SWL. Verifica integridad de agentes, skills, comandos, reglas y hooks. Genera un reporte con score por componente y detecta agentes sin versión, skills huérfanos, comandos rotos y reglas contradictorias.
4
- allowed_tools: ["Read", "Write", "Bash", "Glob", "Grep"]
5
- ---
6
-
7
- # /swl:salud — Diagnóstico de salud del sistema SWL
8
-
9
- Inspector de salud del sistema SWL. Verifica integridad de todos los componentes
10
- usando **verificaciones deterministas** (conteos, existencia de campos, sintaxis).
11
- Genera SALUD.md con score objetivo y reproducible.
12
-
13
- **Carga**: `Skill("validacion-ci-sistema")` — contiene las reglas de validación por componente (agentes, skills, hooks, comandos, reglas), tabla de exit codes para hooks y checklist de integridad. Delega toda lógica de verificación al skill.
14
-
15
- Este comando es de **solo lectura**. No modifica archivos — solo genera SALUD.md. Para corregir problemas, usar `swl:evolucionar`.
16
-
17
- ## Cuándo usar
18
-
19
- - Antes de iniciar proyecto nuevo con SWL
20
- - Después de agregar o modificar agentes/skills manualmente
21
- - Cuando un agente produce outputs inesperados
22
- - Después de merge o pull de cambios al repositorio
23
- - Periódicamente como mantenimiento (mensual)
24
-
25
- ## Paso 0 — Inventario con Bash (determinista)
26
-
27
- ```bash
28
- echo "=== INVENTARIO ===" && \
29
- echo "Agentes: $(ls agentes/*.md 2>/dev/null | wc -l)" && \
30
- echo "Skills: $(ls -d habilidades/*/ 2>/dev/null | wc -l)" && \
31
- echo "Comandos: $(ls comandos/swl/*.md 2>/dev/null | wc -l)" && \
32
- echo "Reglas: $(ls reglas/*.md 2>/dev/null | wc -l)" && \
33
- echo "Hooks: $(ls hooks/*.js 2>/dev/null | wc -l)"
34
- ```
35
-
36
- ## Paso 0.5 — Detección automática de tier del proyecto
37
-
38
- Antes de ejecutar los pasos de diagnóstico, /swl:salud detecta el tier del proyecto contando archivos relevantes:
39
-
40
- ```bash
41
- find . -type f \
42
- -not -path '*/node_modules/*' \
43
- -not -path '*/.git/*' \
44
- -not -path '*/dist/*' \
45
- -not -path '*/build/*' \
46
- -not -path '*/.next/*' \
47
- -not -path '*/coverage/*' \
48
- -not -path '*/__pycache__/*' \
49
- -not -path '*/.cache/*' \
50
- -not -path '*/.planning/sessions/*' \
51
- | wc -l
52
- ```
53
-
54
- | Tier | Rango | Características esperadas |
55
- |---|---|---|
56
- | **Simple** | <500 archivos | 1 contributor, CI mínimo o ninguno. CLAUDE.md opcional. Skills/agentes opcionales. |
57
- | **Standard** | 500–5,000 archivos | Equipo pequeño con CI. CLAUDE.md + 1-2 reglas. 2-4 skills. Hooks básicos. |
58
- | **Complex** | >5,000 archivos | Múltiples contributors, CI activo. Setup completo de 6 capas: agentes + skills + reglas + hooks + instintos + memoria. |
59
-
60
- El tier detectado se reporta al inicio del SALUD.md generado.
61
-
62
- **Default ante ambigüedad**: si el conteo cae cerca de 500 (490-510) o 5000 (4900-5100), aplicar el tier superior. Es preferible diagnosticar de más que de menos.
63
-
64
- ## Paso 1 — Diagnóstico de agentes (determinista)
65
-
66
- Ejecutar script Bash que verifica cada agente mecánicamente:
67
-
68
- ```bash
69
- errors=0; warns=0; ok=0
70
- for f in agentes/*.md; do
71
- name=$(basename "$f" .md)
72
- has_name=$(head -30 "$f" | grep -c "^name:")
73
- has_desc=$(head -30 "$f" | grep -c "^description:")
74
- has_version=$(head -30 "$f" | grep -c "^version:")
75
- has_riesgo=$(head -30 "$f" | grep -c "^nivelRiesgo:")
76
- placeholders=$(grep -cE '\[TODO\]|\[COMPLETAR\]|\[TBD\]' "$f" || true)
77
-
78
- if [ "$has_name" -eq 0 ] || [ "$has_desc" -eq 0 ]; then
79
- echo "ERROR: $name — falta name o description"
80
- errors=$((errors+1))
81
- elif [ "$has_version" -eq 0 ] || [ "$has_riesgo" -eq 0 ]; then
82
- echo "ADVERTENCIA: $name — falta version o nivelRiesgo"
83
- warns=$((warns+1))
84
- elif [ "$placeholders" -gt 0 ]; then
85
- echo "ADVERTENCIA: $name — placeholders sin reemplazar"
86
- warns=$((warns+1))
87
- else
88
- ok=$((ok+1))
89
- fi
90
- done
91
- echo "Agentes: $ok OK, $warns advertencias, $errors errores"
92
- ```
93
-
94
- Score de agentes = `(ok / total) * 100`
95
-
96
- **Restricción de tier**: el análisis cruzado de agentes (cross-check entre `exclusiones` declaradas y rutas reales en `manifiestos/modulos.json`) se ejecuta solo en proyectos **Standard** o **Complex**. En tier Simple, reportar el conteo básico y omitir la validación cruzada.
97
-
98
- ## Paso 2 — Diagnóstico de skills (determinista)
99
-
100
- ```bash
101
- errors=0; warns=0; ok=0
102
- for d in habilidades/*/; do
103
- name=$(basename "$d")
104
- skill="$d/SKILL.md"
105
- if [ ! -f "$skill" ]; then
106
- echo "ERROR: $name — sin SKILL.md"
107
- errors=$((errors+1)); continue
108
- fi
109
- lines=$(wc -l < "$skill")
110
- has_name=$(head -10 "$skill" | grep -c "^name:")
111
- has_desc=$(head -10 "$skill" | grep -c "^description:")
112
- content_chars=$(sed -n '/^---$/,/^---$/d; p' "$skill" | wc -c)
113
- abs_paths=$(grep -cE 'C:\\|/home/|/Users/' "$skill" || true)
114
-
115
- if [ "$has_name" -eq 0 ] || [ "$has_desc" -eq 0 ]; then
116
- echo "ERROR: $name — frontmatter sin name o description"
117
- errors=$((errors+1))
118
- elif [ "$lines" -gt 300 ]; then
119
- echo "ADVERTENCIA: $name — $lines lineas (max 300)"
120
- warns=$((warns+1))
121
- elif [ "$content_chars" -lt 500 ]; then
122
- echo "ADVERTENCIA: $name — contenido muy corto ($content_chars chars)"
123
- warns=$((warns+1))
124
- elif [ "$abs_paths" -gt 0 ]; then
125
- echo "ADVERTENCIA: $name — paths absolutos detectados"
126
- warns=$((warns+1))
127
- else
128
- ok=$((ok+1))
129
- fi
130
- done
131
- echo "Skills: $ok OK, $warns advertencias, $errors errores"
132
- ```
133
-
134
- Detectar skills huérfanos (no referenciados):
135
-
136
- ```bash
137
- grep -r "Skill(" agentes/ comandos/ 2>/dev/null | grep -o '"[^"]*"' | sort | uniq
138
- ```
139
-
140
- Score de skills = `((total - errors*10 - warns*2) / total) * 100`, mínimo 0
141
-
142
- **Restricción de tier**: la detección de skills huérfanos (no referenciados en ningún agente ni comando) se ejecuta solo en proyectos **Standard** o **Complex**. En tier Simple, donde hay menos de 10 skills esperados, la verificación de huérfanos genera falsos positivos y se omite.
143
-
144
- ## Paso 3 — Diagnóstico de comandos (determinista)
145
-
146
- ```bash
147
- errors=0; warns=0; ok=0
148
- for f in comandos/swl/*.md; do
149
- name=$(basename "$f" .md)
150
- lines=$(wc -l < "$f")
151
- has_name=$(head -10 "$f" | grep -c "^name:")
152
- has_desc=$(head -10 "$f" | grep -c "^description:")
153
- desc_len=$(head -5 "$f" | grep "^description:" | wc -c)
154
-
155
- if [ "$has_name" -eq 0 ] || [ "$has_desc" -eq 0 ]; then
156
- echo "ERROR: $name — frontmatter sin name o description"
157
- errors=$((errors+1))
158
- elif [ "$desc_len" -lt 30 ]; then
159
- echo "ADVERTENCIA: $name — description muy breve"
160
- warns=$((warns+1))
161
- elif [ "$lines" -gt 300 ]; then
162
- echo "ADVERTENCIA: $name — $lines lineas (considerar delegar a skill)"
163
- warns=$((warns+1))
164
- else
165
- ok=$((ok+1))
166
- fi
167
- done
168
- echo "Comandos: $ok OK, $warns advertencias, $errors errores"
169
- ```
170
-
171
- ## Paso 4 — Diagnóstico de reglas (determinista)
172
-
173
- ```bash
174
- errors=0; warns=0; ok=0
175
- for f in reglas/*.md; do
176
- name=$(basename "$f" .md)
177
- lines=$(wc -l < "$f")
178
- has_h1=$(grep -c "^# " "$f" || true)
179
- has_checklist=$(grep -c "\- \[ \]" "$f" || true)
180
-
181
- if [ "$lines" -lt 20 ]; then
182
- echo "ERROR: $name — regla muy corta ($lines lineas)"
183
- errors=$((errors+1))
184
- elif [ "$has_h1" -eq 0 ]; then
185
- echo "ADVERTENCIA: $name — sin titulo H1"
186
- warns=$((warns+1))
187
- elif [ "$has_checklist" -eq 0 ]; then
188
- echo "ADVERTENCIA: $name — sin checklist"
189
- warns=$((warns+1))
190
- else
191
- ok=$((ok+1))
192
- fi
193
- done
194
- echo "Reglas: $ok OK, $warns advertencias, $errors errores"
195
- ```
196
-
197
- ## Paso 5 — Diagnóstico de hooks (determinista)
198
-
199
- ```bash
200
- errors=0; warns=0; ok=0
201
- for f in hooks/*.js; do
202
- name=$(basename "$f")
203
- if node --check "$f" 2>/dev/null; then
204
- if grep -q "$name" .claude/settings.json 2>/dev/null; then
205
- ok=$((ok+1))
206
- else
207
- echo "ADVERTENCIA: $name — no registrado en settings.json"
208
- warns=$((warns+1))
209
- fi
210
- else
211
- echo "ERROR: $name — error de sintaxis Node.js"
212
- errors=$((errors+1))
213
- fi
214
- done
215
- echo "Hooks: $ok OK, $warns advertencias, $errors errores"
216
- ```
217
-
218
- ## Paso 5b — Auditoría opcional de skills (opt-in)
219
-
220
- Si la variable de entorno `SWL_AUDIT_SKILLS=1` está presente, ejecutar:
221
-
222
- ```bash
223
- bash scripts/audit-skills.sh
224
- ```
225
-
226
- Este paso es **no bloqueante**: si el comando falla por cualquier causa (red,
227
- dependencia faltante, paquete no publicado), el diagnóstico continúa normalmente.
228
-
229
- **Qué detecta**:
230
- - Prompt injection en contenido de SKILL.md (instrucciones que intentan manipular el modelo).
231
- - Secretos hardcodeados (API keys, tokens, contraseñas en ejemplos).
232
- - URLs sospechosas embebidas en los skills.
233
- - Estructura inválida de SKILL.md (frontmatter incompleto, ausencia de secciones requeridas).
234
-
235
- **Requisito**: `pip install uv` (o `pipx install uv`) antes de activar.
236
-
237
- **Activación manual**:
238
- ```bash
239
- SWL_AUDIT_SKILLS=1 bash scripts/audit-skills.sh
240
- ```
241
-
242
- Si `SWL_AUDIT_SKILLS` no está definida, el script imprime instrucciones y sale
243
- con código 0 — no afecta el score ni el diagnóstico general.
244
-
245
- ## Paso 6 — Score global ponderado
246
-
247
- ```
248
- Score = agentes x 0.30 + skills x 0.25 + comandos x 0.20 + reglas x 0.15 + hooks x 0.10
249
-
250
- 90-100: Excelente
251
- 75-89: Saludable con mejoras menores
252
- 60-74: Funcional con problemas
253
- <60: Estado crítico
254
- ```
255
-
256
- ## Paso 5c — Reporte de cobertura de frameworks de seguridad (opt-in)
257
-
258
- Si la variable de entorno `SWL_AUDIT_FRAMEWORKS=1` está presente, ejecutar el
259
- auditor de cobertura:
260
-
261
- ```bash
262
- npx -y @saulwade/swl-ses@latest audit-coverage-frameworks --resumen
263
- ```
264
-
265
- Propósito: reportar cuántos skills declaran mapeos a los 5 frameworks de
266
- seguridad (NIST CSF 2.0, NIST AI RMF 1.0, MITRE ATLAS v5.4, ATT&CK v18,
267
- D3FEND v1.3) y qué controles están cubiertos. Útil para:
268
-
269
- - Verificar que los skills de dominio seguridad declaran mapeos antes de un
270
- audit de compliance
271
- - Detectar gaps en la cobertura (ej: ningún skill cubre `PR.DS-11` — data
272
- integrity — si eso importa para el proyecto)
273
- - Producir evidencia para auditores (SOC 2, ISO 27001) sobre controles
274
- implementados
275
-
276
- El reporte NO marca skills sin mapeos como error — solo skills de dominio
277
- seguridad necesitan declararlos. Ver `reglas/skills-estandar.md` sección
278
- "Mapeo a frameworks de seguridad (REC-C01)" para criterios de cuándo declarar
279
- cada framework.
280
-
281
- **Filtrado por framework**:
282
-
283
- ```bash
284
- SWL_AUDIT_FRAMEWORKS=1 npx -y @saulwade/swl-ses@latest audit-coverage-frameworks --framework=nist_ai_rmf --resumen
285
- ```
286
-
287
- **Persistir snapshot**:
288
-
289
- ```bash
290
- npx -y @saulwade/swl-ses@latest audit-coverage-frameworks --save
291
- ```
292
-
293
- Persiste en `.planning/evolution/cobertura-frameworks.json` para comparación
294
- histórica tras incorporar nuevos skills de seguridad.
295
-
296
- Si `SWL_AUDIT_FRAMEWORKS` no está definida, este paso se omite sin mensaje
297
- — los reportes son opt-in por diseño (CLAUDE.md: "Variables de entorno
298
- opt-in para integraciones enterprise").
299
-
300
- ## Paso 5d — Auditoría SAP-Agents (opt-in)
301
-
302
- Si la variable de entorno `SWL_AUDIT_AGENTES=1` está presente, ejecutar el
303
- auditor de agentes:
304
-
305
- ```bash
306
- npx -y @saulwade/swl-ses@latest audit-agents-gaps --resumen
307
- ```
308
-
309
- Propósito: reportar cuántos agentes carecen de Exclusion Clause (campo
310
- `exclusiones` o sección `## Cuándo NO invocarme`) y Gotchas explícitos.
311
- Previene agent hijacking por activación tangencial de agentes por similitud
312
- superficial en `description`.
313
-
314
- El reporte incluye conteo de excepciones documentadas por ADR (si las hay)
315
- para separar gaps reales de excepciones por diseño.
316
-
317
- Si `SWL_AUDIT_AGENTES` no está definida, este paso se omite — los reportes
318
- son opt-in por diseño (CLAUDE.md: "Variables de entorno opt-in para
319
- integraciones enterprise").
320
-
321
- ## Paso 5f — Calidad de CLAUDE.md (ADR-0016)
322
-
323
- Auditoría determinista del archivo `CLAUDE.md` raíz del proyecto según best
324
- practices Anthropic ("The CLAUDE.md file"): líneas totales, bullets
325
- monolíticos, secciones canónicas (Stack/Comandos/Code style/Conventions),
326
- uso de `@references`, placeholders sin reemplazar.
327
-
328
- ```bash
329
- npx -y @saulwade/swl-ses@latest audit-claudemd --json
330
- ```
331
-
332
- Veredictos posibles:
333
-
334
- | Veredicto | Significado | Score impact |
335
- |---|---|---|
336
- | `OK` | Cumple best practices, sin hallazgos | +1 |
337
- | `WARN` | Oportunidades de mejora (líneas excesivas, bullets gigantes, secciones ausentes, sin @references) | -0.5 |
338
- | `ERROR` | No existe, placeholders sin reemplazar, secciones críticas ausentes | -1 |
339
-
340
- Si veredicto != OK, el reporte sugiere ejecutar `/swl:claudemd refactor`
341
- para identificar candidatos a extracción a archivos `@`-referenciados.
342
-
343
- Variables de entorno: `SWL_CLAUDEMD_MAX_LINES` (default 200) y
344
- `SWL_CLAUDEMD_MAX_BULLET_CHARS` (default 1000) ajustan los umbrales.
345
- Documentación completa en `@docs/variables-entorno.md`.
346
-
347
- Este paso siempre se ejecuta (no es opt-in) — la calidad de CLAUDE.md
348
- es métrica continua del sistema.
349
-
350
- ## Paso 5g — Smoke test de servidores MCP (opt-in)
351
-
352
- Si el proyecto declara servidores MCP en `.claude/settings.json` o en
353
- `~/.cursor/mcp.json` o `~/.claude/settings.json` (global), ejecutar un smoke
354
- test rápido para detectar configuraciones rotas antes de que fallen en uso
355
- interactivo:
356
-
357
- ```bash
358
- python scripts/mcp-orchestrator.py status --json 2>/dev/null
359
- ```
360
-
361
- El orchestrator levanta un proceso MCP fresh por cada server configurado y
362
- reporta:
363
-
364
- - `status: "OK"` — handshake completo + lista de tools devuelta correctamente
365
- - `status: "ERROR"` — fallo de handshake, autenticación o spawn
366
-
367
- Casos detectables que `/swl:salud` debe reportar:
368
-
369
- | Síntoma | Causa probable | Acción sugerida |
370
- |---|---|---|
371
- | `40101 Authorization required` | apiKey desincronizada entre cliente y plugin | Verificar `HKCU\Environment` (Windows) o variable de entorno del shell coincide con apiKey del plugin |
372
- | `Server failed to start` | Binario no encontrado en `command` | Verificar path absoluto del binario |
373
- | `Connection refused` | Plugin/servicio destino no corriendo | Iniciar plugin (ej. Obsidian con Local REST API activo) |
374
- | `env=None passed` | Config tiene `"env": {}` literal — rompe herencia | Omitir clave `env` por completo en JSON (no dejar vacía) |
375
-
376
- Si no hay servers configurados, este paso se omite silenciosamente.
377
-
378
- Este smoke test detecta drift de apiKeys ANTES de que el usuario interactivo
379
- encuentre 40101 en una invocación crítica. Recomendado ejecutar como parte del
380
- flujo `/swl:salud` periódico mensual.
381
-
382
- ## Paso 5e — Verificación de drift de skills (skills-lock)
383
-
384
- Si existe `manifiestos/skills-lock.json`, comparar el hash actual de cada
385
- `habilidades/*/SKILL.md` contra el lock. Detecta ediciones silenciosas de
386
- skills entre release y release.
387
-
388
- ```bash
389
- npx -y @saulwade/swl-ses@latest generate-skills-lock --check
390
- ```
391
-
392
- Estados posibles:
393
-
394
- | Salida | Significado | Acción |
395
- |--------|-------------|--------|
396
- | `✓ skills-lock OK: N skills sin drift` | Todos los hashes coinciden | Continuar |
397
- | `✗ skills-lock DRIFT detectado` | Skills modificados, nuevos o faltantes | Listar diferencias y proponer regenerar |
398
-
399
- Si NO existe el lock (proyecto fresco o pre-1.1.0), este paso se omite y
400
- emite advertencia sugerente: `npx -y @saulwade/swl-ses@latest generate-skills-lock`.
401
-
402
- El lock se regenera automáticamente como parte de `/swl:release`. Drift
403
- fuera de release indica ediciones manuales no committed.
404
-
405
- ## Paso 6b — Formato de salida enriquecido (HealthRow)
406
-
407
- El módulo `scripts/lib/health-row.js` genera filas de salud con formato visual enriquecido
408
- para la salida de terminal. Cada fila sigue el patrón:
409
-
410
- ```
411
- Label valor/max |████████████████████| indicador
412
- ```
413
-
414
- Ejemplo visual (modo con color ANSI):
415
-
416
- ```
417
- Agentes 59/59 |████████████████████| ✓ ok
418
- Skills 52/55 |███████████████████░| ✓ ok
419
- Comandos 37/38 |███████████████████░| ✓ ok
420
- Reglas 18/18 |████████████████████| ✓ ok
421
- Hooks 22/25 |█████████████████░░░| ⚠ warn
422
- Score Global 88/100 |█████████████████░░░| ✓ ok
423
- ```
424
-
425
- ### Umbrales automáticos
426
-
427
- | Rango de porcentaje | Estado | Color ANSI |
428
- |---------------------|--------|-------------|
429
- | >= 80% | good | Verde `\x1b[32m` |
430
- | >= 50% y < 80% | warn | Amarillo `\x1b[33m` |
431
- | < 50% | bad | Rojo `\x1b[31m` |
432
-
433
- Respetar `NO_COLOR` (https://no-color.org) y la variable `SWL_ASCII_SIMPLE=1`
434
- para entornos sin soporte Unicode.
435
-
436
- ### Uso para generar el bloque de salud
437
-
438
- ```javascript
439
- const { formatearBloqueHealth } = require('./scripts/lib/health-row');
440
-
441
- const filas = [
442
- { label: 'Agentes', valor: 59, maximo: 59 },
443
- { label: 'Skills', valor: 52, maximo: 55 },
444
- { label: 'Comandos', valor: 37, maximo: 38 },
445
- { label: 'Reglas', valor: 18, maximo: 18 },
446
- { label: 'Hooks', valor: 22, maximo: 25 },
447
- { label: 'Score Global', valor: 88, maximo: 100 },
448
- ];
449
-
450
- console.log(formatearBloqueHealth(filas));
451
- ```
452
-
453
- Para override de estado (forzar bad aunque el valor sea alto):
454
-
455
- ```javascript
456
- const { formatearHealthRow } = require('./scripts/lib/health-row');
457
- const fila = formatearHealthRow({ label: 'Seguridad', valor: 100, maximo: 100, estado: 'bad' });
458
- ```
459
-
460
- La integración real del formato en la ejecución del comando se implementará en el
461
- código de salida de `/swl:salud`. Este paso solo define la API disponible y la muestra visual.
462
-
463
- ## Paso 7 — Generar SALUD.md
464
-
465
- Escribe el reporte con tabla resumen, errores, advertencias y recomendaciones. Usa los datos exactos de los scripts. Si el script dice 73%, reportar 73%.
466
-
467
- ## Paso 8 — Resumen en terminal
468
-
469
- Presenta resumen con los problemas más críticos. Si hay errores, listarlos todos. Si solo advertencias, listar las top 5.
470
-
471
- ## Reglas de comportamiento
472
-
473
- - SOLO LECTURA. NUNCA modifica archivos excepto SALUD.md.
474
- - Las verificaciones de Pasos 1-5 son scripts Bash deterministas. NO usar juicio subjetivo.
475
- - Los scripts miden: existencia de campos, conteo de líneas, sintaxis. NO miden calidad de redacción.
476
- - Si un check requiere juicio (contradicciones entre reglas), documentar como "requiere revisión manual".
477
- - Los scores son aritmética pura. No ajustar el score "porque parece un sistema sano".
478
- - Si no hay git, omitir verificaciones dependientes y notar la omisión.
479
- - Si detectas un patrón sistémico (mismo error en múltiples componentes), mencionarlo en recomendaciones.
480
-
481
- <!-- Patrón de 3 tiers adaptado de Waza/skills/health bajo MIT License (tw93/Waza) -->
@@ -1,139 +0,0 @@
1
- # Regla: Comentarios temporales en código NO son verificación
2
-
3
- Esta regla es OBLIGATORIA para todo trabajo de Claude en swl-ses. Extiende la
4
- regla global `~/.claude/rules/verificar-citas-normativas.md § Familia 2` con
5
- el sub-caso específico de **comentarios temporales como `// Alineado con
6
- commits X+Y` o `// Refactorizado a vN.M.0`**.
7
-
8
- ---
9
-
10
- ## Principio
11
-
12
- > Un comentario en código que afirma alineación con otro commit, versión o
13
- > contrato (`// Alineado con commits X+Y`, `// Refactorizado a vN.M.0`,
14
- > `# Sincronizado con backend`, `<!-- Coherente con schema X -->`) **NO es
15
- > verificación** — es afirmación temporal sin prueba. Antes de actuar
16
- > sobre el comentario como si fuera evidencia, verificar contra la fuente
17
- > real con `grep` / `Read` / `git log`.
18
-
19
- El comentario puede haberse desactualizado silenciosamente si el commit
20
- referenciado se revirtió, nunca se aplicó, o si el refactor citado cambió
21
- después de escribir el comentario.
22
-
23
- ---
24
-
25
- ## Cuándo aplicar
26
-
27
- OBLIGATORIO verificar antes de aceptar como evidencia accionable:
28
-
29
- - Comentarios `// Alineado con commits <SHA>+<SHA>` en código
30
- - Comentarios `// Refactorizado a v<N.M.0>` o `// Migrado a <framework>`
31
- - Comentarios `# Sincronizado con backend` o `# Espejo del schema X`
32
- - Comentarios `<!-- Tipos coherentes con API vN -->`
33
- - Cualquier afirmación de cross-stack alignment en comentario inline
34
-
35
- NO aplica cuando:
36
-
37
- - El comentario describe la INTENCIÓN del código (no afirma alineación)
38
- - El comentario es una nota pendiente (`T‍ODO` / `FIXME`) con ticket asociado
39
- - El comentario es una explicación del POR QUÉ (no del QUÉ histórico)
40
-
41
- ---
42
-
43
- ## Cómo verificar
44
-
45
- Cuando un comentario afirma "alineado con X":
46
-
47
- 1. Identificar **qué se afirma alineado**: archivo, commit, versión, schema.
48
- 2. Localizar la fuente real:
49
- ```bash
50
- # Si afirma alineación con commit:
51
- git show <SHA> -- <archivo-citado>
52
-
53
- # Si afirma alineación con schema/types:
54
- grep -rn "<campo-clave>" backend/ frontend/ schemas/
55
- ```
56
- 3. Comparar campo por campo. Si hay drift, NO confiar en el comentario.
57
- 4. Actualizar el comentario o eliminarlo (un comentario stale es peor que
58
- ningún comentario).
59
-
60
- ---
61
-
62
- ## Caso de origen — sesión SIGAF 2026-05-22
63
-
64
- `frontend/.../contratos/models/contrato.models.ts` línea 2 decía:
65
-
66
- ```typescript
67
- // Alineados con el backend refactorizado (commits 284df74 + 5869ac9)
68
- ```
69
-
70
- Pero el backend nunca aplicó ese refactor. El frontend enviaba 5 campos
71
- (`monto_total`, `fecha_inicio`, `fecha_termino`, `porcentaje_iva`,
72
- `tipo_contrato_id`) que Pydantic con `extra=ignore` descartaba
73
- silenciosamente. Los contratos se creaban sin monto ni vigencia durante
74
- semanas, hasta que se detectó por triangulación cross-stack (modelo
75
- SQLAlchemy + schema Pydantic + types TypeScript).
76
-
77
- El comentario funcionó como **falso anclaje de confianza**: un reviewer
78
- posterior lo leyó, asumió validez, y no verificó. La causa raíz era el
79
- comentario stale, no el código.
80
-
81
- ---
82
-
83
- ## Anti-patrones específicos
84
-
85
- - **Confiar en el comentario en code review**: el reviewer ve
86
- `// Alineado con commits X+Y` y asume válido sin hacer `git show`.
87
- - **Propagar el comentario en refactors**: al copiar código, el comentario
88
- viaja con él y eventualmente se vuelve falso sin que nadie lo note.
89
- - **No actualizar el comentario al revertir el commit citado**: el `git
90
- revert` no borra comentarios — el comentario sobrevive afirmando
91
- alineación con un commit que ya no existe en la línea de desarrollo.
92
- - **Usar el comentario como "prueba" en debates técnicos**: "ya está
93
- alineado con X" cuando el comentario es la única evidencia es razonar
94
- desde una afirmación no verificada.
95
-
96
- ---
97
-
98
- ## Alternativas seguras a los comentarios temporales
99
-
100
- Cuando se necesita marcar alineación cross-stack:
101
-
102
- | En vez de | Usar |
103
- |-----------|------|
104
- | `// Alineado con commits X+Y` | Test de contrato que valide el shape real en CI |
105
- | `// Refactorizado a v2.3.0` | Versión semántica en el archivo + lock |
106
- | `# Sincronizado con backend` | Tipos generados (OpenAPI codegen, Prisma) |
107
- | `<!-- Coherente con schema X -->` | Validador automatizado en pre-commit |
108
-
109
- Si el comentario es la única opción (no hay test/codegen disponible),
110
- incluir **fecha y SHA** explícitos para que la revisión periódica detecte
111
- drift:
112
-
113
- ```typescript
114
- // Alineado con backend commit 284df74 al 2026-05-22.
115
- // Re-verificar si el endpoint POST /contratos cambia su contrato.
116
- ```
117
-
118
- ---
119
-
120
- ## Relación con otras reglas
121
-
122
- - `~/.claude/rules/verificar-citas-normativas.md § Familia 2` — regla
123
- global hermana. Esta regla extiende el principio al sub-caso "comentarios
124
- temporales en código".
125
- - `reglas/arreglar-al-detectar.md` — un comentario stale detectado es
126
- trabajo a resolver en mismo turno (actualizarlo o eliminarlo).
127
- - `~/.claude/rules/usar-sistema-swl.md` — invocar `revisor-codigo-swl`
128
- cuando se sospecha drift acumulado de comentarios temporales en un
129
- módulo.
130
-
131
- ---
132
-
133
- ## Checklist al detectar un comentario temporal
134
-
135
- - [ ] ¿El comentario afirma alineación con algo verificable (commit, schema, versión)?
136
- - [ ] ¿Verifiqué la fuente real con `grep`/`Read`/`git show` ANTES de actuar?
137
- - [ ] Si hay drift detectado, ¿actualicé/eliminé el comentario en el mismo commit?
138
- - [ ] Si voy a propagar el código (copy-paste, refactor), ¿el comentario sigue siendo válido?
139
- - [ ] Si el comentario es la única opción, ¿incluye fecha y SHA explícitos?