@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.
Files changed (207) hide show
  1. package/CLAUDE.md +197 -197
  2. package/README.md +600 -600
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/accesibilidad-wcag-swl.md +690 -690
  6. package/agentes/arquitecto-swl.md +267 -267
  7. package/agentes/auto-evolucion-swl.md +932 -932
  8. package/agentes/backend-csharp-swl.md +420 -420
  9. package/agentes/backend-go-swl.md +390 -390
  10. package/agentes/backend-java-swl.md +281 -281
  11. package/agentes/backend-rust-swl.md +364 -364
  12. package/agentes/backend-workers-swl.md +482 -482
  13. package/agentes/cloud-infra-swl.md +509 -509
  14. package/agentes/consolidador-swl.md +541 -541
  15. package/agentes/depurador-swl.md +352 -352
  16. package/agentes/devops-ci-swl.md +400 -400
  17. package/agentes/disenador-ui-swl.md +569 -569
  18. package/agentes/documentador-swl.md +345 -345
  19. package/agentes/frontend-angular-swl.md +621 -621
  20. package/agentes/frontend-css-swl.md +716 -716
  21. package/agentes/frontend-react-swl.md +692 -692
  22. package/agentes/frontend-swl.md +496 -496
  23. package/agentes/frontend-tailwind-swl.md +826 -826
  24. package/agentes/investigador-swl.md +432 -432
  25. package/agentes/investigador-ux-swl.md +505 -505
  26. package/agentes/migrador-swl.md +442 -442
  27. package/agentes/mobile-android-swl.md +511 -511
  28. package/agentes/mobile-cross-swl.md +541 -541
  29. package/agentes/mobile-ios-swl.md +502 -502
  30. package/agentes/mobile-testing-swl.md +302 -302
  31. package/agentes/nemesis-auditor-swl.md +285 -285
  32. package/agentes/observabilidad-swl.md +438 -438
  33. package/agentes/pagos-swl.md +310 -310
  34. package/agentes/perfilador-usuario-swl.md +321 -321
  35. package/agentes/planificador-swl.md +399 -399
  36. package/agentes/producto-prd-swl.md +589 -589
  37. package/agentes/red-team-swl.md +218 -218
  38. package/agentes/release-manager-swl.md +590 -590
  39. package/agentes/rendimiento-swl.md +713 -713
  40. package/agentes/revisor-angular-swl.md +278 -278
  41. package/agentes/revisor-csharp-swl.md +264 -264
  42. package/agentes/revisor-go-swl.md +259 -259
  43. package/agentes/revisor-java-swl.md +257 -257
  44. package/agentes/revisor-kotlin-swl.md +273 -273
  45. package/agentes/revisor-nextjs-swl.md +281 -281
  46. package/agentes/revisor-php-swl.md +271 -271
  47. package/agentes/revisor-react-swl.md +278 -278
  48. package/agentes/revisor-rust-swl.md +346 -346
  49. package/agentes/revisor-seguridad-swl.md +399 -399
  50. package/agentes/revisor-swift-swl.md +268 -268
  51. package/agentes/revisor-typescript-swl.md +346 -346
  52. package/agentes/tdd-qa-swl.md +393 -393
  53. package/comandos/swl/actualizar.md +174 -174
  54. package/comandos/swl/adoptar-proyecto.md +265 -265
  55. package/comandos/swl/aprender.md +836 -836
  56. package/comandos/swl/aprobar-plan.md +146 -146
  57. package/comandos/swl/auditar-deps.md +134 -134
  58. package/comandos/swl/autoresearch.md +264 -264
  59. package/comandos/swl/ayuda.md +224 -224
  60. package/comandos/swl/brainstorm.md +51 -51
  61. package/comandos/swl/briefing.md +119 -119
  62. package/comandos/swl/checkpoint.md +325 -325
  63. package/comandos/swl/claudemd.md +234 -234
  64. package/comandos/swl/compactar.md +310 -310
  65. package/comandos/swl/configurar-ci.md +235 -235
  66. package/comandos/swl/contexto.md +110 -110
  67. package/comandos/swl/contribuir.md +233 -233
  68. package/comandos/swl/crear-skill.md +292 -292
  69. package/comandos/swl/cron.md +194 -194
  70. package/comandos/swl/discutir-fase.md +169 -169
  71. package/comandos/swl/ejecutar-fase.md +233 -233
  72. package/comandos/swl/evaluar-skill.md +520 -520
  73. package/comandos/swl/evolucion-continua.md +73 -73
  74. package/comandos/swl/evolucionar.md +267 -267
  75. package/comandos/swl/exportar-vault.md +583 -583
  76. package/comandos/swl/fix.md +118 -118
  77. package/comandos/swl/gateway.md +158 -158
  78. package/comandos/swl/inbox.md +116 -116
  79. package/comandos/swl/instalar.md +220 -220
  80. package/comandos/swl/instintos.md +86 -86
  81. package/comandos/swl/mapear-codebase.md +312 -312
  82. package/comandos/swl/mcp-status.md +175 -175
  83. package/comandos/swl/modelo.md +100 -100
  84. package/comandos/swl/nemesis.md +433 -433
  85. package/comandos/swl/notificaciones.md +299 -299
  86. package/comandos/swl/nuevo-proyecto.md +251 -251
  87. package/comandos/swl/planear-fase.md +263 -263
  88. package/comandos/swl/plugins.md +256 -256
  89. package/comandos/swl/predecir.md +169 -169
  90. package/comandos/swl/reflect-skills.md +125 -125
  91. package/comandos/swl/release.md +450 -450
  92. package/comandos/swl/revisar-impacto.md +201 -201
  93. package/comandos/swl/revisar.md +330 -330
  94. package/comandos/swl/seguridad.md +189 -189
  95. package/comandos/swl/sesiones.md +200 -200
  96. package/comandos/swl/skill-search.md +113 -113
  97. package/comandos/swl/status.md +345 -345
  98. package/comandos/swl/verificar.md +817 -817
  99. package/comandos/swl/wiki.md +620 -620
  100. package/gateway/cron/jobs.example.json +12 -12
  101. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -294
  102. package/habilidades/backend-async-postgres-testing/SKILL.md +2 -1
  103. package/habilidades/changelog-generator/SKILL.md +174 -174
  104. package/habilidades/compactacion-contexto/SKILL.md +2 -1
  105. package/habilidades/contenedores-docker/SKILL.md +4 -2
  106. package/habilidades/doubt-driven-review/SKILL.md +207 -207
  107. package/habilidades/drift-detection/SKILL.md +1 -1
  108. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  109. package/habilidades/extractor-de-aprendizajes/SKILL.md +8 -2
  110. package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
  111. package/habilidades/harness-claude-code/SKILL.md +314 -314
  112. package/habilidades/instalar-sistema/SKILL.md +227 -227
  113. package/habilidades/planear-fase/SKILL.md +358 -358
  114. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  115. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  116. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -147
  117. package/habilidades/release-semver/SKILL.md +2 -2
  118. package/habilidades/tdd-workflow/SKILL.md +749 -749
  119. package/hooks/agente-lifecycle.js +1 -1
  120. package/hooks/audit-trail.js +1 -1
  121. package/hooks/auto-consolidacion.js +1 -1
  122. package/hooks/captura-acciones-post.js +1 -1
  123. package/hooks/captura-acciones-session.js +1 -1
  124. package/hooks/captura-feedback-usuario.js +1 -1
  125. package/hooks/contexto-iteracion.js +1 -1
  126. package/hooks/contexto-subagente.js +68 -68
  127. package/hooks/degradacion-instintos.js +1 -1
  128. package/hooks/grafo-contexto.js +1 -1
  129. package/hooks/guardrail-modelo.js +1 -1
  130. package/hooks/inbox-aviso.js +1 -1
  131. package/hooks/inyeccion-contexto.js +1 -1
  132. package/hooks/lib/agent-matcher.js +1 -1
  133. package/hooks/lib/agent-routing.js +1 -1
  134. package/hooks/lib/captura-acciones.js +1 -1
  135. package/hooks/lib/etapa-metricas.js +1 -1
  136. package/hooks/lib/evolution-tracker.js +1 -1
  137. package/hooks/lib/gateway-notify.js +193 -193
  138. package/hooks/lib/mcp-health.js +1 -1
  139. package/hooks/lib/notificacion-formato.js +58 -0
  140. package/hooks/lib/nudge-tracker.js +1 -1
  141. package/hooks/lib/otlp-exporter.js +1 -1
  142. package/hooks/lib/propose-step.js +1 -1
  143. package/hooks/lib/raiz-proyecto.js +127 -102
  144. package/hooks/lib/run-log.js +1 -1
  145. package/hooks/lib/singleton-guard.js +20 -13
  146. package/hooks/lib/telegram-cliente.js +11 -3
  147. package/hooks/notificacion-telegram.js +13 -3
  148. package/hooks/preservar-estado-pre-compact.js +1 -1
  149. package/hooks/registro-turnos.js +1 -1
  150. package/hooks/resumen-sesion.js +1 -1
  151. package/hooks/risk-scoring.js +1 -1
  152. package/hooks/session-briefing.js +1 -1
  153. package/hooks/spec-gate.js +1 -1
  154. package/hooks/sugerir-regenerar-inventario.js +1 -1
  155. package/hooks/tdd-gate.js +1 -1
  156. package/hooks/telemetria-agentes.js +1 -1
  157. package/hooks/telemetria-skill-routing.js +1 -1
  158. package/hooks/tracking-costos.js +1 -1
  159. package/hooks/validar-formato-post-subagente.js +1 -1
  160. package/hooks/validar-intent-spec.js +1 -1
  161. package/hooks/validar-planning-paths.js +1 -1
  162. package/llms.txt +29 -29
  163. package/manifiestos/canonical-hashes.json +5588 -5257
  164. package/manifiestos/hooks-config.json +469 -469
  165. package/manifiestos/invariantes-criticos.json +30 -30
  166. package/manifiestos/modulos.json +1429 -1428
  167. package/manifiestos/skills-lock.json +1275 -1275
  168. package/package.json +94 -94
  169. package/plugin.json +369 -369
  170. package/scripts/auditar-clases-conocidas.js +134 -134
  171. package/scripts/bootstrap-instintos.js +85 -14
  172. package/scripts/canario-hooks.js +166 -166
  173. package/scripts/cli/autonomia.js +23 -23
  174. package/scripts/cli/benchmark-memoria.js +37 -37
  175. package/scripts/cli/ciclo-autonomo.js +73 -73
  176. package/scripts/cli/ciclo-fase-b.js +102 -102
  177. package/scripts/cli/guardrail-metrics.js +39 -39
  178. package/scripts/cli/memoria-search.js +69 -69
  179. package/scripts/cli/nudge-accionar.js +39 -39
  180. package/scripts/cli/run-eval.js +38 -38
  181. package/scripts/doctor.js +26 -3
  182. package/scripts/evidencia-valor.js +101 -101
  183. package/scripts/field-report.js +16 -16
  184. package/scripts/instalador.js +13 -0
  185. package/scripts/lib/activar-hooks-proyecto.js +116 -116
  186. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -174
  187. package/scripts/lib/ciclo-autonomo/config.js +165 -165
  188. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -174
  189. package/scripts/lib/ciclo-autonomo/fallback.js +77 -77
  190. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -139
  191. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -112
  192. package/scripts/lib/ciclo-autonomo/index.js +301 -301
  193. package/scripts/lib/ciclo-autonomo/lock.js +124 -124
  194. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -122
  195. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -240
  196. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -248
  197. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -190
  198. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -535
  199. package/scripts/lib/evidencia-valor.js +228 -228
  200. package/scripts/lib/expandir-targets.js +71 -71
  201. package/scripts/lib/limpiar-basura-global.js +161 -0
  202. package/scripts/lib/toml-merge.js +204 -204
  203. package/scripts/mcp-server/auth.js +105 -105
  204. package/scripts/mcp-server/cache.js +106 -106
  205. package/scripts/tui/pantallas/install-wizard.js +403 -403
  206. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +0 -53
  207. package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +0 -372
@@ -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