@saulwade/swl-ses 2.5.2 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +194 -192
- package/README.md +600 -600
- package/agentes/auto-evolucion-swl.md +27 -3
- package/bin/swl-ses.js +32 -6
- package/comandos/swl/actualizar.md +174 -174
- package/comandos/swl/adoptar-proyecto.md +265 -265
- package/comandos/swl/aprender.md +836 -823
- package/comandos/swl/aprobar-plan.md +146 -146
- package/comandos/swl/auditar-deps.md +134 -134
- package/comandos/swl/autoresearch.md +264 -264
- package/comandos/swl/ayuda.md +224 -224
- package/comandos/swl/brainstorm.md +51 -51
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/checkpoint.md +325 -325
- package/comandos/swl/claudemd.md +234 -234
- package/comandos/swl/compactar.md +310 -310
- package/comandos/swl/configurar-ci.md +235 -235
- package/comandos/swl/contexto.md +110 -110
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/crear-skill.md +292 -292
- package/comandos/swl/cron.md +194 -194
- package/comandos/swl/deuda-codigo.md +97 -97
- package/comandos/swl/discutir-fase.md +169 -169
- package/comandos/swl/ejecutar-fase.md +233 -233
- package/comandos/swl/evaluar-skill.md +520 -505
- package/comandos/swl/evolucion-continua.md +73 -0
- package/comandos/swl/evolucionar.md +267 -254
- package/comandos/swl/exportar-vault.md +583 -583
- package/comandos/swl/fix.md +118 -118
- package/comandos/swl/gateway.md +158 -158
- package/comandos/swl/inbox.md +116 -116
- package/comandos/swl/instalar.md +220 -220
- package/comandos/swl/instintos.md +86 -86
- package/comandos/swl/mapear-codebase.md +312 -312
- package/comandos/swl/mcp-status.md +175 -175
- package/comandos/swl/modelo.md +100 -100
- package/comandos/swl/nemesis.md +433 -433
- package/comandos/swl/notificaciones.md +299 -299
- package/comandos/swl/nuevo-proyecto.md +251 -251
- package/comandos/swl/planear-fase.md +263 -263
- package/comandos/swl/plugins.md +256 -256
- package/comandos/swl/predecir.md +169 -169
- package/comandos/swl/reflect-skills.md +125 -125
- package/comandos/swl/release.md +450 -450
- package/comandos/swl/revisar-impacto.md +201 -201
- package/comandos/swl/revisar.md +330 -330
- package/comandos/swl/seguridad.md +189 -189
- package/comandos/swl/sesiones.md +200 -200
- package/comandos/swl/skill-search.md +113 -113
- package/comandos/swl/status.md +343 -343
- package/comandos/swl/verificar.md +817 -817
- package/comandos/swl/wiki.md +620 -620
- package/gateway/cron/jobs.example.json +12 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -276
- package/habilidades/autoresearch/SKILL.md +3 -2
- package/habilidades/benchmark-memoria/SKILL.md +7 -7
- package/habilidades/changelog-generator/SKILL.md +174 -174
- package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
- package/habilidades/checkpoints-verificacion/SKILL.md +6 -0
- package/habilidades/context-builder/SKILL.md +4 -0
- package/habilidades/doubt-driven-review/SKILL.md +207 -191
- package/habilidades/drift-detection/SKILL.md +6 -1
- package/habilidades/ejecutar-fase/SKILL.md +6 -6
- package/habilidades/eval-framework/SKILL.md +8 -3
- package/habilidades/harness-claude-code/SKILL.md +314 -308
- package/habilidades/infra-github-actions/SKILL.md +4 -3
- package/habilidades/instalar-sistema/SKILL.md +227 -223
- package/habilidades/memoria-busqueda/SKILL.md +31 -39
- package/habilidades/planear-fase/SKILL.md +358 -350
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +3 -2
- package/habilidades/release-semver/SKILL.md +4 -2
- package/habilidades/swl-claudemd/SKILL.md +6 -7
- package/habilidades/swl-dashboard/SKILL.md +11 -43
- package/habilidades/tdd-workflow/SKILL.md +749 -744
- package/habilidades/validacion-ci-sistema/SKILL.md +1 -1
- package/hooks/agente-lifecycle.js +2 -1
- package/hooks/aiisms-detector.js +13 -4
- package/hooks/audit-trail.js +2 -1
- package/hooks/auto-consolidacion.js +2 -1
- package/hooks/captura-acciones-post.js +2 -1
- package/hooks/captura-acciones-session.js +2 -1
- package/hooks/captura-feedback-usuario.js +3 -2
- package/hooks/claudemd-bloat-detector.js +12 -3
- package/hooks/claudemd-duplicacion-detector.js +13 -3
- package/hooks/contexto-iteracion.js +2 -1
- package/hooks/degradacion-instintos.js +2 -1
- package/hooks/extraccion-aprendizajes.js +109 -15
- package/hooks/grafo-contexto.js +2 -1
- package/hooks/guardrail-modelo.js +2 -1
- package/hooks/inbox-aviso.js +2 -1
- package/hooks/inyeccion-contexto.js +2 -1
- package/hooks/lib/agent-matcher.js +2 -1
- package/hooks/lib/agent-routing.js +2 -1
- package/hooks/lib/autonomia.js +5 -3
- package/hooks/lib/captura-acciones.js +2 -1
- package/hooks/lib/consolidation-lock.js +21 -10
- package/hooks/lib/etapa-auto-evolucion.js +10 -4
- package/hooks/lib/etapa-metricas.js +2 -1
- package/hooks/lib/etapa-perfil-usuario.js +20 -4
- package/hooks/lib/evolution-tracker.js +2 -1
- package/hooks/lib/gateway-notify.js +193 -179
- package/hooks/lib/loop-telemetry.js +5 -4
- package/hooks/lib/mcp-health.js +2 -1
- package/hooks/lib/memory-search.js +4 -0
- package/hooks/lib/merkle-audit.js +58 -6
- package/hooks/lib/nudge-tracker.js +2 -1
- package/hooks/lib/otlp-exporter.js +2 -1
- package/hooks/lib/propose-step.js +3 -2
- package/hooks/lib/raiz-proyecto.js +102 -0
- package/hooks/lib/run-log.js +2 -1
- package/hooks/lib/singleton-guard.js +218 -27
- package/hooks/lib/telegram-cliente.js +17 -8
- package/hooks/preservar-estado-pre-compact.js +2 -1
- package/hooks/proteccion-rutas.js +59 -3
- package/hooks/registro-turnos.js +2 -1
- package/hooks/resumen-sesion.js +2 -1
- package/hooks/risk-scoring.js +2 -1
- package/hooks/rotar-audit-auto.js +46 -20
- package/hooks/session-briefing.js +127 -1
- package/hooks/spec-gate.js +2 -1
- package/hooks/sugerir-contribuir.js +6 -3
- package/hooks/sugerir-regenerar-inventario.js +3 -2
- package/hooks/tdd-gate.js +2 -1
- package/hooks/telemetria-agentes.js +2 -1
- package/hooks/telemetria-skill-routing.js +2 -1
- package/hooks/tracking-costos.js +4 -3
- package/hooks/validar-formato-post-subagente.js +2 -1
- package/hooks/validar-intent-spec.js +2 -1
- package/hooks/validar-memoria-hook.js +13 -3
- package/hooks/validar-planning-paths.js +2 -1
- package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +53 -0
- package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +372 -0
- package/instintos/perfil-usuario.yaml +506 -3
- package/instintos/proyecto.yaml +78 -0
- package/llms.txt +2 -2
- package/manifiestos/canonical-hashes.json +664 -2
- package/manifiestos/modulos.json +19 -14
- package/manifiestos/planning-paths.json +1 -0
- package/manifiestos/skills-lock.json +53 -53
- package/package.json +2 -3
- package/plugin.json +2 -2
- package/scripts/actualizar.js +3 -0
- package/scripts/auditar-clases-conocidas.js +32 -4
- package/scripts/benchmark-memoria.js +1 -0
- package/scripts/cli/autonomia.js +23 -0
- package/scripts/cli/benchmark-memoria.js +37 -0
- package/scripts/cli/ciclo-autonomo.js +73 -0
- package/scripts/cli/ciclo-fase-b.js +102 -0
- package/scripts/cli/guardrail-metrics.js +39 -0
- package/scripts/cli/loop-telemetry.js +4 -2
- package/scripts/cli/memoria-search.js +69 -0
- package/scripts/cli/nudge-accionar.js +39 -0
- package/scripts/cli/run-eval.js +38 -0
- package/scripts/cli/run-skill-evals.js +13 -2
- package/scripts/derivar-feature-list.js +15 -14
- package/scripts/desinstalar.js +11 -0
- package/scripts/doctor.js +24 -10
- package/scripts/instalador.js +106 -7
- package/scripts/lib/activar-hooks-proyecto.js +116 -0
- package/scripts/lib/auditar-invocaciones-comandos.js +96 -6
- package/scripts/lib/ciclo-autonomo/candidatos.js +174 -0
- package/scripts/lib/ciclo-autonomo/config.js +165 -0
- package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -0
- package/scripts/lib/ciclo-autonomo/fallback.js +77 -0
- package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -0
- package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -0
- package/scripts/lib/ciclo-autonomo/index.js +301 -0
- package/scripts/lib/ciclo-autonomo/lock.js +124 -0
- package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -0
- package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -0
- package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -0
- package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -0
- package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -0
- package/scripts/lib/estado.js +9 -0
- package/scripts/lib/evidencia-valor.js +1 -1
- package/scripts/lib/gitignore-manifest.js +8 -1
- package/scripts/lib/hooks-settings.js +45 -0
- package/scripts/rotar-audit-logs.js +48 -2
- package/scripts/run-eval.js +1 -0
- package/scripts/run-skill-evals.js +287 -8
- package/scripts/smoke-test.js +16 -8
- package/scripts/tui/pantallas/install-wizard.js +403 -347
- package/scripts/validar.js +40 -1
package/comandos/swl/cron.md
CHANGED
|
@@ -1,194 +1,194 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: swl:cron
|
|
3
|
-
description: Gestiona tareas programadas del sistema SWL. Crear, listar, pausar, reanudar y eliminar jobs recurrentes. Soporta 4 formatos de schedule (duración, intervalo, cron, timestamp ISO). Los jobs se almacenan en .planning/cron/jobs.json.
|
|
4
|
-
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
|
|
5
|
-
user-invocable: true
|
|
6
|
-
version: "1.0.0"
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# /swl:cron — Gestión de tareas programadas
|
|
10
|
-
|
|
11
|
-
Eres el gestor de tareas programadas del sistema SWL. Administras jobs que se ejecutan automáticamente según un schedule definido.
|
|
12
|
-
|
|
13
|
-
## Subcomandos
|
|
14
|
-
|
|
15
|
-
| Subcomando | Descripción |
|
|
16
|
-
|-----------|-------------|
|
|
17
|
-
| `list` | Lista todos los jobs con estado, schedule y próxima ejecución |
|
|
18
|
-
| `add` | Crear un nuevo job (guía interactiva) |
|
|
19
|
-
| `remove <id>` | Eliminar un job |
|
|
20
|
-
| `pause <id>` | Pausar un job sin eliminarlo |
|
|
21
|
-
| `resume <id>` | Reanudar un job pausado |
|
|
22
|
-
| `log [N]` | Mostrar últimas N ejecuciones |
|
|
23
|
-
| `start` | Iniciar el scheduler daemon |
|
|
24
|
-
| `run <id>` | Ejecutar un job manualmente (una vez, sin afectar schedule) |
|
|
25
|
-
|
|
26
|
-
## Formatos de schedule soportados
|
|
27
|
-
|
|
28
|
-
| Formato | Ejemplo | Descripción |
|
|
29
|
-
|---------|---------|-------------|
|
|
30
|
-
| Duración única | `30m`, `2h`, `1d` | Ejecutar una vez en N minutos/horas/días |
|
|
31
|
-
| Intervalo recurrente | `every 30m`, `every 2h` | Ejecutar cada N periódicamente |
|
|
32
|
-
| Expresión cron | `0 9 * * 1-5` | Cron estándar de 5 campos |
|
|
33
|
-
| Timestamp ISO | `2026-04-15T09:00` | Una vez a hora exacta |
|
|
34
|
-
| **Lenguaje natural (es-MX)** | `cada lunes a las 9am` | El comando lo traduce al formato técnico |
|
|
35
|
-
|
|
36
|
-
### Traducción de lenguaje natural
|
|
37
|
-
|
|
38
|
-
Si el usuario describe el schedule con una frase en español, tradúcela a cron
|
|
39
|
-
o a los formatos técnicos ANTES de guardar. Ejemplos de traducción:
|
|
40
|
-
|
|
41
|
-
| Frase del usuario | Traducción |
|
|
42
|
-
|---|---|
|
|
43
|
-
| "cada lunes a las 9am" / "todos los lunes 9 de la mañana" | `0 9 * * 1` |
|
|
44
|
-
| "cada día a las 8:30" | `30 8 * * *` |
|
|
45
|
-
| "cada hora" | `every 1h` |
|
|
46
|
-
| "cada 30 minutos" | `every 30m` |
|
|
47
|
-
| "de lunes a viernes a las 9am" | `0 9 * * 1-5` |
|
|
48
|
-
| "cada primer día del mes" / "el 1 de cada mes a medianoche" | `0 0 1 * *` |
|
|
49
|
-
| "cada domingo a las 23:00" | `0 23 * * 0` |
|
|
50
|
-
| "cada 2 horas en horario laboral" | `0 9-18/2 * * 1-5` |
|
|
51
|
-
| "en 30 minutos" (one-shot) | `30m` |
|
|
52
|
-
| "mañana a las 10am" (one-shot) | `<timestamp ISO calculado>` |
|
|
53
|
-
| "dentro de una semana" (one-shot) | `7d` |
|
|
54
|
-
|
|
55
|
-
**Reglas de traducción:**
|
|
56
|
-
|
|
57
|
-
1. **Días de la semana**: lunes=1, martes=2, …, sábado=6, domingo=0 (estándar cron).
|
|
58
|
-
2. **Horas**: interpretar "de la mañana"/"am" = 0-11; "de la tarde"/"pm" = 12-23.
|
|
59
|
-
3. **Zona horaria**: asumir la local del sistema salvo que el usuario especifique una.
|
|
60
|
-
4. **Ambigüedad**: si la frase es ambigua ("a veces", "pronto", "seguido"), pregunta
|
|
61
|
-
al usuario antes de guardar. Nunca inventes un valor por "parecerse".
|
|
62
|
-
5. **Validación obligatoria**: después de traducir, MOSTRAR al usuario la expresión
|
|
63
|
-
técnica resultante y la próxima ejecución estimada, y pedir confirmación:
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
Traduje "cada lunes a las 9am" → `0 9 * * 1`
|
|
67
|
-
Próxima ejecución: lunes 21 de abril 2026, 09:00:00 (hora local)
|
|
68
|
-
¿Confirmas? (sí / no / corrige la frase)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
6. **No guardar** hasta confirmación explícita.
|
|
72
|
-
|
|
73
|
-
## Subcomando: list
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
node -e "const s=require('./gateway/cron/store'); const jobs=s.loadJobs(process.cwd()); console.log(JSON.stringify(jobs,null,2))"
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Mostrar como tabla formateada:
|
|
80
|
-
```
|
|
81
|
-
=== Jobs programados ===
|
|
82
|
-
|
|
83
|
-
| ID | Nombre | Schedule | Estado | Próxima ejecución | Última |
|
|
84
|
-
|----|--------|----------|--------|-------------------|--------|
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Si no hay jobs: "No hay tareas programadas. Usa `/swl:cron add` para crear una."
|
|
88
|
-
|
|
89
|
-
## Subcomando: add
|
|
90
|
-
|
|
91
|
-
Preguntar al usuario:
|
|
92
|
-
1. **Nombre**: descripción breve del job
|
|
93
|
-
2. **Comando**: qué ejecutar (ej: `node bin/swl-ses.js doctor --json`)
|
|
94
|
-
3. **Schedule**: puede ser en lenguaje natural (ej: "cada lunes a las 9am") o
|
|
95
|
-
en formato técnico. Si es lenguaje natural, traducir según la tabla de la
|
|
96
|
-
sección **Traducción de lenguaje natural** y CONFIRMAR con el usuario la
|
|
97
|
-
expresión técnica resultante antes de continuar.
|
|
98
|
-
4. **Entrega**: dónde entregar el resultado (`local`, `telegram`, `discord`)
|
|
99
|
-
|
|
100
|
-
Crear el job:
|
|
101
|
-
```javascript
|
|
102
|
-
const store = require('./gateway/cron/store');
|
|
103
|
-
store.addJob(process.cwd(), {
|
|
104
|
-
name: '[nombre]',
|
|
105
|
-
schedule: '[schedule]',
|
|
106
|
-
command: '[comando]',
|
|
107
|
-
deliver: '[destino]',
|
|
108
|
-
});
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Jobs sugeridos para el sistema SWL:
|
|
112
|
-
- **Salud diaria**: `node bin/swl-ses.js doctor` — schedule `0 9 * * 1-5`
|
|
113
|
-
- **Auditoría de deps semanal**: `npm audit --json` — schedule `0 10 * * 1`
|
|
114
|
-
- **Backup de instintos**: `cp instintos/proyecto.yaml .planning/backups/` — schedule `every 1d`
|
|
115
|
-
|
|
116
|
-
## Subcomando: remove <id>
|
|
117
|
-
|
|
118
|
-
```javascript
|
|
119
|
-
const store = require('./gateway/cron/store');
|
|
120
|
-
store.removeJob(process.cwd(), '[id]');
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Confirmar antes de eliminar.
|
|
124
|
-
|
|
125
|
-
## Subcomando: pause / resume
|
|
126
|
-
|
|
127
|
-
```javascript
|
|
128
|
-
store.pauseJob(process.cwd(), '[id]');
|
|
129
|
-
store.resumeJob(process.cwd(), '[id]');
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Subcomando: log
|
|
133
|
-
|
|
134
|
-
```javascript
|
|
135
|
-
const store = require('./gateway/cron/store');
|
|
136
|
-
const log = store.readLog(process.cwd(), N);
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
Mostrar como tabla con fecha, job, status y output resumido.
|
|
140
|
-
|
|
141
|
-
## Subcomando: start
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
node gateway/cron/scheduler.js
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Inicia el scheduler. Muestra PID y confirma que el lock fue adquirido.
|
|
148
|
-
|
|
149
|
-
## Subcomando: run <id>
|
|
150
|
-
|
|
151
|
-
Ejecuta un job manualmente sin afectar su schedule normal:
|
|
152
|
-
```javascript
|
|
153
|
-
const { executeJob, deliverResult } = require('./gateway/cron/scheduler');
|
|
154
|
-
const store = require('./gateway/cron/store');
|
|
155
|
-
const jobs = store.loadJobs(process.cwd());
|
|
156
|
-
const job = jobs.find(j => j.id === '[id]');
|
|
157
|
-
const result = executeJob(job, process.cwd());
|
|
158
|
-
deliverResult(job, result, process.cwd());
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
## Parser de lenguaje natural programático (experimental)
|
|
162
|
-
|
|
163
|
-
El subcomando `swl-ses schedule-parse` parsea frases en inglés a expresiones
|
|
164
|
-
cron (resuelve cross-scope; ver `docs/invocacion-cli-cross-scope.md`). No
|
|
165
|
-
requiere dependencias externas.
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
# "every morning at 9am" → { "cron": "0 9 * * *", "descripcion": "Diariamente a las 9 AM" }
|
|
169
|
-
swl-ses schedule-parse "every morning at 9am"
|
|
170
|
-
# fallback: npx -y @saulwade/swl-ses@latest schedule-parse "every morning at 9am"
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
La verificación de si un cron debe ejecutarse ahora (`isCronDue`) la usa el
|
|
174
|
-
motor de scheduling internamente; no se expone como subcomando.
|
|
175
|
-
|
|
176
|
-
Frases reconocidas:
|
|
177
|
-
- `"hourly"` → `0 * * * *`
|
|
178
|
-
- `"daily"` / `"every day"` → `0 9 * * *`
|
|
179
|
-
- `"weekly"` → `0 9 * * 1`
|
|
180
|
-
- `"every N minutes"` (1-59) → `*/N * * * *`
|
|
181
|
-
- `"every N hours"` (1-23) → `0 */N * * *`
|
|
182
|
-
- `"every morning at 9am"` / `"daily at 14:30"` → expresión con hora específica
|
|
183
|
-
- `"every monday at 9am"` / `"weekly on friday"` → expresión con día de semana
|
|
184
|
-
- Expresión cron cruda de 5 campos → passthrough sin modificar
|
|
185
|
-
|
|
186
|
-
Para frases en español, la traducción manual (tabla de la sección anterior)
|
|
187
|
-
sigue siendo el método principal — el parser solo opera en inglés.
|
|
188
|
-
|
|
189
|
-
## Reglas de comportamiento
|
|
190
|
-
|
|
191
|
-
- SIEMPRE confirmar antes de eliminar un job
|
|
192
|
-
- SIEMPRE mostrar el schedule en formato legible junto al formato técnico
|
|
193
|
-
- Los jobs con `deliver: telegram/discord` requieren que el gateway esté configurado
|
|
194
|
-
- El scheduler usa file lock exclusivo — solo una instancia puede correr a la vez
|
|
1
|
+
---
|
|
2
|
+
name: swl:cron
|
|
3
|
+
description: Gestiona tareas programadas del sistema SWL. Crear, listar, pausar, reanudar y eliminar jobs recurrentes. Soporta 4 formatos de schedule (duración, intervalo, cron, timestamp ISO). Los jobs se almacenan en .planning/cron/jobs.json.
|
|
4
|
+
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
|
|
5
|
+
user-invocable: true
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /swl:cron — Gestión de tareas programadas
|
|
10
|
+
|
|
11
|
+
Eres el gestor de tareas programadas del sistema SWL. Administras jobs que se ejecutan automáticamente según un schedule definido.
|
|
12
|
+
|
|
13
|
+
## Subcomandos
|
|
14
|
+
|
|
15
|
+
| Subcomando | Descripción |
|
|
16
|
+
|-----------|-------------|
|
|
17
|
+
| `list` | Lista todos los jobs con estado, schedule y próxima ejecución |
|
|
18
|
+
| `add` | Crear un nuevo job (guía interactiva) |
|
|
19
|
+
| `remove <id>` | Eliminar un job |
|
|
20
|
+
| `pause <id>` | Pausar un job sin eliminarlo |
|
|
21
|
+
| `resume <id>` | Reanudar un job pausado |
|
|
22
|
+
| `log [N]` | Mostrar últimas N ejecuciones |
|
|
23
|
+
| `start` | Iniciar el scheduler daemon |
|
|
24
|
+
| `run <id>` | Ejecutar un job manualmente (una vez, sin afectar schedule) |
|
|
25
|
+
|
|
26
|
+
## Formatos de schedule soportados
|
|
27
|
+
|
|
28
|
+
| Formato | Ejemplo | Descripción |
|
|
29
|
+
|---------|---------|-------------|
|
|
30
|
+
| Duración única | `30m`, `2h`, `1d` | Ejecutar una vez en N minutos/horas/días |
|
|
31
|
+
| Intervalo recurrente | `every 30m`, `every 2h` | Ejecutar cada N periódicamente |
|
|
32
|
+
| Expresión cron | `0 9 * * 1-5` | Cron estándar de 5 campos |
|
|
33
|
+
| Timestamp ISO | `2026-04-15T09:00` | Una vez a hora exacta |
|
|
34
|
+
| **Lenguaje natural (es-MX)** | `cada lunes a las 9am` | El comando lo traduce al formato técnico |
|
|
35
|
+
|
|
36
|
+
### Traducción de lenguaje natural
|
|
37
|
+
|
|
38
|
+
Si el usuario describe el schedule con una frase en español, tradúcela a cron
|
|
39
|
+
o a los formatos técnicos ANTES de guardar. Ejemplos de traducción:
|
|
40
|
+
|
|
41
|
+
| Frase del usuario | Traducción |
|
|
42
|
+
|---|---|
|
|
43
|
+
| "cada lunes a las 9am" / "todos los lunes 9 de la mañana" | `0 9 * * 1` |
|
|
44
|
+
| "cada día a las 8:30" | `30 8 * * *` |
|
|
45
|
+
| "cada hora" | `every 1h` |
|
|
46
|
+
| "cada 30 minutos" | `every 30m` |
|
|
47
|
+
| "de lunes a viernes a las 9am" | `0 9 * * 1-5` |
|
|
48
|
+
| "cada primer día del mes" / "el 1 de cada mes a medianoche" | `0 0 1 * *` |
|
|
49
|
+
| "cada domingo a las 23:00" | `0 23 * * 0` |
|
|
50
|
+
| "cada 2 horas en horario laboral" | `0 9-18/2 * * 1-5` |
|
|
51
|
+
| "en 30 minutos" (one-shot) | `30m` |
|
|
52
|
+
| "mañana a las 10am" (one-shot) | `<timestamp ISO calculado>` |
|
|
53
|
+
| "dentro de una semana" (one-shot) | `7d` |
|
|
54
|
+
|
|
55
|
+
**Reglas de traducción:**
|
|
56
|
+
|
|
57
|
+
1. **Días de la semana**: lunes=1, martes=2, …, sábado=6, domingo=0 (estándar cron).
|
|
58
|
+
2. **Horas**: interpretar "de la mañana"/"am" = 0-11; "de la tarde"/"pm" = 12-23.
|
|
59
|
+
3. **Zona horaria**: asumir la local del sistema salvo que el usuario especifique una.
|
|
60
|
+
4. **Ambigüedad**: si la frase es ambigua ("a veces", "pronto", "seguido"), pregunta
|
|
61
|
+
al usuario antes de guardar. Nunca inventes un valor por "parecerse".
|
|
62
|
+
5. **Validación obligatoria**: después de traducir, MOSTRAR al usuario la expresión
|
|
63
|
+
técnica resultante y la próxima ejecución estimada, y pedir confirmación:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Traduje "cada lunes a las 9am" → `0 9 * * 1`
|
|
67
|
+
Próxima ejecución: lunes 21 de abril 2026, 09:00:00 (hora local)
|
|
68
|
+
¿Confirmas? (sí / no / corrige la frase)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
6. **No guardar** hasta confirmación explícita.
|
|
72
|
+
|
|
73
|
+
## Subcomando: list
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
node -e "const s=require('./gateway/cron/store'); const jobs=s.loadJobs(process.cwd()); console.log(JSON.stringify(jobs,null,2))"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Mostrar como tabla formateada:
|
|
80
|
+
```
|
|
81
|
+
=== Jobs programados ===
|
|
82
|
+
|
|
83
|
+
| ID | Nombre | Schedule | Estado | Próxima ejecución | Última |
|
|
84
|
+
|----|--------|----------|--------|-------------------|--------|
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Si no hay jobs: "No hay tareas programadas. Usa `/swl:cron add` para crear una."
|
|
88
|
+
|
|
89
|
+
## Subcomando: add
|
|
90
|
+
|
|
91
|
+
Preguntar al usuario:
|
|
92
|
+
1. **Nombre**: descripción breve del job
|
|
93
|
+
2. **Comando**: qué ejecutar (ej: `node bin/swl-ses.js doctor --json`)
|
|
94
|
+
3. **Schedule**: puede ser en lenguaje natural (ej: "cada lunes a las 9am") o
|
|
95
|
+
en formato técnico. Si es lenguaje natural, traducir según la tabla de la
|
|
96
|
+
sección **Traducción de lenguaje natural** y CONFIRMAR con el usuario la
|
|
97
|
+
expresión técnica resultante antes de continuar.
|
|
98
|
+
4. **Entrega**: dónde entregar el resultado (`local`, `telegram`, `discord`)
|
|
99
|
+
|
|
100
|
+
Crear el job:
|
|
101
|
+
```javascript
|
|
102
|
+
const store = require('./gateway/cron/store');
|
|
103
|
+
store.addJob(process.cwd(), {
|
|
104
|
+
name: '[nombre]',
|
|
105
|
+
schedule: '[schedule]',
|
|
106
|
+
command: '[comando]',
|
|
107
|
+
deliver: '[destino]',
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Jobs sugeridos para el sistema SWL:
|
|
112
|
+
- **Salud diaria**: `node bin/swl-ses.js doctor` — schedule `0 9 * * 1-5`
|
|
113
|
+
- **Auditoría de deps semanal**: `npm audit --json` — schedule `0 10 * * 1`
|
|
114
|
+
- **Backup de instintos**: `cp instintos/proyecto.yaml .planning/backups/` — schedule `every 1d`
|
|
115
|
+
|
|
116
|
+
## Subcomando: remove <id>
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
const store = require('./gateway/cron/store');
|
|
120
|
+
store.removeJob(process.cwd(), '[id]');
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Confirmar antes de eliminar.
|
|
124
|
+
|
|
125
|
+
## Subcomando: pause / resume
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
store.pauseJob(process.cwd(), '[id]');
|
|
129
|
+
store.resumeJob(process.cwd(), '[id]');
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Subcomando: log
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
const store = require('./gateway/cron/store');
|
|
136
|
+
const log = store.readLog(process.cwd(), N);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Mostrar como tabla con fecha, job, status y output resumido.
|
|
140
|
+
|
|
141
|
+
## Subcomando: start
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
node gateway/cron/scheduler.js
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Inicia el scheduler. Muestra PID y confirma que el lock fue adquirido.
|
|
148
|
+
|
|
149
|
+
## Subcomando: run <id>
|
|
150
|
+
|
|
151
|
+
Ejecuta un job manualmente sin afectar su schedule normal:
|
|
152
|
+
```javascript
|
|
153
|
+
const { executeJob, deliverResult } = require('./gateway/cron/scheduler');
|
|
154
|
+
const store = require('./gateway/cron/store');
|
|
155
|
+
const jobs = store.loadJobs(process.cwd());
|
|
156
|
+
const job = jobs.find(j => j.id === '[id]');
|
|
157
|
+
const result = executeJob(job, process.cwd());
|
|
158
|
+
deliverResult(job, result, process.cwd());
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Parser de lenguaje natural programático (experimental)
|
|
162
|
+
|
|
163
|
+
El subcomando `swl-ses schedule-parse` parsea frases en inglés a expresiones
|
|
164
|
+
cron (resuelve cross-scope; ver `docs/invocacion-cli-cross-scope.md`). No
|
|
165
|
+
requiere dependencias externas.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# "every morning at 9am" → { "cron": "0 9 * * *", "descripcion": "Diariamente a las 9 AM" }
|
|
169
|
+
swl-ses schedule-parse "every morning at 9am"
|
|
170
|
+
# fallback: npx -y @saulwade/swl-ses@latest schedule-parse "every morning at 9am"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
La verificación de si un cron debe ejecutarse ahora (`isCronDue`) la usa el
|
|
174
|
+
motor de scheduling internamente; no se expone como subcomando.
|
|
175
|
+
|
|
176
|
+
Frases reconocidas:
|
|
177
|
+
- `"hourly"` → `0 * * * *`
|
|
178
|
+
- `"daily"` / `"every day"` → `0 9 * * *`
|
|
179
|
+
- `"weekly"` → `0 9 * * 1`
|
|
180
|
+
- `"every N minutes"` (1-59) → `*/N * * * *`
|
|
181
|
+
- `"every N hours"` (1-23) → `0 */N * * *`
|
|
182
|
+
- `"every morning at 9am"` / `"daily at 14:30"` → expresión con hora específica
|
|
183
|
+
- `"every monday at 9am"` / `"weekly on friday"` → expresión con día de semana
|
|
184
|
+
- Expresión cron cruda de 5 campos → passthrough sin modificar
|
|
185
|
+
|
|
186
|
+
Para frases en español, la traducción manual (tabla de la sección anterior)
|
|
187
|
+
sigue siendo el método principal — el parser solo opera en inglés.
|
|
188
|
+
|
|
189
|
+
## Reglas de comportamiento
|
|
190
|
+
|
|
191
|
+
- SIEMPRE confirmar antes de eliminar un job
|
|
192
|
+
- SIEMPRE mostrar el schedule en formato legible junto al formato técnico
|
|
193
|
+
- Los jobs con `deliver: telegram/discord` requieren que el gateway esté configurado
|
|
194
|
+
- El scheduler usa file lock exclusivo — solo una instancia puede correr a la vez
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: swl:deuda-codigo
|
|
3
|
-
description: Cosecha los marcadores `simplificado:` del código (simplificaciones deliberadas con techo y trigger de upgrade) hacia un ledger visible, detecta marcadores sin trigger (riesgo de rot) y sincroniza opcionalmente con .planning/DEUDA-TECNICA.md. Cargar cuando el usuario pida "qué simplificamos", "deuda de código", "cosecha los marcadores", o tras una fase que dejó marcadores simplificado:.
|
|
4
|
-
allowed_tools: ["Grep", "Read", "Edit", "Bash"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /swl:deuda-codigo — Cosecha de simplificaciones deliberadas
|
|
8
|
-
|
|
9
|
-
Todo atajo intencional marcado con `simplificado: <techo>, <trigger>` (convención
|
|
10
|
-
de `Skill("prevencion-sobreingenieria")`, adaptada del patrón `ponytail:` de
|
|
11
|
-
ponytail, MIT) se cosecha aquí en un ledger — para que un "después" no se
|
|
12
|
-
convierta en "nunca" (regla `arreglar-al-detectar.md`).
|
|
13
|
-
|
|
14
|
-
## Uso
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
/swl:deuda-codigo — Reporte en pantalla (no escribe nada)
|
|
18
|
-
/swl:deuda-codigo --sync — Además sincroniza a .planning/DEUDA-TECNICA.md
|
|
19
|
-
/swl:deuda-codigo --owners — Agrega autor por marcador (git blame)
|
|
20
|
-
/swl:deuda-codigo <directorio> — Limita la cosecha a un subárbol
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Paso 1 — Cosechar los marcadores
|
|
24
|
-
|
|
25
|
-
Buscar con Grep (herramienta, no shell) el patrón sobre el árbol del proyecto,
|
|
26
|
-
excluyendo `node_modules`, `.git`, `dist`, `build`, `temp`, `respositorios-git`:
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
Grep(pattern: "(#|//|--|<!--|/\\*)\\s?simplificado:", output_mode: "content", -n: true)
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Cada hit es una fila del ledger. El prefijo de comentario evita capturar prosa
|
|
33
|
-
que solo menciona la convención (como este archivo o el SKILL.md).
|
|
34
|
-
|
|
35
|
-
## Paso 2 — Parsear techo y trigger
|
|
36
|
-
|
|
37
|
-
La convención es `simplificado: <techo>, <trigger de upgrade>`:
|
|
38
|
-
|
|
39
|
-
- **techo**: el límite conocido del atajo (lock global, O(n²), heurística naive).
|
|
40
|
-
- **trigger**: la condición observable que obliga el upgrade ("si throughput > X",
|
|
41
|
-
"cuando haya un segundo consumidor", "antes del primer deploy productivo").
|
|
42
|
-
|
|
43
|
-
Si el texto tras `simplificado:` no contiene una condición observable,
|
|
44
|
-
etiquetar la fila `sin-trigger` — esos son los que rotan en silencio.
|
|
45
|
-
|
|
46
|
-
## Paso 3 — Reporte
|
|
47
|
-
|
|
48
|
-
Una fila por marcador, agrupado por archivo:
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
## Ledger de simplificaciones — [fecha]
|
|
52
|
-
|
|
53
|
-
| Ubicación | Qué se simplificó | Techo | Trigger de upgrade | Estado |
|
|
54
|
-
|---|---|---|---|---|
|
|
55
|
-
| src/locks.py:42 | lock global | contención con N workers | throughput > 500 rps | ok |
|
|
56
|
-
| api/cache.js:17 | TTL fijo 5 min | staleness | (ninguno) | sin-trigger |
|
|
57
|
-
|
|
58
|
-
Total: N marcadores, M sin trigger.
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Con `--owners`: agregar columna con `git blame -L<línea>,<línea> --porcelain <archivo>`
|
|
62
|
-
(solo el autor, una llamada por fila).
|
|
63
|
-
|
|
64
|
-
Si no hay marcadores: `Sin deuda simplificado:. Ledger limpio.` — y terminar.
|
|
65
|
-
|
|
66
|
-
## Paso 4 — Sincronizar al ledger formal (solo con --sync)
|
|
67
|
-
|
|
68
|
-
Para cada marcador `sin-trigger` o de techo relevante que no exista ya en
|
|
69
|
-
`.planning/DEUDA-TECNICA.md`:
|
|
70
|
-
|
|
71
|
-
1. Leer el ledger actual y verificar duplicados por ubicación (`archivo:línea`).
|
|
72
|
-
2. Agregar entrada `### DT-SIMPLIFICADO-<n>` con: ubicación, techo, trigger
|
|
73
|
-
(o `PENDIENTE DE TRIGGER` marcado como acción requerida), fecha de cosecha.
|
|
74
|
-
3. Los `sin-trigger` NO se sincronizan como DT válidas hasta tener trigger:
|
|
75
|
-
reportarlos al usuario como acción inmediata — una DT sin trigger verificable
|
|
76
|
-
viola `arreglar-al-detectar.md § DT formal`.
|
|
77
|
-
|
|
78
|
-
NUNCA borrar ni editar los marcadores del código durante la cosecha: el
|
|
79
|
-
comando lee y reporta; el código solo cambia cuando el trigger se cumple y
|
|
80
|
-
el upgrade se implementa.
|
|
81
|
-
|
|
82
|
-
## Cuándo usarlo
|
|
83
|
-
|
|
84
|
-
- Cierre de fase (`/swl:verificar` lo puede invocar como pasada complementaria).
|
|
85
|
-
- Antes de un release: los `sin-trigger` son bloqueo blando (reportar en el gate).
|
|
86
|
-
- Auditorías de deuda: junto con la sección "Sobre-ingeniería" de `/swl:revisar`.
|
|
87
|
-
|
|
88
|
-
## Gotchas
|
|
89
|
-
|
|
90
|
-
- **Marcadores en fixtures o docs**: los hits dentro de `tests/fixtures/`,
|
|
91
|
-
ejemplos de skills o este propio comando son material de referencia, no deuda
|
|
92
|
-
— excluirlos del conteo y decir cuántos se excluyeron (sin caps silenciosos).
|
|
93
|
-
- **Prefijos de comentario por stack**: el patrón cubre `#` (Python/shell),
|
|
94
|
-
`//` (JS/TS/Go/Rust/C#/Java), `--` (SQL/Lua), `<!--` (HTML/MD) y `/*` (CSS/C).
|
|
95
|
-
Si el proyecto usa otro prefijo, agregarlo al patrón y decirlo en el reporte.
|
|
96
|
-
- **`git blame` sobre archivos renombrados**: usar `git blame -M -C` si el
|
|
97
|
-
autor aparece como el commit del rename.
|
|
1
|
+
---
|
|
2
|
+
name: swl:deuda-codigo
|
|
3
|
+
description: Cosecha los marcadores `simplificado:` del código (simplificaciones deliberadas con techo y trigger de upgrade) hacia un ledger visible, detecta marcadores sin trigger (riesgo de rot) y sincroniza opcionalmente con .planning/DEUDA-TECNICA.md. Cargar cuando el usuario pida "qué simplificamos", "deuda de código", "cosecha los marcadores", o tras una fase que dejó marcadores simplificado:.
|
|
4
|
+
allowed_tools: ["Grep", "Read", "Edit", "Bash"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:deuda-codigo — Cosecha de simplificaciones deliberadas
|
|
8
|
+
|
|
9
|
+
Todo atajo intencional marcado con `simplificado: <techo>, <trigger>` (convención
|
|
10
|
+
de `Skill("prevencion-sobreingenieria")`, adaptada del patrón `ponytail:` de
|
|
11
|
+
ponytail, MIT) se cosecha aquí en un ledger — para que un "después" no se
|
|
12
|
+
convierta en "nunca" (regla `arreglar-al-detectar.md`).
|
|
13
|
+
|
|
14
|
+
## Uso
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/swl:deuda-codigo — Reporte en pantalla (no escribe nada)
|
|
18
|
+
/swl:deuda-codigo --sync — Además sincroniza a .planning/DEUDA-TECNICA.md
|
|
19
|
+
/swl:deuda-codigo --owners — Agrega autor por marcador (git blame)
|
|
20
|
+
/swl:deuda-codigo <directorio> — Limita la cosecha a un subárbol
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Paso 1 — Cosechar los marcadores
|
|
24
|
+
|
|
25
|
+
Buscar con Grep (herramienta, no shell) el patrón sobre el árbol del proyecto,
|
|
26
|
+
excluyendo `node_modules`, `.git`, `dist`, `build`, `temp`, `respositorios-git`:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Grep(pattern: "(#|//|--|<!--|/\\*)\\s?simplificado:", output_mode: "content", -n: true)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Cada hit es una fila del ledger. El prefijo de comentario evita capturar prosa
|
|
33
|
+
que solo menciona la convención (como este archivo o el SKILL.md).
|
|
34
|
+
|
|
35
|
+
## Paso 2 — Parsear techo y trigger
|
|
36
|
+
|
|
37
|
+
La convención es `simplificado: <techo>, <trigger de upgrade>`:
|
|
38
|
+
|
|
39
|
+
- **techo**: el límite conocido del atajo (lock global, O(n²), heurística naive).
|
|
40
|
+
- **trigger**: la condición observable que obliga el upgrade ("si throughput > X",
|
|
41
|
+
"cuando haya un segundo consumidor", "antes del primer deploy productivo").
|
|
42
|
+
|
|
43
|
+
Si el texto tras `simplificado:` no contiene una condición observable,
|
|
44
|
+
etiquetar la fila `sin-trigger` — esos son los que rotan en silencio.
|
|
45
|
+
|
|
46
|
+
## Paso 3 — Reporte
|
|
47
|
+
|
|
48
|
+
Una fila por marcador, agrupado por archivo:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
## Ledger de simplificaciones — [fecha]
|
|
52
|
+
|
|
53
|
+
| Ubicación | Qué se simplificó | Techo | Trigger de upgrade | Estado |
|
|
54
|
+
|---|---|---|---|---|
|
|
55
|
+
| src/locks.py:42 | lock global | contención con N workers | throughput > 500 rps | ok |
|
|
56
|
+
| api/cache.js:17 | TTL fijo 5 min | staleness | (ninguno) | sin-trigger |
|
|
57
|
+
|
|
58
|
+
Total: N marcadores, M sin trigger.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Con `--owners`: agregar columna con `git blame -L<línea>,<línea> --porcelain <archivo>`
|
|
62
|
+
(solo el autor, una llamada por fila).
|
|
63
|
+
|
|
64
|
+
Si no hay marcadores: `Sin deuda simplificado:. Ledger limpio.` — y terminar.
|
|
65
|
+
|
|
66
|
+
## Paso 4 — Sincronizar al ledger formal (solo con --sync)
|
|
67
|
+
|
|
68
|
+
Para cada marcador `sin-trigger` o de techo relevante que no exista ya en
|
|
69
|
+
`.planning/DEUDA-TECNICA.md`:
|
|
70
|
+
|
|
71
|
+
1. Leer el ledger actual y verificar duplicados por ubicación (`archivo:línea`).
|
|
72
|
+
2. Agregar entrada `### DT-SIMPLIFICADO-<n>` con: ubicación, techo, trigger
|
|
73
|
+
(o `PENDIENTE DE TRIGGER` marcado como acción requerida), fecha de cosecha.
|
|
74
|
+
3. Los `sin-trigger` NO se sincronizan como DT válidas hasta tener trigger:
|
|
75
|
+
reportarlos al usuario como acción inmediata — una DT sin trigger verificable
|
|
76
|
+
viola `arreglar-al-detectar.md § DT formal`.
|
|
77
|
+
|
|
78
|
+
NUNCA borrar ni editar los marcadores del código durante la cosecha: el
|
|
79
|
+
comando lee y reporta; el código solo cambia cuando el trigger se cumple y
|
|
80
|
+
el upgrade se implementa.
|
|
81
|
+
|
|
82
|
+
## Cuándo usarlo
|
|
83
|
+
|
|
84
|
+
- Cierre de fase (`/swl:verificar` lo puede invocar como pasada complementaria).
|
|
85
|
+
- Antes de un release: los `sin-trigger` son bloqueo blando (reportar en el gate).
|
|
86
|
+
- Auditorías de deuda: junto con la sección "Sobre-ingeniería" de `/swl:revisar`.
|
|
87
|
+
|
|
88
|
+
## Gotchas
|
|
89
|
+
|
|
90
|
+
- **Marcadores en fixtures o docs**: los hits dentro de `tests/fixtures/`,
|
|
91
|
+
ejemplos de skills o este propio comando son material de referencia, no deuda
|
|
92
|
+
— excluirlos del conteo y decir cuántos se excluyeron (sin caps silenciosos).
|
|
93
|
+
- **Prefijos de comentario por stack**: el patrón cubre `#` (Python/shell),
|
|
94
|
+
`//` (JS/TS/Go/Rust/C#/Java), `--` (SQL/Lua), `<!--` (HTML/MD) y `/*` (CSS/C).
|
|
95
|
+
Si el proyecto usa otro prefijo, agregarlo al patrón y decirlo en el reporte.
|
|
96
|
+
- **`git blame` sobre archivos renombrados**: usar `git blame -M -C` si el
|
|
97
|
+
autor aparece como el commit del rename.
|