@saulwade/swl-ses 2.3.0 → 2.4.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 +241 -199
- package/README.md +597 -597
- package/agentes/_intent-spec.md +73 -73
- package/agentes/_propose-step.md +90 -90
- package/agentes/accesibilidad-wcag-swl.md +2 -2
- package/agentes/arquitecto-swl.md +2 -2
- package/agentes/auto-evolucion-swl.md +2 -2
- package/agentes/backend-api-swl.md +2 -2
- package/agentes/backend-csharp-swl.md +2 -2
- package/agentes/backend-go-swl.md +2 -2
- package/agentes/backend-java-swl.md +2 -2
- package/agentes/backend-node-swl.md +2 -2
- package/agentes/backend-python-swl.md +2 -2
- package/agentes/backend-rust-swl.md +2 -2
- package/agentes/backend-workers-swl.md +2 -2
- package/agentes/cloud-infra-swl.md +2 -2
- package/agentes/consolidador-swl.md +2 -2
- package/agentes/datos-swl.md +2 -2
- package/agentes/depurador-swl.md +2 -2
- package/agentes/devops-ci-swl.md +2 -2
- package/agentes/disenador-ui-swl.md +2 -2
- package/agentes/documentador-swl.md +2 -2
- package/agentes/frontend-angular-swl.md +2 -2
- package/agentes/frontend-css-swl.md +2 -2
- package/agentes/frontend-react-swl.md +2 -2
- package/agentes/frontend-swl.md +2 -2
- package/agentes/frontend-tailwind-swl.md +2 -2
- package/agentes/gh-fix-ci-swl.md +275 -275
- package/agentes/implementador-swl.md +2 -2
- package/agentes/investigador-swl.md +2 -2
- package/agentes/investigador-ux-swl.md +2 -2
- package/agentes/llm-apps-swl.md +2 -2
- package/agentes/migrador-swl.md +2 -2
- package/agentes/mobile-android-swl.md +2 -2
- package/agentes/mobile-cross-swl.md +2 -2
- package/agentes/mobile-ios-swl.md +2 -2
- package/agentes/mobile-testing-swl.md +2 -2
- package/agentes/nemesis-auditor-swl.md +1 -1
- package/agentes/notificador-swl.md +2 -2
- package/agentes/observabilidad-swl.md +2 -2
- package/agentes/orquestador-swl.md +41 -14
- package/agentes/pagos-swl.md +2 -2
- package/agentes/perfilador-usuario-swl.md +2 -2
- package/agentes/planificador-swl.md +2 -2
- package/agentes/producto-prd-swl.md +2 -2
- package/agentes/red-team-swl.md +218 -218
- package/agentes/release-manager-swl.md +2 -2
- package/agentes/rendimiento-swl.md +2 -2
- package/agentes/resolutor-build-swl.md +2 -2
- package/agentes/revisor-angular-swl.md +2 -2
- package/agentes/revisor-codigo-swl.md +36 -3
- package/agentes/revisor-csharp-swl.md +2 -2
- package/agentes/revisor-go-swl.md +2 -2
- package/agentes/revisor-java-swl.md +2 -2
- package/agentes/revisor-kotlin-swl.md +2 -2
- package/agentes/revisor-nextjs-swl.md +2 -2
- package/agentes/revisor-php-swl.md +2 -2
- package/agentes/revisor-react-swl.md +2 -2
- package/agentes/revisor-rust-swl.md +2 -2
- package/agentes/revisor-seguridad-swl.md +2 -2
- package/agentes/revisor-swift-swl.md +2 -2
- package/agentes/revisor-typescript-swl.md +2 -2
- package/agentes/sre-swl.md +2 -2
- package/agentes/tdd-qa-swl.md +2 -2
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/contexto.md +0 -2
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/deuda-codigo.md +97 -0
- 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 +24 -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/contenedores-docker/SKILL.md +3 -1
- 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/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/SKILL.md +4 -4
- package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +253 -252
- package/habilidades/legacy-code-rescue/SKILL.md +268 -267
- package/habilidades/meta-skills-estandar/SKILL.md +1 -1
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +2 -2
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/postgresql-experto/SKILL.md +3 -1
- package/habilidades/prevencion-sobreingenieria/SKILL.md +70 -92
- package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
- package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -0
- package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -0
- 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/audit-trail.js +4 -4
- package/hooks/calidad-pre-commit.js +15 -11
- package/hooks/captura-acciones-post.js +3 -2
- package/hooks/captura-acciones-session.js +3 -2
- 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 +145 -144
- package/hooks/contexto-subagente.js +68 -0
- package/hooks/guardrail-modelo.js +14 -4
- package/hooks/inyeccion-contexto.js +12 -12
- 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/registro-turnos.js +210 -209
- package/hooks/session-briefing.js +98 -98
- package/hooks/spec-gate.js +212 -211
- package/hooks/sugerir-contribuir.js +2 -1
- package/hooks/sugerir-regenerar-inventario.js +171 -170
- package/hooks/tdd-gate.js +242 -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 +2948 -1964
- package/manifiestos/hook-profiles.json +0 -2
- package/manifiestos/hooks-config.json +469 -477
- package/manifiestos/invariantes-criticos.json +30 -0
- package/manifiestos/modulos.json +1390 -1390
- package/manifiestos/planning-paths.json +44 -44
- package/manifiestos/skills-lock.json +1282 -1282
- package/package.json +93 -93
- 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 +369 -371
- 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 +5 -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/instalador.js +4 -1
- 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/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/preservar-usuario.js +39 -5
- 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/tool-cost-analyzer.js +1 -0
- package/scripts/limpiar-artefactos-python.js +131 -131
- 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/scripts/validar.js +1 -1
- package/scripts/verificar-release.js +51 -0
- package/hooks/lib/context-compressor.js +0 -657
- package/hooks/linea-estado.js +0 -326
- package/hooks/monitor-contexto.js +0 -373
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Soluciones nativas de plataforma
|
|
2
|
+
|
|
3
|
+
Recurso de `prevencion-sobreingenieria` — peldaño 4 de la escalera de decisión.
|
|
4
|
+
La primera pregunta del ingeniero perezoso-eficiente: *¿la plataforma ya hace
|
|
5
|
+
esto?* Antes de instalar un paquete o escribir un componente, revisar aquí.
|
|
6
|
+
La plataforma viaja gratis con la app, no se rompe en updates, y la escribió
|
|
7
|
+
gente cuyo trabajo es exactamente ese problema.
|
|
8
|
+
|
|
9
|
+
Adaptado de [ponytail](https://github.com/DietrichGebert/ponytail)
|
|
10
|
+
`docs/platform-native.md` (MIT, DietrichGebert).
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Elementos HTML
|
|
15
|
+
|
|
16
|
+
| Crees que necesitas | La plataforma ya tiene |
|
|
17
|
+
|---|---|
|
|
18
|
+
| Lib de date picker | `<input type="date">` |
|
|
19
|
+
| Lib de time picker | `<input type="time">` |
|
|
20
|
+
| Lib de color picker | `<input type="color">` |
|
|
21
|
+
| Lib de range slider | `<input type="range">` |
|
|
22
|
+
| Componente de progress bar | `<progress value="70" max="100">` |
|
|
23
|
+
| Componente meter/gauge | `<meter value="0.7">` |
|
|
24
|
+
| Lib de modal/diálogo | `<dialog>` + `dialog.showModal()` |
|
|
25
|
+
| Componente acordeón/FAQ | `<details><summary>Título</summary>…</details>` |
|
|
26
|
+
| Lib de tooltips | atributo `title` + CSS `::before`/`::after` |
|
|
27
|
+
| Dropdown con búsqueda | `<input list="id"> <datalist id="id">` |
|
|
28
|
+
| Textarea auto-crecible | `field-sizing: content` (CSS) |
|
|
29
|
+
| Header sticky | `position: sticky; top: 0` (CSS) |
|
|
30
|
+
|
|
31
|
+
## Capacidades CSS (donde se suele usar JS)
|
|
32
|
+
|
|
33
|
+
| Crees que necesitas JS para | CSS ya tiene |
|
|
34
|
+
|---|---|
|
|
35
|
+
| Font size responsivo | `font-size: clamp(1rem, 2.5vw, 2rem)` |
|
|
36
|
+
| Espaciado fluido | `padding: clamp(1rem, 5vw, 3rem)` |
|
|
37
|
+
| Dark mode | `@media (prefers-color-scheme: dark)` |
|
|
38
|
+
| Reduced motion | `@media (prefers-reduced-motion: reduce)` |
|
|
39
|
+
| Layout responsivo sin breakpoints | `grid-template-columns: repeat(auto-fill, minmax(250px, 1fr))` |
|
|
40
|
+
| Responsive a nivel componente | `@container` queries |
|
|
41
|
+
| Design tokens / theming global | Custom properties (`--color-primario: #7c3aed`) |
|
|
42
|
+
| Smooth scroll | `scroll-behavior: smooth` |
|
|
43
|
+
| Carrusel con scroll-snap | `scroll-snap-type: x mandatory` + `scroll-snap-align: start` |
|
|
44
|
+
| Aspect ratio | `aspect-ratio: 16 / 9` |
|
|
45
|
+
| Truncar texto con elipsis | `overflow: hidden; text-overflow: ellipsis; white-space: nowrap` |
|
|
46
|
+
| Clamp multilínea | `-webkit-line-clamp: 3` |
|
|
47
|
+
| Aislamiento de estilos por capas | `@layer base, components, utilities` |
|
|
48
|
+
| Selectores anidados | CSS nesting nativo (sin preprocesador) |
|
|
49
|
+
| Selector de padre | `:has(input:checked)` |
|
|
50
|
+
|
|
51
|
+
## JavaScript / APIs del navegador
|
|
52
|
+
|
|
53
|
+
| Crees que necesitas | La plataforma ya tiene |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `query-string` / `qs` | `new URLSearchParams(location.search)` |
|
|
56
|
+
| `lodash.clonedeep` | `structuredClone(obj)` |
|
|
57
|
+
| `lodash.groupby` | `Object.groupBy(arr, fn)` |
|
|
58
|
+
| `numeral` / `accounting` | `new Intl.NumberFormat("es-MX", { style: "currency", currency: "MXN" })` |
|
|
59
|
+
| `date-fns` format | `new Intl.DateTimeFormat("es-MX", { dateStyle: "long" }).format(fecha)` |
|
|
60
|
+
| Tiempo relativo | `new Intl.RelativeTimeFormat("es", { numeric: "auto" }).format(-3, "day")` |
|
|
61
|
+
| Plurales i18n | `new Intl.PluralRules("es-MX").select(cantidad)` |
|
|
62
|
+
| `clipboard.js` | `navigator.clipboard.writeText(texto)` |
|
|
63
|
+
| `uuid` (v4) | `crypto.randomUUID()` |
|
|
64
|
+
| Lib de infinite scroll | `new IntersectionObserver(cb).observe(sentinela)` |
|
|
65
|
+
| Lib de resize listener | `new ResizeObserver(cb).observe(elemento)` |
|
|
66
|
+
| Watcher de mutaciones DOM | `new MutationObserver(cb).observe(el, opciones)` |
|
|
67
|
+
| Check de conectividad | `navigator.onLine` + eventos `online`/`offline` |
|
|
68
|
+
| Lib de share sheet | `navigator.share({ title, text, url })` |
|
|
69
|
+
| `store.js` / `localForage` (caso simple) | `localStorage.setItem(clave, JSON.stringify(valor))` |
|
|
70
|
+
| Abortar fetch por timeout | `AbortSignal.timeout(5000)` pasado a `fetch` |
|
|
71
|
+
| Event bus custom | `new EventTarget()` / `dispatchEvent(new CustomEvent("x", { detail }))` |
|
|
72
|
+
|
|
73
|
+
**Debounce en 3 líneas** (sin dependencia):
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
// simplificado: debounce de una sola instancia; lib si se necesitan N independientes
|
|
77
|
+
let t;
|
|
78
|
+
const debounce = (fn, ms) => (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); };
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Swift / SwiftUI
|
|
82
|
+
|
|
83
|
+
| Crees que necesitas | La plataforma ya tiene |
|
|
84
|
+
|---|---|
|
|
85
|
+
| Lib de date/time picker | `DatePicker` |
|
|
86
|
+
| Lib de color picker | `ColorPicker` |
|
|
87
|
+
| Search bar + filtrado | `.searchable(text:)` |
|
|
88
|
+
| Lib de pull-to-refresh | `.refreshable { }` |
|
|
89
|
+
| Swipe-to-delete / acciones de fila | `.swipeActions { }` |
|
|
90
|
+
| Carga async de imágenes + caché | `AsyncImage` |
|
|
91
|
+
| Lib de gráficas | Swift Charts (`import Charts`) |
|
|
92
|
+
| Render de Markdown | `Text(...)` markdown / `AttributedString(markdown:)` |
|
|
93
|
+
| Share sheet | `ShareLink` |
|
|
94
|
+
| Spinner de carga | `ProgressView()` |
|
|
95
|
+
| Photo picker | `PhotosPicker` |
|
|
96
|
+
| JSON (SwiftyJSON) | `Codable` + `JSONDecoder`/`JSONEncoder` |
|
|
97
|
+
| HTTP simple (Alamofire) | `URLSession` async/await |
|
|
98
|
+
| Crypto (CryptoSwift) | `CryptoKit` |
|
|
99
|
+
| Persistencia / ORM | `SwiftData`, o `@AppStorage` para key-values |
|
|
100
|
+
| Logging | `Logger` (`os.log`) |
|
|
101
|
+
|
|
102
|
+
## Stdlib de Node.js
|
|
103
|
+
|
|
104
|
+
| Crees que necesitas | Node ya tiene |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `mkdirp` / `make-dir` | `fs.mkdirSync(ruta, { recursive: true })` |
|
|
107
|
+
| `rimraf` | `fs.rmSync(ruta, { recursive: true, force: true })` |
|
|
108
|
+
| `uuid` (v4) | `crypto.randomUUID()` |
|
|
109
|
+
| `object-assign` | `Object.assign()` / spread |
|
|
110
|
+
| `array-uniq` | `[...new Set(arr)]` |
|
|
111
|
+
| `array-flatten` / `flat` | `arr.flat(profundidad)` |
|
|
112
|
+
| `path-exists` | `fs.existsSync(ruta)` |
|
|
113
|
+
| `load-json-file` | `JSON.parse(fs.readFileSync(ruta, "utf8"))` |
|
|
114
|
+
| `write-json-file` | `fs.writeFileSync(ruta, JSON.stringify(obj, null, 2))` |
|
|
115
|
+
| `pkg-dir` | `path.resolve(__dirname, "..")` / `import.meta.dirname` |
|
|
116
|
+
|
|
117
|
+
## Stdlib de Python
|
|
118
|
+
|
|
119
|
+
| Crees que necesitas | Python ya tiene |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `python-dateutil` (parsing básico) | `datetime.fromisoformat()` (3.7+) |
|
|
122
|
+
| `pytz` | `zoneinfo.ZoneInfo("America/Mexico_City")` (3.9+) |
|
|
123
|
+
| `attrs` (data classes simples) | `@dataclass` |
|
|
124
|
+
| `pathlib2` | `pathlib.Path` (3.4+) |
|
|
125
|
+
| `simplejson` (uso básico) | `json` (stdlib) |
|
|
126
|
+
| `requests` (GET simple) | `urllib.request.urlopen(url)`; `requests` para algo real |
|
|
127
|
+
| `click` (comando único) | `argparse` (stdlib) |
|
|
128
|
+
| `mergedeep` | `dict \| otro_dict` (3.9+) |
|
|
129
|
+
| `more-itertools` (básico) | `itertools`: `chain`, `islice`, `groupby`, `product` |
|
|
130
|
+
| `toolz` (básico) | `functools`: `lru_cache`, `partial`, `reduce` |
|
|
131
|
+
|
|
132
|
+
## Base de datos
|
|
133
|
+
|
|
134
|
+
| Crees que necesitas código de app para | La BD ya tiene |
|
|
135
|
+
|---|---|
|
|
136
|
+
| Paginación | `LIMIT 20 OFFSET 40` |
|
|
137
|
+
| Totales acumulados | `SUM(...) OVER (ORDER BY fecha)` (window function) |
|
|
138
|
+
| Rank por grupo | `RANK() OVER (PARTITION BY categoria ORDER BY score DESC)` |
|
|
139
|
+
| Deduplicación | `SELECT DISTINCT` / `ON CONFLICT DO NOTHING` |
|
|
140
|
+
| Recorrido de árboles | CTE recursivo (`WITH RECURSIVE`) |
|
|
141
|
+
| Full-text search (básico) | `tsvector` / `MATCH AGAINST` / `FTS5` |
|
|
142
|
+
| Almacenar + consultar JSON | `jsonb` (Postgres) / `JSON_EXTRACT` (SQLite/MySQL) |
|
|
143
|
+
| Generación de UUID | `gen_random_uuid()` (Postgres) / `UUID()` (MySQL) |
|
|
144
|
+
| Timestamps de insert/update | `DEFAULT now()` + trigger / `ON UPDATE CURRENT_TIMESTAMP` |
|
|
145
|
+
| Unicidad | constraint `UNIQUE`, no checks en la app |
|
|
146
|
+
| Integridad referencial | `FOREIGN KEY`, no checks en la app |
|
|
147
|
+
| Rangos de valores | `CHECK (precio > 0)`, no validación en la app |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## El patrón
|
|
152
|
+
|
|
153
|
+
En todas las capas es el mismo ciclo:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
El equipo de la plataforma pasa años resolviendo el problema.
|
|
157
|
+
Alguien lo envuelve en un paquete.
|
|
158
|
+
Instalas el wrapper.
|
|
159
|
+
El wrapper queda sin mantenimiento.
|
|
160
|
+
Terminas debugueando el wrapper.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Sáltate el wrapper. Cuando la solución nativa es genuinamente insuficiente
|
|
164
|
+
(soporte de navegadores viejos, edge cases que no cubre, ergonomía que importa
|
|
165
|
+
a escala), la librería se gana su lugar — instálala entonces, no antes
|
|
166
|
+
(y verifica su vigencia con Context7, regla `usar-context7.md`).
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Variables residuales post-refactor son code smell
|
|
2
|
+
|
|
3
|
+
Recurso de `prevencion-sobreingenieria`. Extraído del SKILL.md en v1.3.0 para
|
|
4
|
+
respetar el límite de 300 líneas; el contenido es normativo sin cambios.
|
|
5
|
+
|
|
6
|
+
## Regla
|
|
7
|
+
|
|
8
|
+
Variables asignadas pero no usadas (F841 en ruff/flake8) **post-refactor** son
|
|
9
|
+
casi siempre residuos de una versión anterior del código que el refactor no
|
|
10
|
+
limpió. Se parecen a "variables temporales del desarrollador" pero delatan un
|
|
11
|
+
refactor incompleto — la lógica que las usaba se movió o eliminó, pero las
|
|
12
|
+
asignaciones quedaron.
|
|
13
|
+
|
|
14
|
+
## Por qué son peligrosas
|
|
15
|
+
|
|
16
|
+
- **Confunden al próximo lector**: asumirá que la variable se usa más abajo.
|
|
17
|
+
- **Inflan el diff cognitivo** del refactor real.
|
|
18
|
+
- **Ocultan bugs sutiles**: el valor asignado puede tener side effects (llamada
|
|
19
|
+
a función costosa o con efecto en estado) que ya no aporta nada al flujo.
|
|
20
|
+
- **Invalidan la métrica de cobertura**: líneas "cubiertas" por tests que en
|
|
21
|
+
realidad no afectan el resultado.
|
|
22
|
+
|
|
23
|
+
## Patrón operativo
|
|
24
|
+
|
|
25
|
+
Después de **cualquier refactor** que modifique el flujo de una función (extraer
|
|
26
|
+
método, inlinear función, cambiar el shape de un return), correr:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
ruff check --select=F841 ruta/al/modulo.py
|
|
30
|
+
# o para todo el proyecto
|
|
31
|
+
ruff check --select=F841 .
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Cada F841 detectado post-refactor es candidato 1 de 2:
|
|
35
|
+
|
|
36
|
+
1. **Variable muerta** (caso común post-refactor): eliminarla.
|
|
37
|
+
2. **Variable viva pero mal nombrada** (caso raro): si el valor se usa como
|
|
38
|
+
side effect intencional (ej: evaluar una propiedad para cachear), renombrar
|
|
39
|
+
con prefijo `_` y comentar el propósito.
|
|
40
|
+
|
|
41
|
+
## Anti-patrón típico
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
# Antes del refactor: había un if que usaba exito_key
|
|
45
|
+
def procesar(data):
|
|
46
|
+
exito, exito_key = intentar(data)
|
|
47
|
+
if exito_key == "via_rapida":
|
|
48
|
+
return procesar_rapido(data)
|
|
49
|
+
return procesar_normal(data, exito_key)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Después de refactor que eliminó la rama "via_rapida"
|
|
53
|
+
def procesar(data):
|
|
54
|
+
exito, exito_key = intentar(data) # ← F841: exito_key asignado, no usado
|
|
55
|
+
return procesar_normal(data) # ← también exito residual
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Patrón canónico
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
# Post-refactor limpio
|
|
62
|
+
def procesar(data):
|
|
63
|
+
_ = intentar(data) # si el side effect de intentar() importa
|
|
64
|
+
return procesar_normal(data)
|
|
65
|
+
|
|
66
|
+
# o mejor: si ni siquiera el side effect importa
|
|
67
|
+
def procesar(data):
|
|
68
|
+
return procesar_normal(data)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Reglas
|
|
72
|
+
|
|
73
|
+
- **Gate pre-commit**: agregar `ruff check --select=F841` al pre-commit hook del proyecto. No bloquea en un repo grande donde F841 preexiste, pero sí bloquea en los archivos modificados por el commit actual.
|
|
74
|
+
- **Revisión explícita post-refactor grande**: tras extraer 5+ métodos o mover 5+ bloques, correr `ruff --select=F401,F841` sobre los archivos tocados.
|
|
75
|
+
- **NO silenciar con `# noqa: F841` sin justificación** — la excepción legítima (side effect intencional con nombre `_`) es tan rara que vale la pena documentarla; silenciar sin comentario es ocultar deuda.
|
|
76
|
+
- **Incluir en checklist de PR**: "F841 limpio en archivos tocados" como item explícito.
|
|
77
|
+
|
|
78
|
+
## Aplicabilidad
|
|
79
|
+
|
|
80
|
+
Detectable en:
|
|
81
|
+
|
|
82
|
+
- Python: `ruff --select=F841`, `flake8 --select=F841`.
|
|
83
|
+
- TypeScript/JavaScript: `eslint --rule 'no-unused-vars: error'`.
|
|
84
|
+
- Go: el compilador lo hace obligatorio (`declared but not used`).
|
|
85
|
+
- Rust: warning `unused_variables`, promovido a error con `#![deny(unused_variables)]`.
|