@saulwade/swl-ses 2.6.0 → 2.6.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 +197 -197
- package/README.md +600 -600
- package/agentes/_intent-spec.md +73 -73
- package/agentes/_propose-step.md +90 -90
- package/agentes/accesibilidad-wcag-swl.md +690 -690
- package/agentes/arquitecto-swl.md +267 -267
- package/agentes/auto-evolucion-swl.md +932 -932
- 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-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/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/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- 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/observabilidad-swl.md +438 -438
- 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 +218 -218
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/revisor-angular-swl.md +278 -278
- 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/tdd-qa-swl.md +393 -393
- package/comandos/swl/actualizar.md +174 -174
- package/comandos/swl/adoptar-proyecto.md +265 -265
- package/comandos/swl/aprender.md +836 -836
- 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/discutir-fase.md +169 -169
- package/comandos/swl/ejecutar-fase.md +233 -233
- package/comandos/swl/evaluar-skill.md +520 -520
- package/comandos/swl/evolucion-continua.md +73 -73
- package/comandos/swl/evolucionar.md +267 -267
- 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 +345 -345
- package/comandos/swl/verificar.md +817 -817
- package/comandos/swl/wiki.md +620 -620
- package/gateway/cron/jobs.example.json +12 -12
- package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -294
- package/habilidades/backend-async-postgres-testing/SKILL.md +2 -1
- package/habilidades/changelog-generator/SKILL.md +174 -174
- package/habilidades/compactacion-contexto/SKILL.md +2 -1
- package/habilidades/contenedores-docker/SKILL.md +4 -2
- package/habilidades/doubt-driven-review/SKILL.md +207 -207
- package/habilidades/drift-detection/SKILL.md +1 -1
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/extractor-de-aprendizajes/SKILL.md +8 -2
- package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
- package/habilidades/harness-claude-code/SKILL.md +314 -314
- package/habilidades/instalar-sistema/SKILL.md +227 -227
- package/habilidades/planear-fase/SKILL.md +358 -358
- package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
- package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
- package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -147
- package/habilidades/release-semver/SKILL.md +2 -2
- package/habilidades/tdd-workflow/SKILL.md +749 -749
- package/hooks/agente-lifecycle.js +1 -1
- package/hooks/audit-trail.js +1 -1
- package/hooks/auto-consolidacion.js +1 -1
- package/hooks/captura-acciones-post.js +1 -1
- package/hooks/captura-acciones-session.js +1 -1
- package/hooks/captura-feedback-usuario.js +1 -1
- package/hooks/contexto-iteracion.js +1 -1
- package/hooks/contexto-subagente.js +68 -68
- package/hooks/degradacion-instintos.js +1 -1
- package/hooks/grafo-contexto.js +1 -1
- package/hooks/guardrail-modelo.js +1 -1
- package/hooks/inbox-aviso.js +1 -1
- package/hooks/inyeccion-contexto.js +1 -1
- package/hooks/lib/agent-matcher.js +1 -1
- package/hooks/lib/agent-routing.js +1 -1
- package/hooks/lib/captura-acciones.js +1 -1
- package/hooks/lib/etapa-metricas.js +1 -1
- package/hooks/lib/evolution-tracker.js +1 -1
- package/hooks/lib/gateway-notify.js +193 -193
- package/hooks/lib/mcp-health.js +1 -1
- package/hooks/lib/notificacion-formato.js +58 -0
- package/hooks/lib/nudge-tracker.js +1 -1
- package/hooks/lib/otlp-exporter.js +1 -1
- package/hooks/lib/propose-step.js +1 -1
- package/hooks/lib/raiz-proyecto.js +127 -102
- package/hooks/lib/run-log.js +1 -1
- package/hooks/lib/singleton-guard.js +20 -13
- package/hooks/lib/telegram-cliente.js +11 -3
- package/hooks/notificacion-telegram.js +13 -3
- package/hooks/preservar-estado-pre-compact.js +1 -1
- package/hooks/registro-turnos.js +1 -1
- package/hooks/resumen-sesion.js +1 -1
- package/hooks/risk-scoring.js +1 -1
- package/hooks/session-briefing.js +1 -1
- package/hooks/spec-gate.js +1 -1
- package/hooks/sugerir-regenerar-inventario.js +1 -1
- package/hooks/tdd-gate.js +1 -1
- package/hooks/telemetria-agentes.js +1 -1
- package/hooks/telemetria-skill-routing.js +1 -1
- package/hooks/tracking-costos.js +1 -1
- package/hooks/validar-formato-post-subagente.js +1 -1
- package/hooks/validar-intent-spec.js +1 -1
- package/hooks/validar-planning-paths.js +1 -1
- package/llms.txt +29 -29
- package/manifiestos/canonical-hashes.json +5588 -5257
- package/manifiestos/hooks-config.json +469 -469
- package/manifiestos/invariantes-criticos.json +30 -30
- package/manifiestos/modulos.json +1429 -1428
- package/manifiestos/skills-lock.json +1275 -1275
- package/package.json +94 -94
- package/plugin.json +369 -369
- package/scripts/auditar-clases-conocidas.js +134 -134
- package/scripts/bootstrap-instintos.js +85 -14
- package/scripts/canario-hooks.js +166 -166
- package/scripts/cli/autonomia.js +23 -23
- package/scripts/cli/benchmark-memoria.js +37 -37
- package/scripts/cli/ciclo-autonomo.js +73 -73
- package/scripts/cli/ciclo-fase-b.js +102 -102
- package/scripts/cli/guardrail-metrics.js +39 -39
- package/scripts/cli/memoria-search.js +69 -69
- package/scripts/cli/nudge-accionar.js +39 -39
- package/scripts/cli/run-eval.js +38 -38
- package/scripts/doctor.js +26 -3
- package/scripts/evidencia-valor.js +101 -101
- package/scripts/field-report.js +16 -16
- package/scripts/instalador.js +13 -0
- package/scripts/lib/activar-hooks-proyecto.js +116 -116
- package/scripts/lib/ciclo-autonomo/candidatos.js +174 -174
- package/scripts/lib/ciclo-autonomo/config.js +165 -165
- package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -174
- package/scripts/lib/ciclo-autonomo/fallback.js +77 -77
- package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -139
- package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -112
- package/scripts/lib/ciclo-autonomo/index.js +301 -301
- package/scripts/lib/ciclo-autonomo/lock.js +124 -124
- package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -122
- package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -240
- package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -248
- package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -190
- package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -535
- package/scripts/lib/evidencia-valor.js +228 -228
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/limpiar-basura-global.js +161 -0
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/tui/pantallas/install-wizard.js +403 -403
- package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +0 -53
- package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +0 -372
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
|