@saulwade/swl-ses 2.3.0 → 2.3.1
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 +47 -6
- package/README.md +1 -1
- package/agentes/accesibilidad-wcag-swl.md +690 -690
- package/agentes/arquitecto-swl.md +267 -267
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/backend-api-swl.md +472 -472
- package/agentes/backend-csharp-swl.md +420 -420
- package/agentes/backend-go-swl.md +390 -390
- package/agentes/backend-java-swl.md +281 -281
- package/agentes/backend-node-swl.md +479 -479
- package/agentes/backend-python-swl.md +605 -605
- package/agentes/backend-rust-swl.md +364 -364
- package/agentes/backend-workers-swl.md +482 -482
- package/agentes/cloud-infra-swl.md +509 -509
- package/agentes/consolidador-swl.md +541 -541
- package/agentes/datos-swl.md +605 -605
- package/agentes/depurador-swl.md +352 -352
- package/agentes/devops-ci-swl.md +400 -400
- package/agentes/disenador-ui-swl.md +569 -569
- package/agentes/documentador-swl.md +345 -345
- package/agentes/frontend-angular-swl.md +621 -621
- package/agentes/frontend-css-swl.md +716 -716
- package/agentes/frontend-react-swl.md +692 -692
- package/agentes/frontend-swl.md +496 -496
- package/agentes/frontend-tailwind-swl.md +826 -826
- package/agentes/gh-fix-ci-swl.md +2 -2
- package/agentes/implementador-swl.md +328 -328
- package/agentes/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- package/agentes/llm-apps-swl.md +278 -278
- package/agentes/migrador-swl.md +442 -442
- package/agentes/mobile-android-swl.md +511 -511
- package/agentes/mobile-cross-swl.md +541 -541
- package/agentes/mobile-ios-swl.md +502 -502
- package/agentes/mobile-testing-swl.md +302 -302
- package/agentes/nemesis-auditor-swl.md +285 -285
- package/agentes/notificador-swl.md +918 -918
- package/agentes/observabilidad-swl.md +438 -438
- package/agentes/orquestador-swl.md +1026 -1026
- package/agentes/pagos-swl.md +310 -310
- package/agentes/perfilador-usuario-swl.md +321 -321
- package/agentes/planificador-swl.md +399 -399
- package/agentes/producto-prd-swl.md +589 -589
- package/agentes/red-team-swl.md +1 -1
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/resolutor-build-swl.md +245 -245
- package/agentes/revisor-angular-swl.md +278 -278
- package/agentes/revisor-codigo-swl.md +505 -505
- package/agentes/revisor-csharp-swl.md +264 -264
- package/agentes/revisor-go-swl.md +259 -259
- package/agentes/revisor-java-swl.md +257 -257
- package/agentes/revisor-kotlin-swl.md +273 -273
- package/agentes/revisor-nextjs-swl.md +281 -281
- package/agentes/revisor-php-swl.md +271 -271
- package/agentes/revisor-react-swl.md +278 -278
- package/agentes/revisor-rust-swl.md +346 -346
- package/agentes/revisor-seguridad-swl.md +399 -399
- package/agentes/revisor-swift-swl.md +268 -268
- package/agentes/revisor-typescript-swl.md +346 -346
- package/agentes/sre-swl.md +291 -291
- package/agentes/tdd-qa-swl.md +393 -393
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/predecir.md +139 -139
- package/comandos/swl/sesiones.md +1 -1
- package/gateway/agent-executor.js +1 -1
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/agent-deep-links/SKILL.md +148 -148
- package/habilidades/agentes-como-servicio/SKILL.md +2 -2
- package/habilidades/angular-moderno/SKILL.md +20 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/backend-async-postgres-testing/SKILL.md +215 -215
- package/habilidades/backend-error-design/SKILL.md +221 -221
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/calidad-anti-patrones-universales/SKILL.md +368 -368
- package/habilidades/calidad-contract-testing/SKILL.md +165 -165
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -170
- package/habilidades/changelog-generator/scripts/parse-commits.js +367 -367
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +1 -1
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +252 -252
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -255
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -105
- package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -138
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
- package/habilidades/proceso-modular-split/SKILL.md +256 -256
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +2 -2
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/structured-outputs/SKILL.md +2 -2
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
- package/habilidades/swl-dashboard/SKILL.md +2 -2
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +1 -1
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +1 -1
- package/hooks/ciclo-evolucion-subagente.js +26 -26
- package/hooks/ciclo-evolucion.js +26 -26
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/claudemd-duplicacion-detector.js +170 -170
- package/hooks/contexto-iteracion.js +144 -144
- package/hooks/guardrail-modelo.js +1 -1
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/autonomia.js +208 -208
- package/hooks/lib/ciclo-evolucion.js +47 -47
- package/hooks/lib/deep-links.js +185 -185
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/etapa-auto-evolucion.js +701 -701
- package/hooks/lib/etapa-metricas.js +388 -388
- package/hooks/lib/etapa-perfil-usuario.js +376 -376
- package/hooks/lib/loop-telemetry.js +321 -321
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/model-router.js +2 -2
- package/hooks/lib/propose-step.js +358 -358
- package/hooks/lib/provenance-tracker.js +191 -191
- 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/security-net.js +201 -201
- 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/token-estimator.js +1 -0
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/lib/usage-model.js +1 -1
- package/hooks/linea-estado.js +2 -0
- package/hooks/registro-turnos.js +209 -209
- package/hooks/session-briefing.js +98 -98
- package/hooks/spec-gate.js +211 -211
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/tdd-gate.js +241 -241
- package/hooks/telemetria-skill-routing.js +100 -100
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-intent-spec.js +242 -242
- package/hooks/validar-memoria-hook.js +218 -218
- package/hooks/validar-planning-paths.js +134 -134
- package/instintos/autonomia.yaml +27 -27
- package/instintos/prompt-appendices.yaml +57 -57
- package/llms.txt +29 -29
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/canonical-hashes.json +2291 -1964
- package/manifiestos/planning-paths.json +44 -44
- package/manifiestos/skills-lock.json +1282 -1282
- package/package.json +1 -1
- 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/accesibilidad.md +10 -10
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/api-diseno.md +9 -9
- package/reglas/arreglar-al-detectar.md +240 -240
- package/reglas/auditorias-documentales-estructurales.md +7 -7
- package/reglas/cloud-infra.md +8 -8
- package/reglas/consultar-vault-primero.md +195 -195
- package/reglas/debatir-antes-de-aceptar.md +158 -158
- package/reglas/fragmentos-compartidos.md +183 -183
- package/reglas/hooks.md +6 -6
- package/reglas/intent-engineering.md +218 -218
- package/reglas/markitdown.md +8 -8
- package/reglas/monitor-ci.md +309 -309
- package/reglas/patrones.md +6 -6
- package/reglas/sesiones-paralelas.md +180 -180
- package/reglas/sin-duplicacion-reglas-globales.md +182 -182
- package/reglas/skills-estandar.md +6 -6
- package/reglas/testing.md +7 -7
- package/reglas/tests-cleanup.md +224 -224
- package/reglas/usar-code-review-graph.md +155 -155
- package/reglas/usar-context7.md +226 -226
- package/reglas/verificar-citas-normativas.md +548 -548
- package/schemas/agent-frontmatter.schema.json +3 -3
- package/schemas/agent-message.schema.json +73 -73
- package/schemas/agent-output-implementacion.schema.json +114 -114
- package/schemas/agent-output-planificacion.schema.json +150 -150
- package/schemas/agent-output-review.schema.json +98 -98
- package/schemas/diary-entry.schema.json +112 -112
- package/schemas/hook-profiles.schema.json +54 -54
- package/schemas/hooks-config.schema.json +89 -89
- package/schemas/modulos.schema.json +38 -38
- package/schemas/perfiles.schema.json +36 -36
- package/schemas/plugin.schema.json +77 -77
- package/schemas/skill-evals.schema.json +119 -119
- package/schemas/skill-frontmatter.schema.json +245 -245
- package/scripts/audit-tools/audit-history.js +330 -330
- package/scripts/audit-tools/bundle-tracker.js +290 -290
- package/scripts/audit-tools/canary-monitor.js +352 -352
- package/scripts/audit-tools/code-profiler.js +605 -605
- package/scripts/audit-tools/dep-doctor.js +320 -320
- package/scripts/audit-tools/env-validator.js +206 -206
- package/scripts/audit-tools/lib/fs-walk.js +48 -48
- package/scripts/audit-tools/lib/output.js +23 -23
- package/scripts/audit-tools/migration-checker.js +392 -392
- package/scripts/audit-tools/pentest-scanner.js +1436 -1436
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/cli/aprobar-plan.js +73 -73
- package/scripts/cli/briefing.js +23 -23
- package/scripts/cli/ciclo-evolucion.js +26 -26
- package/scripts/cli/configurar-ci.js +40 -40
- package/scripts/cli/derivar-feature-list.js +25 -25
- package/scripts/cli/detectar-host.js +27 -27
- package/scripts/cli/diary-entry.js +69 -69
- package/scripts/cli/execution-state.js +18 -18
- package/scripts/cli/gateway-notify.js +41 -41
- package/scripts/cli/liberar-fase.js +42 -42
- package/scripts/cli/loop-telemetry.js +125 -125
- package/scripts/cli/mark-evolved.js +56 -56
- package/scripts/cli/metricas-dora.js +26 -26
- package/scripts/cli/near-duplicate.js +55 -55
- package/scripts/cli/notificaciones.js +123 -123
- package/scripts/cli/propose-step.js +29 -29
- package/scripts/cli/schedule-parse.js +19 -19
- package/scripts/cli/sugerir-modelo.js +20 -20
- package/scripts/cli/verificar-plan.js +36 -36
- package/scripts/cli/verificar-trazabilidad.js +35 -35
- 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-matriz-lenguajes.js +271 -271
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/auditar-invocaciones-comandos.js +104 -104
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/ci-reader.js +193 -193
- package/scripts/lib/claude-sessions.js +1 -0
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-host-swl.js +175 -175
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
- package/scripts/lib/detector-reglas-duplicadas.js +220 -220
- 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/evidencia-release.js +322 -322
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/gate-hooks-requires.js +249 -249
- package/scripts/lib/gate-licencias.js +212 -212
- package/scripts/lib/git-metricas.js +257 -257
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/metricas-dora.js +204 -204
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/plan-lock.js +275 -275
- package/scripts/lib/pr-analyzer.js +399 -399
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/reglas-globales-conocidas.json +180 -180
- package/scripts/lib/resolver-plan-fase.js +37 -37
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/schema-version.js +164 -164
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/tool-cost-analyzer.js +1 -0
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +200 -200
- package/scripts/publicar.js +497 -497
- package/scripts/run-eval.js +141 -141
- package/scripts/tui/componentes/selector-multi.js +189 -189
- package/scripts/tui/componentes/selector-unico.js +158 -158
- package/scripts/tui/ejecutores.js +375 -375
- package/scripts/tui/index.js +162 -162
- package/scripts/tui/lib/colores.js +129 -129
- package/scripts/tui/lib/render.js +264 -264
- package/scripts/tui/lib/teclas.js +113 -113
- package/scripts/tui/pantallas/inspect.js +173 -173
- package/scripts/tui/pantallas/install-wizard.js +334 -334
- package/scripts/tui/pantallas/menu-principal.js +52 -52
- package/scripts/tui/pantallas/progreso.js +274 -274
- package/scripts/tui/pantallas/resumen.js +132 -132
- package/scripts/tui/pantallas/uninstall-wizard.js +208 -208
- package/scripts/tui/pantallas/update-wizard.js +232 -232
- package/scripts/tui/pantallas/welcome.js +187 -187
- package/scripts/validar-userland-vacio.js +110 -110
package/reglas/tests-cleanup.md
CHANGED
|
@@ -1,224 +1,224 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/tests/**"
|
|
4
|
-
---
|
|
5
|
-
# Regla: Cleanup obligatorio de directorios temporales en tests
|
|
6
|
-
|
|
7
|
-
Esta regla es **OBLIGATORIA** y aplica a todo test Node.js del sistema SWL
|
|
8
|
-
que cree directorios temporales bajo `os.tmpdir()` (típicamente
|
|
9
|
-
`C:\Users\<usuario>\AppData\Local\Temp` en Windows, `/tmp` en POSIX).
|
|
10
|
-
|
|
11
|
-
Promueve a regla obligatoria el aprendizaje L1 #19 + entrada extensa de
|
|
12
|
-
APRENDIZAJES.md (2026-05-17 "Tests sin cleanup acumularon 5,800+ carpetas
|
|
13
|
-
en %TEMP%") tras reincidencia documentada el 2026-05-18 en
|
|
14
|
-
`tests/hooks/validar-intent-spec.test.js` (192 residuos acumulados).
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Principio
|
|
19
|
-
|
|
20
|
-
> Todo test que necesite un directorio temporal DEBE usar
|
|
21
|
-
> `setupSandboxes(prefix)` de `tests/_helpers/sandbox.js`. NUNCA
|
|
22
|
-
> `fs.mkdtempSync(path.join(os.tmpdir(), ...))` directo.
|
|
23
|
-
|
|
24
|
-
El helper registra automáticamente `after()` del módulo `node:test` para
|
|
25
|
-
limpiar al final del archivo. Sin él, cada corrida de `npm test:all` deja
|
|
26
|
-
N carpetas residuales (N = número de tests × archivos sin cleanup).
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Patrón obligatorio
|
|
31
|
-
|
|
32
|
-
### MAL — `mkdtempSync` directo sin cleanup
|
|
33
|
-
|
|
34
|
-
```javascript
|
|
35
|
-
const fs = require('node:fs');
|
|
36
|
-
const os = require('node:os');
|
|
37
|
-
const path = require('node:path');
|
|
38
|
-
const { test } = require('node:test');
|
|
39
|
-
|
|
40
|
-
function crearSandbox() {
|
|
41
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), 'mi-test-'));
|
|
42
|
-
// ✗ Nunca se limpia. Acumula residuos en %TEMP%.
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
test('hace algo', () => {
|
|
46
|
-
const dir = crearSandbox();
|
|
47
|
-
// ... usar dir ...
|
|
48
|
-
// ✗ Sin try/finally con rmSync.
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### BIEN — `setupSandboxes` con cleanup automático
|
|
53
|
-
|
|
54
|
-
```javascript
|
|
55
|
-
const { test } = require('node:test');
|
|
56
|
-
const { setupSandboxes } = require('../_helpers/sandbox');
|
|
57
|
-
|
|
58
|
-
const sandboxes = setupSandboxes('mi-test-');
|
|
59
|
-
// ✓ setupSandboxes registra after() global del archivo.
|
|
60
|
-
|
|
61
|
-
test('hace algo', () => {
|
|
62
|
-
const dir = sandboxes.create();
|
|
63
|
-
// ... usar dir ...
|
|
64
|
-
// ✓ Cleanup automático al terminar el archivo de tests.
|
|
65
|
-
});
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Cuándo aplicar
|
|
71
|
-
|
|
72
|
-
OBLIGATORIO en:
|
|
73
|
-
|
|
74
|
-
- Cualquier archivo `tests/**/*.test.js` que cree dirs temporales para
|
|
75
|
-
aislar el test del CWD del proyecto.
|
|
76
|
-
- Tests de hooks que necesitan sandbox con `.planning/`, `agentes/`, etc.
|
|
77
|
-
- Tests de scripts que escriben archivos generados (`generar-*`,
|
|
78
|
-
`auditar-*`).
|
|
79
|
-
- Cualquier helper de fixtures que cree filesystem temporal.
|
|
80
|
-
|
|
81
|
-
NO aplicar (excepciones legítimas):
|
|
82
|
-
|
|
83
|
-
- Tests que NO crean dirs temporales (unit tests puros con stubs/mocks).
|
|
84
|
-
- Tests que usan `process.chdir` sin crear directorio nuevo (raros).
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
## Convención del prefijo
|
|
89
|
-
|
|
90
|
-
El prefijo pasado a `setupSandboxes(prefix)` DEBE:
|
|
91
|
-
|
|
92
|
-
1. Empezar con `swl-` para identificar el origen del proyecto.
|
|
93
|
-
2. Incluir el nombre del componente bajo test (corto).
|
|
94
|
-
3. Terminar con guión final (el helper NO lo añade automáticamente).
|
|
95
|
-
|
|
96
|
-
Ejemplos válidos:
|
|
97
|
-
|
|
98
|
-
- `setupSandboxes('swl-mi-hook-')`
|
|
99
|
-
- `setupSandboxes('swl-claudemd-')`
|
|
100
|
-
- `setupSandboxes('swl-evolucion-')`
|
|
101
|
-
|
|
102
|
-
Ejemplos inválidos:
|
|
103
|
-
|
|
104
|
-
- `setupSandboxes('test')` — sin prefijo `swl-`, indistinguible de otros proyectos.
|
|
105
|
-
- `setupSandboxes('swl-hook')` — falta guión final, `mkdtemp` añade chars random pegados al nombre.
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## Casos especiales: `process.chdir` en tests
|
|
110
|
-
|
|
111
|
-
Si el test hace `process.chdir(sandbox)` en top-level, registrar
|
|
112
|
-
**ANTES** de `setupSandboxes()` un `after()` que restaure el CWD:
|
|
113
|
-
|
|
114
|
-
```javascript
|
|
115
|
-
const originalCwd = process.cwd();
|
|
116
|
-
const { after } = require('node:test');
|
|
117
|
-
after(() => process.chdir(originalCwd));
|
|
118
|
-
// ↑ chdir-restore registrado primero
|
|
119
|
-
const sandboxes = setupSandboxes('swl-mi-test-');
|
|
120
|
-
// ↑ cleanup de sandboxes registrado segundo
|
|
121
|
-
// FIFO en node:test: restaurar CWD primero, luego limpiar dirs.
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
Sin esto, Windows EBUSY al intentar `rmSync` un directorio que es el CWD activo.
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## Verificación
|
|
129
|
-
|
|
130
|
-
### Test de regresión post-suite
|
|
131
|
-
|
|
132
|
-
Tras ejecutar `npm test:all`, verificar 0 residuos:
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
# Bash
|
|
136
|
-
ls "$LOCALAPPDATA/Temp" 2>/dev/null | grep -c "^swl-" || echo "0"
|
|
137
|
-
|
|
138
|
-
# PowerShell
|
|
139
|
-
(Get-ChildItem $env:TEMP -Directory -Filter "swl-*").Count
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Resultado esperado: `0`.
|
|
143
|
-
|
|
144
|
-
### Auditoría continua del repo
|
|
145
|
-
|
|
146
|
-
Para detectar archivos de test que ignoran la regla:
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
# Archivos con mkdtempSync directo SIN usar el helper
|
|
150
|
-
grep -rlE "mkdtempSync\(.*os\.tmpdir|fs\.mkdtempSync" tests/ \
|
|
151
|
-
| grep -v "_helpers" \
|
|
152
|
-
| xargs -I {} grep -L "setupSandboxes" {}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Resultado esperado tras migración completa: `0` archivos.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Anti-patrones explícitos
|
|
160
|
-
|
|
161
|
-
- **Copiar de un test "legacy" como referencia**: si el patrón a copiar
|
|
162
|
-
usa `mkdtempSync` directo, el nuevo test heredará el bug. Verificar
|
|
163
|
-
que el test fuente use `setupSandboxes` antes de copiar como
|
|
164
|
-
plantilla.
|
|
165
|
-
- **`afterEach` con `rmSync` manual cuando ya existe `setupSandboxes`**:
|
|
166
|
-
duplica responsabilidad. Si necesitas cleanup por test (no por
|
|
167
|
-
archivo), el helper expone `sandboxes.cleanup()` invocable.
|
|
168
|
-
- **Path construido manualmente** con `path.join(os.tmpdir(),
|
|
169
|
-
\`prefix-${Date.now()}\`)` + `mkdirSync`: escapa al regex de
|
|
170
|
-
auditoría que busca `mkdtempSync`. Si el patrón aparece, refactorizar
|
|
171
|
-
a `setupSandboxes` igual.
|
|
172
|
-
- **Ignorar Windows EBUSY**: si en CI Linux pasa pero localmente
|
|
173
|
-
Windows falla con `EBUSY: resource busy or locked`, casi siempre es
|
|
174
|
-
cleanup intentando borrar el CWD. Aplicar el patrón `chdir-restore
|
|
175
|
-
ANTES de setupSandboxes`.
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## Excepciones documentadas
|
|
180
|
-
|
|
181
|
-
Si un test legítimamente NO puede usar `setupSandboxes` (caso raro), DEBE:
|
|
182
|
-
|
|
183
|
-
1. Documentar en comentario al inicio del archivo por qué no aplica.
|
|
184
|
-
2. Implementar cleanup manual con `after()` + `try/finally`.
|
|
185
|
-
3. Incluir test de regresión: tras el test, `Get-ChildItem $env:TEMP` no debe mostrar el dir.
|
|
186
|
-
|
|
187
|
-
Sin esos 3 elementos, el test será marcado como violación de la regla
|
|
188
|
-
en `/swl:revisar`.
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## Origen
|
|
193
|
-
|
|
194
|
-
- **Aprendizaje L1 #19** (2026-05-17): "Test nuevo que necesita
|
|
195
|
-
directorio temporal | Usar `setupSandboxes('prefix-')` de
|
|
196
|
-
`tests/_helpers/sandbox.js`; nunca `fs.mkdtempSync` directo sin
|
|
197
|
-
cleanup".
|
|
198
|
-
- **Entrada extensa APRENDIZAJES.md líneas 6793-6852**: el usuario
|
|
199
|
-
descubrió manualmente más de 5,800 carpetas con prefijo `swl-*` en
|
|
200
|
-
`C:\Users\Saul\AppData\Local\Temp` y las limpió con CCleaner.
|
|
201
|
-
Investigación reveló 14 archivos de test sin cleanup en refactor PR #35.
|
|
202
|
-
- **Reincidencia 2026-05-18**: tras refactor de 14 archivos quedaron
|
|
203
|
-
32 sin migrar. Yo creé `tests/hooks/validar-intent-spec.test.js`
|
|
204
|
-
copiando patrón de `claudemd-bloat-detector.test.js` (no migrado) →
|
|
205
|
-
192 residuos en 1 sesión. La regla estaba en APRENDIZAJES.md pero NO
|
|
206
|
-
era obligatoria en `reglas/` ni `~/.claude/rules/pruebas.md`.
|
|
207
|
-
|
|
208
|
-
Esta regla cierra ese gap promoviendo el aprendizaje a regla obligatoria
|
|
209
|
-
del proyecto + actualización del skill `tdd-workflow` para enseñar el
|
|
210
|
-
patrón correcto.
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## Relación con otras reglas
|
|
215
|
-
|
|
216
|
-
- `~/.claude/rules/pruebas.md § Tests deterministas — sin sleep ni delays`
|
|
217
|
-
— esta regla extiende el principio "Limpiar estado en teardown" al
|
|
218
|
-
caso específico de directorios temporales.
|
|
219
|
-
- `~/.claude/rules/arreglar-al-detectar.md` — la deuda silenciosa que
|
|
220
|
-
esta regla cierra es exactamente el tipo de deuda que esa regla
|
|
221
|
-
prohíbe acumular.
|
|
222
|
-
- `reglas/registro-componentes-nuevos.md` — al crear un test nuevo se
|
|
223
|
-
considera componente nuevo del sistema; la regla aplica como parte
|
|
224
|
-
del registro.
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/tests/**"
|
|
4
|
+
---
|
|
5
|
+
# Regla: Cleanup obligatorio de directorios temporales en tests
|
|
6
|
+
|
|
7
|
+
Esta regla es **OBLIGATORIA** y aplica a todo test Node.js del sistema SWL
|
|
8
|
+
que cree directorios temporales bajo `os.tmpdir()` (típicamente
|
|
9
|
+
`C:\Users\<usuario>\AppData\Local\Temp` en Windows, `/tmp` en POSIX).
|
|
10
|
+
|
|
11
|
+
Promueve a regla obligatoria el aprendizaje L1 #19 + entrada extensa de
|
|
12
|
+
APRENDIZAJES.md (2026-05-17 "Tests sin cleanup acumularon 5,800+ carpetas
|
|
13
|
+
en %TEMP%") tras reincidencia documentada el 2026-05-18 en
|
|
14
|
+
`tests/hooks/validar-intent-spec.test.js` (192 residuos acumulados).
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Principio
|
|
19
|
+
|
|
20
|
+
> Todo test que necesite un directorio temporal DEBE usar
|
|
21
|
+
> `setupSandboxes(prefix)` de `tests/_helpers/sandbox.js`. NUNCA
|
|
22
|
+
> `fs.mkdtempSync(path.join(os.tmpdir(), ...))` directo.
|
|
23
|
+
|
|
24
|
+
El helper registra automáticamente `after()` del módulo `node:test` para
|
|
25
|
+
limpiar al final del archivo. Sin él, cada corrida de `npm test:all` deja
|
|
26
|
+
N carpetas residuales (N = número de tests × archivos sin cleanup).
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Patrón obligatorio
|
|
31
|
+
|
|
32
|
+
### MAL — `mkdtempSync` directo sin cleanup
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
const fs = require('node:fs');
|
|
36
|
+
const os = require('node:os');
|
|
37
|
+
const path = require('node:path');
|
|
38
|
+
const { test } = require('node:test');
|
|
39
|
+
|
|
40
|
+
function crearSandbox() {
|
|
41
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'mi-test-'));
|
|
42
|
+
// ✗ Nunca se limpia. Acumula residuos en %TEMP%.
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
test('hace algo', () => {
|
|
46
|
+
const dir = crearSandbox();
|
|
47
|
+
// ... usar dir ...
|
|
48
|
+
// ✗ Sin try/finally con rmSync.
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### BIEN — `setupSandboxes` con cleanup automático
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
const { test } = require('node:test');
|
|
56
|
+
const { setupSandboxes } = require('../_helpers/sandbox');
|
|
57
|
+
|
|
58
|
+
const sandboxes = setupSandboxes('mi-test-');
|
|
59
|
+
// ✓ setupSandboxes registra after() global del archivo.
|
|
60
|
+
|
|
61
|
+
test('hace algo', () => {
|
|
62
|
+
const dir = sandboxes.create();
|
|
63
|
+
// ... usar dir ...
|
|
64
|
+
// ✓ Cleanup automático al terminar el archivo de tests.
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Cuándo aplicar
|
|
71
|
+
|
|
72
|
+
OBLIGATORIO en:
|
|
73
|
+
|
|
74
|
+
- Cualquier archivo `tests/**/*.test.js` que cree dirs temporales para
|
|
75
|
+
aislar el test del CWD del proyecto.
|
|
76
|
+
- Tests de hooks que necesitan sandbox con `.planning/`, `agentes/`, etc.
|
|
77
|
+
- Tests de scripts que escriben archivos generados (`generar-*`,
|
|
78
|
+
`auditar-*`).
|
|
79
|
+
- Cualquier helper de fixtures que cree filesystem temporal.
|
|
80
|
+
|
|
81
|
+
NO aplicar (excepciones legítimas):
|
|
82
|
+
|
|
83
|
+
- Tests que NO crean dirs temporales (unit tests puros con stubs/mocks).
|
|
84
|
+
- Tests que usan `process.chdir` sin crear directorio nuevo (raros).
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Convención del prefijo
|
|
89
|
+
|
|
90
|
+
El prefijo pasado a `setupSandboxes(prefix)` DEBE:
|
|
91
|
+
|
|
92
|
+
1. Empezar con `swl-` para identificar el origen del proyecto.
|
|
93
|
+
2. Incluir el nombre del componente bajo test (corto).
|
|
94
|
+
3. Terminar con guión final (el helper NO lo añade automáticamente).
|
|
95
|
+
|
|
96
|
+
Ejemplos válidos:
|
|
97
|
+
|
|
98
|
+
- `setupSandboxes('swl-mi-hook-')`
|
|
99
|
+
- `setupSandboxes('swl-claudemd-')`
|
|
100
|
+
- `setupSandboxes('swl-evolucion-')`
|
|
101
|
+
|
|
102
|
+
Ejemplos inválidos:
|
|
103
|
+
|
|
104
|
+
- `setupSandboxes('test')` — sin prefijo `swl-`, indistinguible de otros proyectos.
|
|
105
|
+
- `setupSandboxes('swl-hook')` — falta guión final, `mkdtemp` añade chars random pegados al nombre.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Casos especiales: `process.chdir` en tests
|
|
110
|
+
|
|
111
|
+
Si el test hace `process.chdir(sandbox)` en top-level, registrar
|
|
112
|
+
**ANTES** de `setupSandboxes()` un `after()` que restaure el CWD:
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
const originalCwd = process.cwd();
|
|
116
|
+
const { after } = require('node:test');
|
|
117
|
+
after(() => process.chdir(originalCwd));
|
|
118
|
+
// ↑ chdir-restore registrado primero
|
|
119
|
+
const sandboxes = setupSandboxes('swl-mi-test-');
|
|
120
|
+
// ↑ cleanup de sandboxes registrado segundo
|
|
121
|
+
// FIFO en node:test: restaurar CWD primero, luego limpiar dirs.
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Sin esto, Windows EBUSY al intentar `rmSync` un directorio que es el CWD activo.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Verificación
|
|
129
|
+
|
|
130
|
+
### Test de regresión post-suite
|
|
131
|
+
|
|
132
|
+
Tras ejecutar `npm test:all`, verificar 0 residuos:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Bash
|
|
136
|
+
ls "$LOCALAPPDATA/Temp" 2>/dev/null | grep -c "^swl-" || echo "0"
|
|
137
|
+
|
|
138
|
+
# PowerShell
|
|
139
|
+
(Get-ChildItem $env:TEMP -Directory -Filter "swl-*").Count
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Resultado esperado: `0`.
|
|
143
|
+
|
|
144
|
+
### Auditoría continua del repo
|
|
145
|
+
|
|
146
|
+
Para detectar archivos de test que ignoran la regla:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# Archivos con mkdtempSync directo SIN usar el helper
|
|
150
|
+
grep -rlE "mkdtempSync\(.*os\.tmpdir|fs\.mkdtempSync" tests/ \
|
|
151
|
+
| grep -v "_helpers" \
|
|
152
|
+
| xargs -I {} grep -L "setupSandboxes" {}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Resultado esperado tras migración completa: `0` archivos.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Anti-patrones explícitos
|
|
160
|
+
|
|
161
|
+
- **Copiar de un test "legacy" como referencia**: si el patrón a copiar
|
|
162
|
+
usa `mkdtempSync` directo, el nuevo test heredará el bug. Verificar
|
|
163
|
+
que el test fuente use `setupSandboxes` antes de copiar como
|
|
164
|
+
plantilla.
|
|
165
|
+
- **`afterEach` con `rmSync` manual cuando ya existe `setupSandboxes`**:
|
|
166
|
+
duplica responsabilidad. Si necesitas cleanup por test (no por
|
|
167
|
+
archivo), el helper expone `sandboxes.cleanup()` invocable.
|
|
168
|
+
- **Path construido manualmente** con `path.join(os.tmpdir(),
|
|
169
|
+
\`prefix-${Date.now()}\`)` + `mkdirSync`: escapa al regex de
|
|
170
|
+
auditoría que busca `mkdtempSync`. Si el patrón aparece, refactorizar
|
|
171
|
+
a `setupSandboxes` igual.
|
|
172
|
+
- **Ignorar Windows EBUSY**: si en CI Linux pasa pero localmente
|
|
173
|
+
Windows falla con `EBUSY: resource busy or locked`, casi siempre es
|
|
174
|
+
cleanup intentando borrar el CWD. Aplicar el patrón `chdir-restore
|
|
175
|
+
ANTES de setupSandboxes`.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Excepciones documentadas
|
|
180
|
+
|
|
181
|
+
Si un test legítimamente NO puede usar `setupSandboxes` (caso raro), DEBE:
|
|
182
|
+
|
|
183
|
+
1. Documentar en comentario al inicio del archivo por qué no aplica.
|
|
184
|
+
2. Implementar cleanup manual con `after()` + `try/finally`.
|
|
185
|
+
3. Incluir test de regresión: tras el test, `Get-ChildItem $env:TEMP` no debe mostrar el dir.
|
|
186
|
+
|
|
187
|
+
Sin esos 3 elementos, el test será marcado como violación de la regla
|
|
188
|
+
en `/swl:revisar`.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Origen
|
|
193
|
+
|
|
194
|
+
- **Aprendizaje L1 #19** (2026-05-17): "Test nuevo que necesita
|
|
195
|
+
directorio temporal | Usar `setupSandboxes('prefix-')` de
|
|
196
|
+
`tests/_helpers/sandbox.js`; nunca `fs.mkdtempSync` directo sin
|
|
197
|
+
cleanup".
|
|
198
|
+
- **Entrada extensa APRENDIZAJES.md líneas 6793-6852**: el usuario
|
|
199
|
+
descubrió manualmente más de 5,800 carpetas con prefijo `swl-*` en
|
|
200
|
+
`C:\Users\Saul\AppData\Local\Temp` y las limpió con CCleaner.
|
|
201
|
+
Investigación reveló 14 archivos de test sin cleanup en refactor PR #35.
|
|
202
|
+
- **Reincidencia 2026-05-18**: tras refactor de 14 archivos quedaron
|
|
203
|
+
32 sin migrar. Yo creé `tests/hooks/validar-intent-spec.test.js`
|
|
204
|
+
copiando patrón de `claudemd-bloat-detector.test.js` (no migrado) →
|
|
205
|
+
192 residuos en 1 sesión. La regla estaba en APRENDIZAJES.md pero NO
|
|
206
|
+
era obligatoria en `reglas/` ni `~/.claude/rules/pruebas.md`.
|
|
207
|
+
|
|
208
|
+
Esta regla cierra ese gap promoviendo el aprendizaje a regla obligatoria
|
|
209
|
+
del proyecto + actualización del skill `tdd-workflow` para enseñar el
|
|
210
|
+
patrón correcto.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Relación con otras reglas
|
|
215
|
+
|
|
216
|
+
- `~/.claude/rules/pruebas.md § Tests deterministas — sin sleep ni delays`
|
|
217
|
+
— esta regla extiende el principio "Limpiar estado en teardown" al
|
|
218
|
+
caso específico de directorios temporales.
|
|
219
|
+
- `~/.claude/rules/arreglar-al-detectar.md` — la deuda silenciosa que
|
|
220
|
+
esta regla cierra es exactamente el tipo de deuda que esa regla
|
|
221
|
+
prohíbe acumular.
|
|
222
|
+
- `reglas/registro-componentes-nuevos.md` — al crear un test nuevo se
|
|
223
|
+
considera componente nuevo del sistema; la regla aplica como parte
|
|
224
|
+
del registro.
|