@saulwade/swl-ses 1.7.4 → 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.
- package/CLAUDE.md +196 -196
- package/README.md +578 -578
- package/agentes/auto-evolucion-swl.md +7 -7
- package/agentes/disenador-ui-swl.md +12 -0
- package/agentes/investigador-ux-swl.md +9 -0
- package/agentes/perfilador-usuario-swl.md +2 -2
- package/agentes/ux-disenador-swl.md +6 -0
- package/comandos/swl/evaluar-skill.md +1 -1
- package/comandos/swl/evolucion-estado.md +5 -5
- package/comandos/swl/evolucionar.md +2 -2
- package/comandos/swl/inbox.md +1 -1
- package/comandos/swl/reflect-skills.md +2 -2
- package/comandos/swl/salud.md +1 -1
- package/habilidades/ai-runtime-security/SKILL.md +2 -2
- package/habilidades/auto-evolucion-protocolo/SKILL.md +2 -2
- package/habilidades/benchmark-memoria/SKILL.md +2 -2
- package/habilidades/drift-detection/SKILL.md +3 -3
- package/habilidades/eval-framework/SKILL.md +1 -1
- package/habilidades/guardrail-semantico/SKILL.md +4 -4
- package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
- package/habilidades/swl-claudemd/SKILL.md +2 -2
- package/habilidades/testing-python/SKILL.md +1 -1
- package/habilidades/tracing-processor/SKILL.md +1 -1
- package/hooks/actualizar-perfil-usuario.js +2 -2
- package/hooks/aiisms-detector.js +2 -2
- package/hooks/auto-evolucion.js +1 -1
- package/hooks/captura-feedback-usuario.js +2 -2
- package/hooks/claudemd-bloat-detector.js +2 -2
- package/hooks/claudemd-duplicacion-detector.js +1 -1
- package/hooks/guardrail-modelo.js +2 -2
- package/hooks/lib/memory-search.js +1 -1
- package/hooks/lib/nudge-tracker.js +1 -1
- package/hooks/metricas-evolucion.js +3 -3
- package/hooks/rotar-audit-auto.js +2 -2
- package/hooks/validar-formato-post-subagente.js +2 -2
- package/hooks/validar-intent-spec.js +1 -1
- package/hooks/validar-planning-paths.js +134 -0
- package/manifiestos/hooks-config.json +20 -11
- package/manifiestos/modulos.json +1352 -1351
- package/manifiestos/planning-paths.json +44 -0
- package/manifiestos/skills-lock.json +1254 -1254
- package/package.json +92 -92
- package/plugin.json +372 -372
- package/reglas/gobernanza.md +1 -1
- package/reglas/memoria-consolidada.md +7 -7
- package/reglas/sin-duplicacion-reglas-globales.md +1 -1
- package/scripts/auditar-agentes-gaps.js +1 -1
- package/scripts/auditar-cobertura-frameworks.js +2 -2
- package/scripts/auditar-skills-gaps.js +2 -2
- package/scripts/benchmark-memoria.js +3 -3
- package/scripts/inferir-herramientas-permitidas.js +1 -1
- package/scripts/instalador.js +48 -0
- package/scripts/lib/dashboard-widgets.js +3 -3
- package/scripts/lib/drift-detector.js +3 -3
- package/scripts/lib/eval-metrics-store.js +3 -3
- package/scripts/lib/gitignore-manifest.js +3 -3
- package/scripts/mcp-server/README.md +1 -1
- package/scripts/mcp-server/telemetry.js +2 -2
- package/scripts/reflect-skills.js +4 -4
- package/scripts/rotar-audit-logs.js +2 -2
- package/scripts/run-skill-evals.js +2 -2
package/reglas/gobernanza.md
CHANGED
|
@@ -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/
|
|
43
|
+
Y en `.planning/evolution/evoluciones.jsonl` con evento
|
|
44
44
|
`tipo: "promocion-skill"` y `score`.
|
|
45
45
|
|
|
46
46
|
### Reglas nuevas obligatorias
|
|
@@ -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/
|
|
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/
|
|
48
|
-
| Evento de subagente terminado | 5 (`.planning/auto-
|
|
49
|
-
| Evolución aplicada/revertida a skill | 5 (`.planning/
|
|
50
|
-
| Alerta persistente (nudges ignorados) | 5 (`.planning/
|
|
51
|
-
| Métricas agregadas (health score) | 5 (`.planning/
|
|
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/
|
|
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/
|
|
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', '
|
|
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/
|
|
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', '
|
|
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/
|
|
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', '
|
|
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/
|
|
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/
|
|
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', '
|
|
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/
|
|
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
|
*/
|
package/scripts/instalador.js
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
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/
|
|
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', '
|
|
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/
|
|
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/
|
|
9
|
-
* - JSON agregado: `.planning/
|
|
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', '
|
|
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/
|
|
81
|
-
".planning/auto-
|
|
80
|
+
".planning/evolution/",
|
|
81
|
+
".planning/auto-evolution/",
|
|
82
82
|
".planning/locks/",
|
|
83
|
-
".planning/
|
|
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/
|
|
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/
|
|
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', '
|
|
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/
|
|
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/
|
|
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', '
|
|
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', '
|
|
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/
|
|
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/
|
|
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/
|
|
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', '
|
|
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 */ } }
|