@saulwade/swl-ses 1.7.3 → 1.8.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 (62) hide show
  1. package/CLAUDE.md +196 -196
  2. package/README.md +578 -578
  3. package/agentes/auto-evolucion-swl.md +7 -7
  4. package/agentes/disenador-ui-swl.md +12 -0
  5. package/agentes/investigador-ux-swl.md +9 -0
  6. package/agentes/perfilador-usuario-swl.md +2 -2
  7. package/agentes/ux-disenador-swl.md +6 -0
  8. package/comandos/swl/evaluar-skill.md +1 -1
  9. package/comandos/swl/evolucion-estado.md +5 -5
  10. package/comandos/swl/evolucionar.md +2 -2
  11. package/comandos/swl/inbox.md +1 -1
  12. package/comandos/swl/reflect-skills.md +2 -2
  13. package/comandos/swl/salud.md +1 -1
  14. package/habilidades/ai-runtime-security/SKILL.md +2 -2
  15. package/habilidades/auto-evolucion-protocolo/SKILL.md +2 -2
  16. package/habilidades/benchmark-memoria/SKILL.md +2 -2
  17. package/habilidades/drift-detection/SKILL.md +3 -3
  18. package/habilidades/eval-framework/SKILL.md +1 -1
  19. package/habilidades/guardrail-semantico/SKILL.md +4 -4
  20. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  21. package/habilidades/swl-claudemd/SKILL.md +2 -2
  22. package/habilidades/testing-python/SKILL.md +1 -1
  23. package/habilidades/tracing-processor/SKILL.md +1 -1
  24. package/hooks/actualizar-perfil-usuario.js +2 -2
  25. package/hooks/aiisms-detector.js +2 -2
  26. package/hooks/auto-evolucion.js +1 -1
  27. package/hooks/captura-feedback-usuario.js +2 -2
  28. package/hooks/claudemd-bloat-detector.js +2 -2
  29. package/hooks/claudemd-duplicacion-detector.js +1 -1
  30. package/hooks/guardrail-modelo.js +2 -2
  31. package/hooks/lib/memory-search.js +1 -1
  32. package/hooks/lib/nudge-tracker.js +1 -1
  33. package/hooks/metricas-evolucion.js +3 -3
  34. package/hooks/rotar-audit-auto.js +2 -2
  35. package/hooks/validar-formato-post-subagente.js +2 -2
  36. package/hooks/validar-intent-spec.js +1 -1
  37. package/hooks/validar-planning-paths.js +134 -0
  38. package/manifiestos/hooks-config.json +20 -11
  39. package/manifiestos/modulos.json +1352 -1351
  40. package/manifiestos/planning-paths.json +44 -0
  41. package/manifiestos/skills-lock.json +13 -13
  42. package/package.json +92 -92
  43. package/plugin.json +372 -372
  44. package/reglas/gobernanza.md +1 -1
  45. package/reglas/harness-claude-code.md +39 -0
  46. package/reglas/memoria-consolidada.md +7 -7
  47. package/reglas/sin-duplicacion-reglas-globales.md +1 -1
  48. package/scripts/auditar-agentes-gaps.js +1 -1
  49. package/scripts/auditar-cobertura-frameworks.js +2 -2
  50. package/scripts/auditar-skills-gaps.js +2 -2
  51. package/scripts/benchmark-memoria.js +3 -3
  52. package/scripts/inferir-herramientas-permitidas.js +1 -1
  53. package/scripts/instalador.js +48 -0
  54. package/scripts/lib/dashboard-widgets.js +3 -3
  55. package/scripts/lib/drift-detector.js +3 -3
  56. package/scripts/lib/eval-metrics-store.js +3 -3
  57. package/scripts/lib/gitignore-manifest.js +3 -3
  58. package/scripts/mcp-server/README.md +1 -1
  59. package/scripts/mcp-server/telemetry.js +2 -2
  60. package/scripts/reflect-skills.js +4 -4
  61. package/scripts/rotar-audit-logs.js +2 -2
  62. package/scripts/run-skill-evals.js +2 -2
@@ -40,7 +40,7 @@ Los skills generados por `auto-evolucion-swl` o `/swl:evolucionar`:
40
40
  `agentes/auto-evolucion-swl.md` sección "Gate G8". Origen ADR 0013
41
41
  sección 3C.
42
42
  - La promoción se registra en `.planning/AUDITORIA.md` con justificación
43
- Y en `.planning/evolucion/evoluciones.jsonl` con evento
43
+ Y en `.planning/evolution/evoluciones.jsonl` con evento
44
44
  `tipo: "promocion-skill"` y `score`.
45
45
 
46
46
  ### Reglas nuevas obligatorias
@@ -101,6 +101,45 @@ con uso constante de tools mantiene el prefijo caliente indefinidamente
101
101
  - Cambiar de modelo a media sesión invalida el cache (regla de cache
102
102
  discipline arriba). Si necesitas otro modelo, abre nueva sesión.
103
103
 
104
+ ### Knobs nativos para sub-agentes y teams (env vars del harness)
105
+
106
+ Claude Code expone variables de entorno que controlan el routing de
107
+ modelos y el costo de sesiones con múltiples agentes. Son del **harness
108
+ Anthropic**, no de swl-ses — complementan, no reemplazan, el Model-Tier
109
+ por frontmatter (`model:` en cada agente) ni el `budget-enforcer.js`.
110
+
111
+ ```bash
112
+ # Forzar el modelo de TODOS los sub-agentes/teammates a uno más barato.
113
+ # Útil en sesiones ad-hoc donde no quieres routing granular por agente.
114
+ # El líder mantiene el modelo de la sesión (Opus); los teammates bajan a Sonnet.
115
+ export CLAUDE_CODE_SUBAGENT_MODEL="claude-sonnet-4-6"
116
+
117
+ # Habilitar Agent Teams nativo (experimental): un líder coordina teammates
118
+ # que se comunican entre sí vía task list compartida. swl-ses NO lo usa por
119
+ # defecto — su patrón es orquestador-swl + Agent tool. Activar solo para
120
+ # experimentar con coordinación teammate-to-teammate.
121
+ export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
122
+ ```
123
+
124
+ ```bash
125
+ # Cap de costo nativo por sesión headless/team. Aborta la sesión completa
126
+ # al alcanzar el límite, sin importar cuántos agentes estén activos.
127
+ claude -p "build the auth system" --max-budget-usd 15.00
128
+ ```
129
+
130
+ **Relación con la infra de swl-ses:**
131
+
132
+ | Knob nativo | Equivalente swl-ses | Cuándo usar el nativo |
133
+ |-------------|---------------------|------------------------|
134
+ | `CLAUDE_CODE_SUBAGENT_MODEL` | `model:` en frontmatter de cada agente (Model-Tier) | El frontmatter es **superior** (granular por agente). El env var solo para sesiones ad-hoc sin SWL o como override global temporal |
135
+ | `--max-budget-usd` | `scripts/lib/budget-enforcer.js` (4 niveles + idempotency) + `hooks/tracking-costos.js` | El `budget-enforcer` es **superior** (warning/approval/backpressure/hard). El flag nativo es un cap duro complementario para sesiones de orquestador con muchos sub-agentes en paralelo |
136
+ | `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | `orquestador-swl` + Agent tool | swl-ses prefiere su patrón. El nativo solo para experimentación — su modelo teammate-to-teammate no está integrado con los hooks de gobernanza SWL |
137
+
138
+ **Anti-patrón**: usar `CLAUDE_CODE_SUBAGENT_MODEL` como reemplazo del
139
+ Model-Tier por frontmatter. Pierde la granularidad (revisor-seguridad
140
+ necesita Opus aunque sea teammate). Usar solo como override de sesión,
141
+ nunca persistente en `.bashrc` si trabajas con swl-ses.
142
+
104
143
  ### `/effort` per-prompt (no per-session)
105
144
 
106
145
  ```
@@ -15,7 +15,7 @@ regla clara, un mismo dato puede terminar en el lugar incorrecto o duplicado.
15
15
  | 2 | **`.planning/APRENDIZAJES.md`** | Markdown con entradas `### [YYYY-MM-DD] Título` agrupadas por sección | Conocimiento del dominio (anti-patrones, patrones, decisiones, gotchas) |
16
16
  | 3 | **`instintos/proyecto.yaml` / `global.yaml` / `perfil-usuario.yaml`** | YAML estructurado con confidence, scope, evidence_count | Patrones aprendidos inductivamente, con promoción/degradación |
17
17
  | 4 | **`.planning/sessions/search-index.json`** | Índice FTS de sesiones pasadas | Búsqueda histórica de trabajo (qué se hizo, cuándo) |
18
- | 5 | **`.planning/evolucion/*`** | JSONL (nudges, agentes) + JSON (métricas, alertas, evoluciones) | Estado del ciclo de auto-evolución |
18
+ | 5 | **`.planning/evolution/*`** | JSONL (nudges, agentes) + JSON (métricas, alertas, evoluciones) | Estado del ciclo de auto-evolución |
19
19
 
20
20
  ---
21
21
 
@@ -44,11 +44,11 @@ regla clara, un mismo dato puede terminar en el lugar incorrecto o duplicado.
44
44
 
45
45
  | Tipo de dato | Canal correcto |
46
46
  |---|---|
47
- | Nudge emitido por un hook | 5 (`.planning/evolucion/nudges.jsonl`) |
48
- | Evento de subagente terminado | 5 (`.planning/auto-evolucion/agentes.jsonl`) |
49
- | Evolución aplicada/revertida a skill | 5 (`.planning/evolucion/evoluciones.jsonl`) |
50
- | Alerta persistente (nudges ignorados) | 5 (`.planning/evolucion/alertas-persistentes.json`) |
51
- | Métricas agregadas (health score) | 5 (`.planning/evolucion/metricas.json`) |
47
+ | Nudge emitido por un hook | 5 (`.planning/evolution/nudges.jsonl`) |
48
+ | Evento de subagente terminado | 5 (`.planning/auto-evolution/agentes.jsonl`) |
49
+ | Evolución aplicada/revertida a skill | 5 (`.planning/evolution/evoluciones.jsonl`) |
50
+ | Alerta persistente (nudges ignorados) | 5 (`.planning/evolution/alertas-persistentes.json`) |
51
+ | Métricas agregadas (health score) | 5 (`.planning/evolution/metricas.json`) |
52
52
  | Traza de ejecución de agente | `.planning/traces/` (OTLP-lite) |
53
53
  | Audit trail inmutable | `.planning/audit.jsonl` + Merkle |
54
54
 
@@ -125,7 +125,7 @@ conocido, datos en canales deprecados.
125
125
 
126
126
  - **Corrección del usuario escrita a APRENDIZAJES.md** → debe ir al perfil
127
127
  - **Anti-patrón técnico escrito al perfil del usuario** → debe ir a APRENDIZAJES
128
- - **Métrica persistida en APRENDIZAJES.md** → debe ir a `.planning/evolucion/`
128
+ - **Métrica persistida en APRENDIZAJES.md** → debe ir a `.planning/evolution/`
129
129
  - **Secreto/credencial en cualquier canal** → bloqueo inmediato (`privacy-memoria`)
130
130
  - **Dato duplicado en proyecto.yaml y global.yaml** → uno debe borrarse
131
131
  (promover a global SOLO cuando confidence > 0.8 Y validado cross-proyecto)
@@ -96,7 +96,7 @@ node scripts/auditar-claudemd.js
96
96
  - **Auditor síncrono**: `scripts/auditar-claudemd.js` (dimensión 7,
97
97
  severidad WARN, no bloquea).
98
98
  - **Hook async**: `hooks/claudemd-duplicacion-detector.js` (PostToolUse,
99
- emite nudge a `.planning/evolucion/nudges.jsonl`).
99
+ emite nudge a `.planning/evolution/nudges.jsonl`).
100
100
  - **Comando**: `/swl:claudemd audit` reporta el conteo; `/swl:claudemd
101
101
  refactor` propone el reemplazo concreto.
102
102
 
@@ -34,7 +34,7 @@ try {
34
34
 
35
35
  var RAIZ_AGENTES = path.resolve(__dirname, '..', 'agentes');
36
36
  var DESTINO_PLANNING = path.resolve(
37
- __dirname, '..', '.planning', 'evolucion', 'audit-agentes-gaps.json'
37
+ __dirname, '..', '.planning', 'evolution', 'audit-agentes-gaps.json'
38
38
  );
39
39
 
40
40
  // Patrones - soportan LF y CRLF (Windows).
@@ -11,7 +11,7 @@
11
11
  * Uso:
12
12
  * node scripts/auditar-cobertura-frameworks.js # JSON a stdout
13
13
  * node scripts/auditar-cobertura-frameworks.js --resumen # tabla a stderr
14
- * node scripts/auditar-cobertura-frameworks.js --save # persiste en .planning/evolucion/
14
+ * node scripts/auditar-cobertura-frameworks.js --save # persiste en .planning/evolution/
15
15
  * node scripts/auditar-cobertura-frameworks.js --framework=nist_csf # solo un framework
16
16
  *
17
17
  * No falla si un skill no tiene mapeos — solo los skills del dominio de
@@ -35,7 +35,7 @@ try {
35
35
 
36
36
  const RAIZ_SKILLS = path.resolve(__dirname, '..', 'habilidades');
37
37
  const DESTINO = path.resolve(
38
- __dirname, '..', '.planning', 'evolucion', 'cobertura-frameworks.json'
38
+ __dirname, '..', '.planning', 'evolution', 'cobertura-frameworks.json'
39
39
  );
40
40
 
41
41
  const CAMPOS_FRAMEWORK = Object.freeze([
@@ -10,7 +10,7 @@
10
10
  * Uso:
11
11
  * node scripts/auditar-skills-gaps.js # JSON a stdout
12
12
  * node scripts/auditar-skills-gaps.js --resumen # solo tabla a stderr
13
- * node scripts/auditar-skills-gaps.js --save # persiste en .planning/evolucion/
13
+ * node scripts/auditar-skills-gaps.js --save # persiste en .planning/evolution/
14
14
  * node scripts/auditar-skills-gaps.js --incluir-excepciones # incluye gaps excusados en el total
15
15
  *
16
16
  * Excepciones documentadas: lista inline de skills con gaps justificados por ADR.
@@ -30,7 +30,7 @@ try {
30
30
 
31
31
  const RAIZ_SKILLS = path.resolve(__dirname, '..', 'habilidades');
32
32
  const DESTINO_PLANNING = path.resolve(
33
- __dirname, '..', '.planning', 'evolucion', 'audit-skills-gaps.json'
33
+ __dirname, '..', '.planning', 'evolution', 'audit-skills-gaps.json'
34
34
  );
35
35
 
36
36
  // Patrones de detección
@@ -26,7 +26,7 @@
26
26
  * 2 - Argumentos inválidos
27
27
  *
28
28
  * Persistencia opcional: si se setea SWL_BENCHMARK_PERSIST=1, escribe
29
- * el resultado agregado a `.planning/evolucion/benchmark-memoria.jsonl`
29
+ * el resultado agregado a `.planning/evolution/benchmark-memoria.jsonl`
30
30
  * para tracking histórico.
31
31
  */
32
32
 
@@ -36,7 +36,7 @@ const path = require('path');
36
36
  const { ejecutarDataset } = require('./lib/longmemeval-runner');
37
37
 
38
38
  const DATASET_DEFAULT = '.planning/benchmark/dataset.jsonl';
39
- const HISTORICO_PATH = '.planning/evolucion/benchmark-memoria.jsonl';
39
+ const HISTORICO_PATH = '.planning/evolution/benchmark-memoria.jsonl';
40
40
 
41
41
  function uso() {
42
42
  console.error('Uso: node scripts/benchmark-memoria.js [--dataset <ruta>] [--limit <n>] [--json] [--verbose]');
@@ -64,7 +64,7 @@ function parseArgs(argv) {
64
64
  function persistirHistorico(baseDir, resumen) {
65
65
  if (process.env.SWL_BENCHMARK_PERSIST !== '1') return;
66
66
  try {
67
- const dirEvolucion = path.join(baseDir, '.planning', 'evolucion');
67
+ const dirEvolucion = path.join(baseDir, '.planning', 'evolution');
68
68
  if (!fs.existsSync(dirEvolucion)) fs.mkdirSync(dirEvolucion, { recursive: true });
69
69
  const linea = JSON.stringify({
70
70
  timestamp: new Date().toISOString(),
@@ -14,7 +14,7 @@
14
14
  * node scripts/inferir-herramientas-permitidas.js --dry-run --skill=fastapi-experto
15
15
  * node scripts/inferir-herramientas-permitidas.js --aplicar
16
16
  * node scripts/inferir-herramientas-permitidas.js --aplicar --solo-faltantes
17
- * node scripts/inferir-herramientas-permitidas.js --aplicar --log=.planning/evolucion/infer-herramientas.log
17
+ * node scripts/inferir-herramientas-permitidas.js --aplicar --log=.planning/evolution/infer-herramientas.log
18
18
  *
19
19
  * @module scripts/inferir-herramientas-permitidas
20
20
  */
@@ -416,6 +416,54 @@ async function install(opciones) {
416
416
  console.log(` [migración] ${migracionesAplicadas} archivo(s) de .planning/ migrado(s) de inglés a español`);
417
417
  }
418
418
 
419
+ // 6c-bis. Migración de DIRECTORIOS runtime de .planning/ español → inglés.
420
+ // Unificación: los paths runtime/técnicos van en inglés (telemetría, perfil,
421
+ // logs archivados). NO incluye fases/ (vocabulario GSD de cara al usuario, se
422
+ // mantiene español por coherencia con los comandos *-fase). Ver ADR-0031.
423
+ const MIGRACIONES_DIRS_PLANNING = [
424
+ { viejo: 'evolucion', nuevo: 'evolution' },
425
+ { viejo: 'auto-evolucion', nuevo: 'auto-evolution' },
426
+ { viejo: 'perfil-usuario', nuevo: 'user-profile' },
427
+ { viejo: 'archivo', nuevo: 'archive' },
428
+ ];
429
+
430
+ let dirsMigrados = 0;
431
+ for (const m of MIGRACIONES_DIRS_PLANNING) {
432
+ const dirViejo = path.join(process.cwd(), '.planning', m.viejo);
433
+ const dirNuevo = path.join(process.cwd(), '.planning', m.nuevo);
434
+
435
+ if (!fs.existsSync(dirViejo)) continue;
436
+
437
+ try {
438
+ if (!fs.existsSync(dirNuevo)) {
439
+ // Caso 1: solo existe el viejo → renombrar el directorio completo
440
+ fs.renameSync(dirViejo, dirNuevo);
441
+ console.log(` ✓ Migración dir: .planning/${m.viejo}/ → .planning/${m.nuevo}/`);
442
+ } else {
443
+ // Caso 2: ambos existen → mover entradas del viejo al nuevo (sin sobreescribir)
444
+ let saltadas = 0;
445
+ for (const entry of fs.readdirSync(dirViejo)) {
446
+ const src = path.join(dirViejo, entry);
447
+ const dst = path.join(dirNuevo, entry);
448
+ if (!fs.existsSync(dst)) fs.renameSync(src, dst);
449
+ else saltadas++; // conflicto de nombre: se deja en origen (no destructivo)
450
+ }
451
+ try { fs.rmdirSync(dirViejo); } catch { /* no vacío: se deja, no destructivo */ }
452
+ const sufijo = saltadas > 0
453
+ ? ` (${saltadas} entrada(s) con conflicto dejadas en .planning/${m.viejo}/)`
454
+ : '';
455
+ console.log(` ⊕ Migración dir: .planning/${m.viejo}/ fusionado en .planning/${m.nuevo}/${sufijo}`);
456
+ }
457
+ dirsMigrados++;
458
+ } catch (err) {
459
+ console.log(` ! Migración dir ${m.viejo}: ${err.message}`);
460
+ }
461
+ }
462
+
463
+ if (dirsMigrados > 0) {
464
+ console.log(` [migración] ${dirsMigrados} directorio(s) runtime de .planning/ migrado(s) español → inglés`);
465
+ }
466
+
419
467
  // 6d. Filtrar skills por targets declarados en SKILL.md frontmatter (patrón skillshare)
420
468
  // Si un skill declara targets: [claude, copilot], solo se instala en esos runtimes.
421
469
  // Si no declara targets, se instala en todos (comportamiento por defecto).
@@ -122,7 +122,7 @@ const _WIDGET_CATALOG = [
122
122
  {
123
123
  id: 'nudges-recientes',
124
124
  label: 'Nudges Recientes',
125
- descripcion: 'Últimos nudges emitidos por hooks de observabilidad (.planning/evolucion/nudges.jsonl)',
125
+ descripcion: 'Últimos nudges emitidos por hooks de observabilidad (.planning/evolution/nudges.jsonl)',
126
126
  categoria: 'evolucion',
127
127
  modos: ['offline'],
128
128
  tamanoDefault: 'md',
@@ -130,7 +130,7 @@ const _WIDGET_CATALOG = [
130
130
  {
131
131
  id: 'evoluciones-aplicadas',
132
132
  label: 'Evoluciones Aplicadas',
133
- descripcion: 'Historial de evoluciones de skills y agentes (.planning/evolucion/evoluciones.jsonl)',
133
+ descripcion: 'Historial de evoluciones de skills y agentes (.planning/evolution/evoluciones.jsonl)',
134
134
  categoria: 'evolucion',
135
135
  modos: ['offline'],
136
136
  tamanoDefault: 'md',
@@ -138,7 +138,7 @@ const _WIDGET_CATALOG = [
138
138
  {
139
139
  id: 'alertas-persistentes',
140
140
  label: 'Alertas Persistentes',
141
- descripcion: 'Alertas activas sin resolver del ciclo AGP (.planning/evolucion/alertas-persistentes.json)',
141
+ descripcion: 'Alertas activas sin resolver del ciclo AGP (.planning/evolution/alertas-persistentes.json)',
142
142
  categoria: 'evolucion',
143
143
  modos: ['offline'],
144
144
  tamanoDefault: 'md',
@@ -17,7 +17,7 @@
17
17
  * - Fuente de datos: JSONL en disco, no SQLite
18
18
  * - Sin dependencias externas (solo Node stdlib: fs, path)
19
19
  * - Métricas configurables via parámetro, no hardcodeadas
20
- * - Emite nudge a .planning/evolucion/nudges.jsonl en drift crítico
20
+ * - Emite nudge a .planning/evolution/nudges.jsonl en drift crítico
21
21
  *
22
22
  * @module scripts/lib/drift-detector
23
23
  */
@@ -50,7 +50,7 @@ const METRICAS_DEFAULT = [
50
50
 
51
51
  // Ruta raíz del proyecto (dos niveles arriba de scripts/lib/)
52
52
  const RAIZ_PROYECTO = path.resolve(__dirname, '..', '..');
53
- const RUTA_NUDGES = path.join(RAIZ_PROYECTO, '.planning', 'evolucion', 'nudges.jsonl');
53
+ const RUTA_NUDGES = path.join(RAIZ_PROYECTO, '.planning', 'evolution', 'nudges.jsonl');
54
54
 
55
55
  // ── helpers internos ──────────────────────────────────────────────────────────
56
56
 
@@ -202,7 +202,7 @@ function contarNudgesPrevios(metrica, agente) {
202
202
  }
203
203
 
204
204
  /**
205
- * Emite un nudge a .planning/evolucion/nudges.jsonl cuando se detecta
205
+ * Emite un nudge a .planning/evolution/nudges.jsonl cuando se detecta
206
206
  * drift crítico. Usa fs.appendFileSync (JSONL, no sobreescribe).
207
207
  *
208
208
  * Aplica repair-loop detection: si el mismo (metrica, agente) ya fue
@@ -5,8 +5,8 @@
5
5
  *
6
6
  * Patrón adoptado de `temp/agentmemory-main/src/eval/metrics-store.ts`.
7
7
  * Adaptado a swl-ses: file-based en lugar de SQLite. Persiste:
8
- * - JSONL append-only: `.planning/evolucion/eval-results.jsonl` (cada eval individual)
9
- * - JSON agregado: `.planning/evolucion/eval-metrics.json` (totales por functionId)
8
+ * - JSONL append-only: `.planning/evolution/eval-results.jsonl` (cada eval individual)
9
+ * - JSON agregado: `.planning/evolution/eval-metrics.json` (totales por functionId)
10
10
  *
11
11
  * El JSONL preserva el detalle histórico (un evento por evaluación). El JSON
12
12
  * agregado se recalcula incrementalmente: avg latency, avg quality, success
@@ -31,7 +31,7 @@ try {
31
31
 
32
32
  // ── constantes ────────────────────────────────────────────────────────────────
33
33
 
34
- const DIR_EVOLUCION = path.join('.planning', 'evolucion');
34
+ const DIR_EVOLUCION = path.join('.planning', 'evolution');
35
35
  const RUTA_JSONL = path.join(DIR_EVOLUCION, 'eval-results.jsonl');
36
36
  const RUTA_AGREGADO = path.join(DIR_EVOLUCION, 'eval-metrics.json');
37
37
 
@@ -77,10 +77,10 @@ const ENTRADAS_BASE = [
77
77
  // (metricas-evolucion, nudge-tracker, drift-detector, auto-evolucion,
78
78
  // singleton-guard, actualizar-perfil-usuario). Output de runtime, no
79
79
  // artefactos del proyecto usuario.
80
- ".planning/evolucion/",
81
- ".planning/auto-evolucion/",
80
+ ".planning/evolution/",
81
+ ".planning/auto-evolution/",
82
82
  ".planning/locks/",
83
- ".planning/perfil-usuario/",
83
+ ".planning/user-profile/",
84
84
 
85
85
  // Instintos modificados automáticamente por hooks (degradacion-instintos.js)
86
86
  "instintos/",
@@ -121,7 +121,7 @@ proyecto — sería redundante.
121
121
  |---|---|---|
122
122
  | Auth | sin auth | opt-in con `SWL_MCP_API_KEY` + Bearer en `params._auth` |
123
123
  | Caching | sin caching | mtime-based con TTL configurable |
124
- | Telemetría | logs stderr | JSONL en `.planning/evolucion/mcp-metrics.jsonl` (opt-in) |
124
+ | Telemetría | logs stderr | JSONL en `.planning/evolution/mcp-metrics.jsonl` (opt-in) |
125
125
  | Schema versioning | implícito | `_schemaVersion` en cada tool de `tools/list` |
126
126
  | Tests | smoke manual | 38 tests unitarios (`tests/mcp-server/*.test.js`) |
127
127
  | Estado | "NO usar en producción" | apto para los proyectos del usuario |
@@ -4,7 +4,7 @@
4
4
  * Telemetría opt-in del swl-mcp-server v1.0.0 (ADR-0019 Sub-fase 3).
5
5
  *
6
6
  * Cuando `SWL_MCP_METRICS=1` está activo, cada `tools/call` se registra en
7
- * `.planning/evolucion/mcp-metrics.jsonl` con:
7
+ * `.planning/evolution/mcp-metrics.jsonl` con:
8
8
  * { ts, tool, durationMs, ok, error?, baseDir }
9
9
  *
10
10
  * Defaults:
@@ -42,7 +42,7 @@ function construirTelemetria(opciones = {}) {
42
42
  };
43
43
  }
44
44
 
45
- const dirEvolucion = path.join(baseDir, '.planning', 'evolucion');
45
+ const dirEvolucion = path.join(baseDir, '.planning', 'evolution');
46
46
  const ruta = path.join(dirEvolucion, 'mcp-metrics.jsonl');
47
47
 
48
48
  // Asegurar que el directorio existe — si falla, deshabilitamos silenciosamente.
@@ -10,11 +10,11 @@
10
10
  *
11
11
  * Fuentes:
12
12
  * - ~/.claude/projects/<slug-proyecto>/*.jsonl
13
- * - .planning/evolucion/feedback-queue.jsonl (si existe)
13
+ * - .planning/evolution/feedback-queue.jsonl (si existe)
14
14
  *
15
15
  * Salida:
16
16
  * - stdout: reporte de clusters con N >= UMBRAL_REPETICIONES
17
- * - .planning/evolucion/reflect-skills-report.json: reporte estructurado
17
+ * - .planning/evolution/reflect-skills-report.json: reporte estructurado
18
18
  *
19
19
  * Uso:
20
20
  * node scripts/reflect-skills.js [--ventana 30] [--umbral 3] [--json]
@@ -229,7 +229,7 @@ function clusterizarPrompts(prompts) {
229
229
  // ---------------------------------------------------------------------------
230
230
 
231
231
  function leerFeedbackQueue(cwd, ventanaMs) {
232
- const queuePath = path.join(cwd, '.planning', 'evolucion', 'feedback-queue.jsonl');
232
+ const queuePath = path.join(cwd, '.planning', 'evolution', 'feedback-queue.jsonl');
233
233
  if (!fs.existsSync(queuePath)) return [];
234
234
  const cutoff = Date.now() - ventanaMs;
235
235
  const items = [];
@@ -373,7 +373,7 @@ function main() {
373
373
 
374
374
  // Guardar reporte estructurado
375
375
  try {
376
- const dir = path.join(cwd, '.planning', 'evolucion');
376
+ const dir = path.join(cwd, '.planning', 'evolution');
377
377
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
378
378
  fs.writeFileSync(
379
379
  path.join(dir, 'reflect-skills-report.json'),
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  // scripts/rotar-audit-logs.js
3
3
  // Rota entradas antiguas de .planning/audit.jsonl y .planning/audit-merkle.jsonl
4
- // a archivos comprimidos .gz agrupados por mes en .planning/archivo/audit/.
4
+ // a archivos comprimidos .gz agrupados por mes en .planning/archive/audit/.
5
5
  // Zero-dependencies (usa fs, zlib, path de Node). CRLF-safe.
6
6
  //
7
7
  // Política por defecto:
8
8
  // - Entradas con timestamp mayor a RETENCION_DIAS días (default 30) se archivan.
9
- // - Destino: .planning/archivo/audit/<nombre>-YYYY-MM.jsonl.gz
9
+ // - Destino: .planning/archive/audit/<nombre>-YYYY-MM.jsonl.gz
10
10
  // - Las entradas recientes quedan en el archivo activo sin alterar orden.
11
11
  // - audit-merkle.jsonl preserva la cadena de hashes: los archivos comprimidos
12
12
  // conservan cada entrada con su `prev`/`hash`, y el archivo activo sigue
@@ -8,7 +8,7 @@
8
8
  * No ejecuta el LLM — esa parte la hace /swl:evaluar-skill. Este script:
9
9
  * - Valida el JSON contra schemas/skill-evals.schema.json (shape mínima).
10
10
  * - Emite un "plan de evaluación" ejecutable: lista de (id, prompt, expectations).
11
- * - Registra el baseline/after en .planning/evolucion/evoluciones.jsonl cuando
11
+ * - Registra el baseline/after en .planning/evolution/evoluciones.jsonl cuando
12
12
  * se invoca con --record-baseline o --record-after.
13
13
  *
14
14
  * Uso:
@@ -33,7 +33,7 @@ const path = require('path');
33
33
  const { validarInvariantesDeAgente } = require('./lib/agp-frontmatter');
34
34
 
35
35
  const CWD = process.cwd();
36
- const EVOL_DIR = path.join(CWD, '.planning', 'evolucion');
36
+ const EVOL_DIR = path.join(CWD, '.planning', 'evolution');
37
37
  const EVOL_LOG = path.join(EVOL_DIR, 'evoluciones.jsonl');
38
38
 
39
39
  function ensureDir(d) { try { fs.mkdirSync(d, { recursive: true }); } catch { /* ignore */ } }