@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.
Files changed (183) hide show
  1. package/CLAUDE.md +194 -192
  2. package/README.md +600 -600
  3. package/agentes/auto-evolucion-swl.md +27 -3
  4. package/bin/swl-ses.js +32 -6
  5. package/comandos/swl/actualizar.md +174 -174
  6. package/comandos/swl/adoptar-proyecto.md +265 -265
  7. package/comandos/swl/aprender.md +836 -823
  8. package/comandos/swl/aprobar-plan.md +146 -146
  9. package/comandos/swl/auditar-deps.md +134 -134
  10. package/comandos/swl/autoresearch.md +264 -264
  11. package/comandos/swl/ayuda.md +224 -224
  12. package/comandos/swl/brainstorm.md +51 -51
  13. package/comandos/swl/briefing.md +119 -119
  14. package/comandos/swl/checkpoint.md +325 -325
  15. package/comandos/swl/claudemd.md +234 -234
  16. package/comandos/swl/compactar.md +310 -310
  17. package/comandos/swl/configurar-ci.md +235 -235
  18. package/comandos/swl/contexto.md +110 -110
  19. package/comandos/swl/contribuir.md +233 -233
  20. package/comandos/swl/crear-skill.md +292 -292
  21. package/comandos/swl/cron.md +194 -194
  22. package/comandos/swl/deuda-codigo.md +97 -97
  23. package/comandos/swl/discutir-fase.md +169 -169
  24. package/comandos/swl/ejecutar-fase.md +233 -233
  25. package/comandos/swl/evaluar-skill.md +520 -505
  26. package/comandos/swl/evolucion-continua.md +73 -0
  27. package/comandos/swl/evolucionar.md +267 -254
  28. package/comandos/swl/exportar-vault.md +583 -583
  29. package/comandos/swl/fix.md +118 -118
  30. package/comandos/swl/gateway.md +158 -158
  31. package/comandos/swl/inbox.md +116 -116
  32. package/comandos/swl/instalar.md +220 -220
  33. package/comandos/swl/instintos.md +86 -86
  34. package/comandos/swl/mapear-codebase.md +312 -312
  35. package/comandos/swl/mcp-status.md +175 -175
  36. package/comandos/swl/modelo.md +100 -100
  37. package/comandos/swl/nemesis.md +433 -433
  38. package/comandos/swl/notificaciones.md +299 -299
  39. package/comandos/swl/nuevo-proyecto.md +251 -251
  40. package/comandos/swl/planear-fase.md +263 -263
  41. package/comandos/swl/plugins.md +256 -256
  42. package/comandos/swl/predecir.md +169 -169
  43. package/comandos/swl/reflect-skills.md +125 -125
  44. package/comandos/swl/release.md +450 -450
  45. package/comandos/swl/revisar-impacto.md +201 -201
  46. package/comandos/swl/revisar.md +330 -330
  47. package/comandos/swl/seguridad.md +189 -189
  48. package/comandos/swl/sesiones.md +200 -200
  49. package/comandos/swl/skill-search.md +113 -113
  50. package/comandos/swl/status.md +343 -343
  51. package/comandos/swl/verificar.md +817 -817
  52. package/comandos/swl/wiki.md +620 -620
  53. package/gateway/cron/jobs.example.json +12 -0
  54. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -276
  55. package/habilidades/autoresearch/SKILL.md +3 -2
  56. package/habilidades/benchmark-memoria/SKILL.md +7 -7
  57. package/habilidades/changelog-generator/SKILL.md +174 -174
  58. package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
  59. package/habilidades/checkpoints-verificacion/SKILL.md +6 -0
  60. package/habilidades/context-builder/SKILL.md +4 -0
  61. package/habilidades/doubt-driven-review/SKILL.md +207 -191
  62. package/habilidades/drift-detection/SKILL.md +6 -1
  63. package/habilidades/ejecutar-fase/SKILL.md +6 -6
  64. package/habilidades/eval-framework/SKILL.md +8 -3
  65. package/habilidades/harness-claude-code/SKILL.md +314 -308
  66. package/habilidades/infra-github-actions/SKILL.md +4 -3
  67. package/habilidades/instalar-sistema/SKILL.md +227 -223
  68. package/habilidades/memoria-busqueda/SKILL.md +31 -39
  69. package/habilidades/planear-fase/SKILL.md +358 -350
  70. package/habilidades/proceso-ddia-fundamentos/SKILL.md +3 -2
  71. package/habilidades/release-semver/SKILL.md +4 -2
  72. package/habilidades/swl-claudemd/SKILL.md +6 -7
  73. package/habilidades/swl-dashboard/SKILL.md +11 -43
  74. package/habilidades/tdd-workflow/SKILL.md +749 -744
  75. package/habilidades/validacion-ci-sistema/SKILL.md +1 -1
  76. package/hooks/agente-lifecycle.js +2 -1
  77. package/hooks/aiisms-detector.js +13 -4
  78. package/hooks/audit-trail.js +2 -1
  79. package/hooks/auto-consolidacion.js +2 -1
  80. package/hooks/captura-acciones-post.js +2 -1
  81. package/hooks/captura-acciones-session.js +2 -1
  82. package/hooks/captura-feedback-usuario.js +3 -2
  83. package/hooks/claudemd-bloat-detector.js +12 -3
  84. package/hooks/claudemd-duplicacion-detector.js +13 -3
  85. package/hooks/contexto-iteracion.js +2 -1
  86. package/hooks/degradacion-instintos.js +2 -1
  87. package/hooks/extraccion-aprendizajes.js +109 -15
  88. package/hooks/grafo-contexto.js +2 -1
  89. package/hooks/guardrail-modelo.js +2 -1
  90. package/hooks/inbox-aviso.js +2 -1
  91. package/hooks/inyeccion-contexto.js +2 -1
  92. package/hooks/lib/agent-matcher.js +2 -1
  93. package/hooks/lib/agent-routing.js +2 -1
  94. package/hooks/lib/autonomia.js +5 -3
  95. package/hooks/lib/captura-acciones.js +2 -1
  96. package/hooks/lib/consolidation-lock.js +21 -10
  97. package/hooks/lib/etapa-auto-evolucion.js +10 -4
  98. package/hooks/lib/etapa-metricas.js +2 -1
  99. package/hooks/lib/etapa-perfil-usuario.js +20 -4
  100. package/hooks/lib/evolution-tracker.js +2 -1
  101. package/hooks/lib/gateway-notify.js +193 -179
  102. package/hooks/lib/loop-telemetry.js +5 -4
  103. package/hooks/lib/mcp-health.js +2 -1
  104. package/hooks/lib/memory-search.js +4 -0
  105. package/hooks/lib/merkle-audit.js +58 -6
  106. package/hooks/lib/nudge-tracker.js +2 -1
  107. package/hooks/lib/otlp-exporter.js +2 -1
  108. package/hooks/lib/propose-step.js +3 -2
  109. package/hooks/lib/raiz-proyecto.js +102 -0
  110. package/hooks/lib/run-log.js +2 -1
  111. package/hooks/lib/singleton-guard.js +218 -27
  112. package/hooks/lib/telegram-cliente.js +17 -8
  113. package/hooks/preservar-estado-pre-compact.js +2 -1
  114. package/hooks/proteccion-rutas.js +59 -3
  115. package/hooks/registro-turnos.js +2 -1
  116. package/hooks/resumen-sesion.js +2 -1
  117. package/hooks/risk-scoring.js +2 -1
  118. package/hooks/rotar-audit-auto.js +46 -20
  119. package/hooks/session-briefing.js +127 -1
  120. package/hooks/spec-gate.js +2 -1
  121. package/hooks/sugerir-contribuir.js +6 -3
  122. package/hooks/sugerir-regenerar-inventario.js +3 -2
  123. package/hooks/tdd-gate.js +2 -1
  124. package/hooks/telemetria-agentes.js +2 -1
  125. package/hooks/telemetria-skill-routing.js +2 -1
  126. package/hooks/tracking-costos.js +4 -3
  127. package/hooks/validar-formato-post-subagente.js +2 -1
  128. package/hooks/validar-intent-spec.js +2 -1
  129. package/hooks/validar-memoria-hook.js +13 -3
  130. package/hooks/validar-planning-paths.js +2 -1
  131. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +53 -0
  132. package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +372 -0
  133. package/instintos/perfil-usuario.yaml +506 -3
  134. package/instintos/proyecto.yaml +78 -0
  135. package/llms.txt +2 -2
  136. package/manifiestos/canonical-hashes.json +664 -2
  137. package/manifiestos/modulos.json +19 -14
  138. package/manifiestos/planning-paths.json +1 -0
  139. package/manifiestos/skills-lock.json +53 -53
  140. package/package.json +2 -3
  141. package/plugin.json +2 -2
  142. package/scripts/actualizar.js +3 -0
  143. package/scripts/auditar-clases-conocidas.js +32 -4
  144. package/scripts/benchmark-memoria.js +1 -0
  145. package/scripts/cli/autonomia.js +23 -0
  146. package/scripts/cli/benchmark-memoria.js +37 -0
  147. package/scripts/cli/ciclo-autonomo.js +73 -0
  148. package/scripts/cli/ciclo-fase-b.js +102 -0
  149. package/scripts/cli/guardrail-metrics.js +39 -0
  150. package/scripts/cli/loop-telemetry.js +4 -2
  151. package/scripts/cli/memoria-search.js +69 -0
  152. package/scripts/cli/nudge-accionar.js +39 -0
  153. package/scripts/cli/run-eval.js +38 -0
  154. package/scripts/cli/run-skill-evals.js +13 -2
  155. package/scripts/derivar-feature-list.js +15 -14
  156. package/scripts/desinstalar.js +11 -0
  157. package/scripts/doctor.js +24 -10
  158. package/scripts/instalador.js +106 -7
  159. package/scripts/lib/activar-hooks-proyecto.js +116 -0
  160. package/scripts/lib/auditar-invocaciones-comandos.js +96 -6
  161. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -0
  162. package/scripts/lib/ciclo-autonomo/config.js +165 -0
  163. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -0
  164. package/scripts/lib/ciclo-autonomo/fallback.js +77 -0
  165. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -0
  166. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -0
  167. package/scripts/lib/ciclo-autonomo/index.js +301 -0
  168. package/scripts/lib/ciclo-autonomo/lock.js +124 -0
  169. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -0
  170. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -0
  171. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -0
  172. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -0
  173. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -0
  174. package/scripts/lib/estado.js +9 -0
  175. package/scripts/lib/evidencia-valor.js +1 -1
  176. package/scripts/lib/gitignore-manifest.js +8 -1
  177. package/scripts/lib/hooks-settings.js +45 -0
  178. package/scripts/rotar-audit-logs.js +48 -2
  179. package/scripts/run-eval.js +1 -0
  180. package/scripts/run-skill-evals.js +287 -8
  181. package/scripts/smoke-test.js +16 -8
  182. package/scripts/tui/pantallas/install-wizard.js +403 -347
  183. package/scripts/validar.js +40 -1
@@ -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.