@saulwade/swl-ses 1.5.0 → 1.5.2
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 +19 -2
- package/README.md +561 -561
- package/agentes/arquitecto-swl.md +33 -1
- package/agentes/nemesis-auditor-swl.md +59 -19
- package/bin/swl-mcp-server.js +214 -214
- package/comandos/swl/.evolved.json +22 -22
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/nemesis.md +230 -56
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/SKILL.md +171 -171
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/feynman-auditor-swl/SKILL.md +123 -123
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/SKILL.md +299 -299
- package/habilidades/infra-github-actions/SKILL.md +166 -166
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- package/habilidades/manejo-errores/.evolved.json +8 -8
- package/habilidades/meta-skills-estandar/SKILL.md +225 -1
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- package/habilidades/nemesis-evaluacion-json/SKILL.md +266 -0
- package/habilidades/nemesis-redistribuir/SKILL.md +341 -0
- package/habilidades/node-experto/SKILL.md +105 -4
- package/habilidades/patrones-python/SKILL.md +229 -229
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/planear-fase/SKILL.md +319 -319
- package/habilidades/protocolo-revision-swl/SKILL.md +350 -276
- package/habilidades/release-semver/.evolved.json +8 -8
- package/habilidades/state-inconsistency-auditor-swl/SKILL.md +166 -166
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/tdd-workflow/SKILL.md +150 -4
- package/habilidades/testing-python/SKILL.md +340 -340
- package/habilidades/verificar-trabajo/SKILL.md +8 -3
- package/habilidades/web-fetcher-routing/SKILL.md +75 -75
- package/hooks/check-update.js +31 -3
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/rate-limit-tracker.js +253 -253
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/security-net.js +201 -201
- package/hooks/lib/skill-auditor.js +588 -588
- package/hooks/lib/sync-status.js +228 -228
- package/hooks/lib/taint-tracker.js +107 -107
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/registro-turnos.js +209 -209
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-memoria-hook.js +218 -218
- package/instintos/prompt-appendices.yaml +57 -57
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/modulos.json +1324 -1321
- package/manifiestos/skills-lock.json +1114 -1114
- package/package.json +2 -2
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/README.md +47 -47
- package/plantillas/github-workflows/release-please.yml +44 -44
- package/plantillas/github-workflows/swl-ci.yml +107 -107
- package/plantillas/github-workflows/swl-security.yml +51 -51
- package/plugin.json +353 -351
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/arreglar-al-detectar.md +147 -147
- package/reglas/fragmentos-compartidos.md +152 -152
- package/reglas/harness-claude-code.md +213 -213
- package/reglas/registro-componentes-nuevos.md +192 -0
- package/reglas/usar-context7.md +226 -226
- package/schemas/diary-entry.schema.json +80 -80
- package/scripts/actualizar.js +110 -1
- package/scripts/audit-tools/audit-history.js +330 -330
- package/scripts/audit-tools/bundle-tracker.js +290 -290
- package/scripts/audit-tools/canary-monitor.js +352 -352
- package/scripts/audit-tools/code-profiler.js +605 -605
- package/scripts/audit-tools/dep-doctor.js +320 -320
- package/scripts/audit-tools/env-validator.js +206 -206
- package/scripts/audit-tools/lib/fs-walk.js +48 -48
- package/scripts/audit-tools/lib/output.js +23 -23
- package/scripts/audit-tools/migration-checker.js +392 -392
- package/scripts/audit-tools/pentest-scanner.js +1436 -1436
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/derivar-feature-list.js +489 -489
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/doctor.js +58 -4
- package/scripts/field-report.js +199 -199
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-inventario.js +420 -420
- package/scripts/generar-matriz-lenguajes.js +271 -271
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/diary-entry.js +234 -234
- package/scripts/lib/eval-metrics-store.js +218 -218
- package/scripts/lib/eval-quality.js +171 -171
- package/scripts/lib/eval-schemas.js +144 -144
- package/scripts/lib/eval-self-correct.js +106 -106
- package/scripts/lib/eval-validator.js +185 -185
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/mcp_config.py +127 -0
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/transformadores/codex.js +375 -375
- package/scripts/lib/transformadores/cursor.js +359 -359
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-orchestrator.py +8 -18
- package/scripts/mcp-pool-manager.py +12 -23
- package/scripts/mcp-server/README.md +170 -170
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/mcp-server/telemetry.js +78 -78
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +201 -201
- package/scripts/publicar.js +511 -511
- package/scripts/run-eval.js +141 -141
- package/scripts/validar-userland-vacio.js +110 -110
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* agent-routing.js — Helper para inferir fase y dominio del routing.
|
|
5
|
-
*
|
|
6
|
-
* Lee el frontmatter del agente (agentes/<nombre>.md) y extrae los campos
|
|
7
|
-
* `fase` y `dominio` introducidos en v1.1.0 (ADR 0012). El orquestador no
|
|
8
|
-
* registra explícitamente "qué fase/dominio motivó la elección" — pero
|
|
9
|
-
* cuando elige un agente, podemos asumir que lo eligió porque su fase y
|
|
10
|
-
* dominio matcheaban. Por lo tanto, leer el frontmatter del agente
|
|
11
|
-
* efectivamente invocado nos da la celda fase×dominio del routing.
|
|
12
|
-
*
|
|
13
|
-
* Esto es proxy de precisión, no precisión absoluta:
|
|
14
|
-
* - Tasa de éxito por celda (fase, dominio) sirve como indicador de
|
|
15
|
-
* que el routing está enviando trabajo correctamente al agente
|
|
16
|
-
* adecuado.
|
|
17
|
-
* - Una celda con tasa de éxito baja sugiere routing impreciso (el
|
|
18
|
-
* agente recibe trabajo que no le compete) o agente sub-óptimo.
|
|
19
|
-
*
|
|
20
|
-
* Cache simple en memoria del proceso para evitar I/O repetida (cada
|
|
21
|
-
* invocación de hook es proceso fresco, así que el cache no persiste,
|
|
22
|
-
* pero protege dentro de la misma invocación).
|
|
23
|
-
*
|
|
24
|
-
* @module hooks/lib/agent-routing
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
const fs = require('fs');
|
|
28
|
-
const path = require('path');
|
|
29
|
-
|
|
30
|
-
const _cache = Object.create(null);
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Resuelve la ruta del archivo de agente. Acepta tanto el repo madre como
|
|
34
|
-
* proyectos consumidores (donde los agentes pueden estar en otras rutas).
|
|
35
|
-
*
|
|
36
|
-
* @param {string} agentName - p.ej. "backend-python-swl"
|
|
37
|
-
* @param {string} [cwd] - Directorio de proyecto (default process.cwd())
|
|
38
|
-
* @returns {string|null} - Ruta absoluta o null si no existe
|
|
39
|
-
*/
|
|
40
|
-
function resolveAgentPath(agentName, cwd) {
|
|
41
|
-
const baseDir = cwd || process.cwd();
|
|
42
|
-
const candidates = [
|
|
43
|
-
path.join(baseDir, 'agentes', `${agentName}.md`),
|
|
44
|
-
path.join(baseDir, '.claude', 'agents', `${agentName}.md`),
|
|
45
|
-
];
|
|
46
|
-
for (const c of candidates) {
|
|
47
|
-
try { if (fs.statSync(c).isFile()) return c; } catch { /* siguiente */ }
|
|
48
|
-
}
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Extrae fase y dominio del frontmatter de un agente.
|
|
54
|
-
*
|
|
55
|
-
* @param {string} agentName - Nombre del agente sin extensión
|
|
56
|
-
* @param {string} [cwd]
|
|
57
|
-
* @returns {{ fase: string|null, dominio: string|null, source: string }}
|
|
58
|
-
* - source: 'frontmatter' | 'cache' | 'unknown'
|
|
59
|
-
*/
|
|
60
|
-
function getRouting(agentName, cwd) {
|
|
61
|
-
if (!agentName) return { fase: null, dominio: null, source: 'unknown' };
|
|
62
|
-
if (_cache[agentName]) {
|
|
63
|
-
return { ..._cache[agentName], source: 'cache' };
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const agentPath = resolveAgentPath(agentName, cwd);
|
|
67
|
-
if (!agentPath) {
|
|
68
|
-
const result = { fase: null, dominio: null, source: 'unknown' };
|
|
69
|
-
_cache[agentName] = { fase: null, dominio: null };
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
let raw;
|
|
74
|
-
try {
|
|
75
|
-
raw = fs.readFileSync(agentPath, 'utf8');
|
|
76
|
-
} catch {
|
|
77
|
-
return { fase: null, dominio: null, source: 'unknown' };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const fmMatch = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
81
|
-
if (!fmMatch) {
|
|
82
|
-
_cache[agentName] = { fase: null, dominio: null };
|
|
83
|
-
return { fase: null, dominio: null, source: 'unknown' };
|
|
84
|
-
}
|
|
85
|
-
const fm = fmMatch[1];
|
|
86
|
-
|
|
87
|
-
// Parser minimalista — solo busca las dos líneas que necesitamos.
|
|
88
|
-
// Evitamos depender de un parser YAML completo (zero-deps).
|
|
89
|
-
const faseMatch = fm.match(/^fase:\s*(\S+)/m);
|
|
90
|
-
const dominioMatch = fm.match(/^dominio:\s*(\S+)/m);
|
|
91
|
-
|
|
92
|
-
const result = {
|
|
93
|
-
fase: faseMatch ? faseMatch[1].trim() : null,
|
|
94
|
-
dominio: dominioMatch ? dominioMatch[1].trim() : null,
|
|
95
|
-
};
|
|
96
|
-
_cache[agentName] = result;
|
|
97
|
-
return { ...result, source: 'frontmatter' };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Limpia el cache (para tests o tras modificar agentes).
|
|
102
|
-
*/
|
|
103
|
-
function clearCache() {
|
|
104
|
-
for (const k of Object.keys(_cache)) delete _cache[k];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
module.exports = { getRouting, resolveAgentPath, clearCache };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* agent-routing.js — Helper para inferir fase y dominio del routing.
|
|
5
|
+
*
|
|
6
|
+
* Lee el frontmatter del agente (agentes/<nombre>.md) y extrae los campos
|
|
7
|
+
* `fase` y `dominio` introducidos en v1.1.0 (ADR 0012). El orquestador no
|
|
8
|
+
* registra explícitamente "qué fase/dominio motivó la elección" — pero
|
|
9
|
+
* cuando elige un agente, podemos asumir que lo eligió porque su fase y
|
|
10
|
+
* dominio matcheaban. Por lo tanto, leer el frontmatter del agente
|
|
11
|
+
* efectivamente invocado nos da la celda fase×dominio del routing.
|
|
12
|
+
*
|
|
13
|
+
* Esto es proxy de precisión, no precisión absoluta:
|
|
14
|
+
* - Tasa de éxito por celda (fase, dominio) sirve como indicador de
|
|
15
|
+
* que el routing está enviando trabajo correctamente al agente
|
|
16
|
+
* adecuado.
|
|
17
|
+
* - Una celda con tasa de éxito baja sugiere routing impreciso (el
|
|
18
|
+
* agente recibe trabajo que no le compete) o agente sub-óptimo.
|
|
19
|
+
*
|
|
20
|
+
* Cache simple en memoria del proceso para evitar I/O repetida (cada
|
|
21
|
+
* invocación de hook es proceso fresco, así que el cache no persiste,
|
|
22
|
+
* pero protege dentro de la misma invocación).
|
|
23
|
+
*
|
|
24
|
+
* @module hooks/lib/agent-routing
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const fs = require('fs');
|
|
28
|
+
const path = require('path');
|
|
29
|
+
|
|
30
|
+
const _cache = Object.create(null);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resuelve la ruta del archivo de agente. Acepta tanto el repo madre como
|
|
34
|
+
* proyectos consumidores (donde los agentes pueden estar en otras rutas).
|
|
35
|
+
*
|
|
36
|
+
* @param {string} agentName - p.ej. "backend-python-swl"
|
|
37
|
+
* @param {string} [cwd] - Directorio de proyecto (default process.cwd())
|
|
38
|
+
* @returns {string|null} - Ruta absoluta o null si no existe
|
|
39
|
+
*/
|
|
40
|
+
function resolveAgentPath(agentName, cwd) {
|
|
41
|
+
const baseDir = cwd || process.cwd();
|
|
42
|
+
const candidates = [
|
|
43
|
+
path.join(baseDir, 'agentes', `${agentName}.md`),
|
|
44
|
+
path.join(baseDir, '.claude', 'agents', `${agentName}.md`),
|
|
45
|
+
];
|
|
46
|
+
for (const c of candidates) {
|
|
47
|
+
try { if (fs.statSync(c).isFile()) return c; } catch { /* siguiente */ }
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Extrae fase y dominio del frontmatter de un agente.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} agentName - Nombre del agente sin extensión
|
|
56
|
+
* @param {string} [cwd]
|
|
57
|
+
* @returns {{ fase: string|null, dominio: string|null, source: string }}
|
|
58
|
+
* - source: 'frontmatter' | 'cache' | 'unknown'
|
|
59
|
+
*/
|
|
60
|
+
function getRouting(agentName, cwd) {
|
|
61
|
+
if (!agentName) return { fase: null, dominio: null, source: 'unknown' };
|
|
62
|
+
if (_cache[agentName]) {
|
|
63
|
+
return { ..._cache[agentName], source: 'cache' };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const agentPath = resolveAgentPath(agentName, cwd);
|
|
67
|
+
if (!agentPath) {
|
|
68
|
+
const result = { fase: null, dominio: null, source: 'unknown' };
|
|
69
|
+
_cache[agentName] = { fase: null, dominio: null };
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let raw;
|
|
74
|
+
try {
|
|
75
|
+
raw = fs.readFileSync(agentPath, 'utf8');
|
|
76
|
+
} catch {
|
|
77
|
+
return { fase: null, dominio: null, source: 'unknown' };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const fmMatch = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
81
|
+
if (!fmMatch) {
|
|
82
|
+
_cache[agentName] = { fase: null, dominio: null };
|
|
83
|
+
return { fase: null, dominio: null, source: 'unknown' };
|
|
84
|
+
}
|
|
85
|
+
const fm = fmMatch[1];
|
|
86
|
+
|
|
87
|
+
// Parser minimalista — solo busca las dos líneas que necesitamos.
|
|
88
|
+
// Evitamos depender de un parser YAML completo (zero-deps).
|
|
89
|
+
const faseMatch = fm.match(/^fase:\s*(\S+)/m);
|
|
90
|
+
const dominioMatch = fm.match(/^dominio:\s*(\S+)/m);
|
|
91
|
+
|
|
92
|
+
const result = {
|
|
93
|
+
fase: faseMatch ? faseMatch[1].trim() : null,
|
|
94
|
+
dominio: dominioMatch ? dominioMatch[1].trim() : null,
|
|
95
|
+
};
|
|
96
|
+
_cache[agentName] = result;
|
|
97
|
+
return { ...result, source: 'frontmatter' };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Limpia el cache (para tests o tras modificar agentes).
|
|
102
|
+
*/
|
|
103
|
+
function clearCache() {
|
|
104
|
+
for (const k of Object.keys(_cache)) delete _cache[k];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
module.exports = { getRouting, resolveAgentPath, clearCache };
|