@saulwade/swl-ses 2.5.3 → 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.
- package/CLAUDE.md +192 -192
- package/README.md +600 -600
- package/agentes/auto-evolucion-swl.md +27 -3
- package/bin/swl-ses.js +32 -7
- package/comandos/swl/actualizar.md +174 -174
- package/comandos/swl/adoptar-proyecto.md +265 -265
- package/comandos/swl/aprender.md +836 -823
- package/comandos/swl/aprobar-plan.md +146 -146
- package/comandos/swl/auditar-deps.md +134 -134
- package/comandos/swl/autoresearch.md +264 -264
- package/comandos/swl/ayuda.md +224 -224
- package/comandos/swl/brainstorm.md +51 -51
- package/comandos/swl/briefing.md +119 -119
- package/comandos/swl/checkpoint.md +325 -325
- package/comandos/swl/claudemd.md +234 -234
- package/comandos/swl/compactar.md +310 -310
- package/comandos/swl/configurar-ci.md +235 -235
- package/comandos/swl/contexto.md +110 -110
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/crear-skill.md +292 -292
- package/comandos/swl/cron.md +194 -194
- package/comandos/swl/deuda-codigo.md +97 -97
- package/comandos/swl/discutir-fase.md +169 -169
- package/comandos/swl/ejecutar-fase.md +233 -233
- package/comandos/swl/evaluar-skill.md +520 -505
- package/comandos/swl/evolucion-continua.md +73 -0
- package/comandos/swl/evolucionar.md +267 -254
- package/comandos/swl/exportar-vault.md +583 -583
- package/comandos/swl/fix.md +118 -118
- package/comandos/swl/gateway.md +158 -158
- package/comandos/swl/inbox.md +116 -116
- package/comandos/swl/instalar.md +220 -220
- package/comandos/swl/instintos.md +86 -86
- package/comandos/swl/mapear-codebase.md +312 -312
- package/comandos/swl/mcp-status.md +175 -175
- package/comandos/swl/modelo.md +100 -100
- package/comandos/swl/nemesis.md +433 -433
- package/comandos/swl/notificaciones.md +299 -299
- package/comandos/swl/nuevo-proyecto.md +251 -251
- package/comandos/swl/planear-fase.md +263 -263
- package/comandos/swl/plugins.md +256 -256
- package/comandos/swl/predecir.md +169 -169
- package/comandos/swl/reflect-skills.md +125 -125
- package/comandos/swl/release.md +450 -450
- package/comandos/swl/revisar-impacto.md +201 -201
- package/comandos/swl/revisar.md +330 -330
- package/comandos/swl/seguridad.md +189 -189
- package/comandos/swl/sesiones.md +200 -200
- package/comandos/swl/skill-search.md +113 -113
- package/comandos/swl/status.md +343 -343
- package/comandos/swl/verificar.md +817 -817
- package/comandos/swl/wiki.md +620 -620
- package/gateway/cron/jobs.example.json +12 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -276
- package/habilidades/autoresearch/SKILL.md +3 -2
- package/habilidades/benchmark-memoria/SKILL.md +7 -7
- package/habilidades/changelog-generator/SKILL.md +174 -174
- package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
- package/habilidades/checkpoints-verificacion/SKILL.md +6 -0
- package/habilidades/context-builder/SKILL.md +4 -0
- package/habilidades/doubt-driven-review/SKILL.md +207 -191
- package/habilidades/drift-detection/SKILL.md +6 -1
- package/habilidades/ejecutar-fase/SKILL.md +6 -6
- package/habilidades/eval-framework/SKILL.md +8 -3
- package/habilidades/harness-claude-code/SKILL.md +312 -308
- package/habilidades/infra-github-actions/SKILL.md +4 -3
- package/habilidades/instalar-sistema/SKILL.md +227 -223
- package/habilidades/memoria-busqueda/SKILL.md +31 -39
- package/habilidades/planear-fase/SKILL.md +358 -350
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +3 -2
- package/habilidades/swl-claudemd/SKILL.md +6 -7
- package/habilidades/swl-dashboard/SKILL.md +11 -43
- package/habilidades/tdd-workflow/SKILL.md +749 -744
- package/habilidades/validacion-ci-sistema/SKILL.md +1 -1
- package/hooks/agente-lifecycle.js +2 -1
- package/hooks/aiisms-detector.js +13 -4
- package/hooks/audit-trail.js +2 -1
- package/hooks/auto-consolidacion.js +2 -1
- package/hooks/captura-acciones-post.js +2 -1
- package/hooks/captura-acciones-session.js +2 -1
- package/hooks/captura-feedback-usuario.js +3 -2
- package/hooks/claudemd-bloat-detector.js +12 -3
- package/hooks/claudemd-duplicacion-detector.js +13 -3
- package/hooks/contexto-iteracion.js +2 -1
- package/hooks/degradacion-instintos.js +2 -1
- package/hooks/extraccion-aprendizajes.js +109 -15
- package/hooks/grafo-contexto.js +2 -1
- package/hooks/guardrail-modelo.js +2 -1
- package/hooks/inbox-aviso.js +2 -1
- package/hooks/inyeccion-contexto.js +2 -1
- package/hooks/lib/agent-matcher.js +2 -1
- package/hooks/lib/agent-routing.js +2 -1
- package/hooks/lib/autonomia.js +5 -3
- package/hooks/lib/captura-acciones.js +2 -1
- package/hooks/lib/consolidation-lock.js +21 -10
- package/hooks/lib/etapa-auto-evolucion.js +10 -4
- package/hooks/lib/etapa-metricas.js +2 -1
- package/hooks/lib/etapa-perfil-usuario.js +20 -4
- package/hooks/lib/evolution-tracker.js +2 -1
- package/hooks/lib/gateway-notify.js +193 -179
- package/hooks/lib/loop-telemetry.js +5 -4
- package/hooks/lib/mcp-health.js +2 -1
- package/hooks/lib/memory-search.js +4 -0
- package/hooks/lib/merkle-audit.js +58 -6
- package/hooks/lib/nudge-tracker.js +2 -1
- package/hooks/lib/otlp-exporter.js +2 -1
- package/hooks/lib/propose-step.js +3 -2
- package/hooks/lib/raiz-proyecto.js +102 -0
- package/hooks/lib/run-log.js +2 -1
- package/hooks/lib/singleton-guard.js +218 -27
- package/hooks/lib/telegram-cliente.js +17 -8
- package/hooks/preservar-estado-pre-compact.js +2 -1
- package/hooks/proteccion-rutas.js +59 -3
- package/hooks/registro-turnos.js +2 -1
- package/hooks/resumen-sesion.js +2 -1
- package/hooks/risk-scoring.js +2 -1
- package/hooks/rotar-audit-auto.js +46 -20
- package/hooks/session-briefing.js +127 -1
- package/hooks/spec-gate.js +2 -1
- package/hooks/sugerir-contribuir.js +6 -3
- package/hooks/sugerir-regenerar-inventario.js +3 -2
- package/hooks/tdd-gate.js +2 -1
- package/hooks/telemetria-agentes.js +2 -1
- package/hooks/telemetria-skill-routing.js +2 -1
- package/hooks/tracking-costos.js +4 -3
- package/hooks/validar-formato-post-subagente.js +2 -1
- package/hooks/validar-intent-spec.js +2 -1
- package/hooks/validar-memoria-hook.js +13 -3
- package/hooks/validar-planning-paths.js +2 -1
- package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +53 -0
- package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +372 -0
- package/instintos/perfil-usuario.yaml +506 -3
- package/instintos/proyecto.yaml +78 -0
- package/llms.txt +2 -2
- package/manifiestos/canonical-hashes.json +335 -3
- package/manifiestos/modulos.json +19 -14
- package/manifiestos/planning-paths.json +1 -0
- package/manifiestos/skills-lock.json +50 -50
- package/package.json +2 -3
- package/plugin.json +2 -2
- package/scripts/actualizar.js +3 -0
- package/scripts/auditar-clases-conocidas.js +32 -4
- package/scripts/benchmark-memoria.js +1 -0
- package/scripts/cli/autonomia.js +23 -0
- package/scripts/cli/benchmark-memoria.js +37 -0
- package/scripts/cli/ciclo-autonomo.js +73 -0
- package/scripts/cli/ciclo-fase-b.js +102 -0
- package/scripts/cli/guardrail-metrics.js +39 -0
- package/scripts/cli/loop-telemetry.js +4 -2
- package/scripts/cli/memoria-search.js +69 -0
- package/scripts/cli/nudge-accionar.js +39 -0
- package/scripts/cli/run-eval.js +38 -0
- package/scripts/cli/run-skill-evals.js +13 -2
- package/scripts/derivar-feature-list.js +15 -14
- package/scripts/desinstalar.js +11 -0
- package/scripts/doctor.js +24 -10
- package/scripts/instalador.js +85 -7
- package/scripts/lib/activar-hooks-proyecto.js +12 -0
- package/scripts/lib/auditar-invocaciones-comandos.js +96 -6
- package/scripts/lib/ciclo-autonomo/candidatos.js +174 -0
- package/scripts/lib/ciclo-autonomo/config.js +165 -0
- package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -0
- package/scripts/lib/ciclo-autonomo/fallback.js +77 -0
- package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -0
- package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -0
- package/scripts/lib/ciclo-autonomo/index.js +301 -0
- package/scripts/lib/ciclo-autonomo/lock.js +124 -0
- package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -0
- package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -0
- package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -0
- package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -0
- package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -0
- package/scripts/lib/estado.js +9 -0
- package/scripts/lib/gitignore-manifest.js +8 -1
- package/scripts/lib/hooks-settings.js +45 -0
- package/scripts/rotar-audit-logs.js +48 -2
- package/scripts/run-eval.js +1 -0
- package/scripts/run-skill-evals.js +287 -8
- package/scripts/smoke-test.js +16 -8
- package/scripts/tui/pantallas/install-wizard.js +403 -347
- package/scripts/validar.js +40 -1
|
@@ -1,201 +1,201 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: swl:revisar-impacto
|
|
3
|
-
description: Analiza el impacto estructural de cambios usando el grafo de dependencias SWL. Proporciona blast radius topológico real, god nodes, comunidades y conexiones sorpresivas. Potenciado por graph-builder.py + graph-analyze.py (graphify-3 patterns).
|
|
4
|
-
allowed_tools: ["Bash", "Read"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /swl:revisar-impacto — Análisis de impacto estructural
|
|
8
|
-
|
|
9
|
-
Usa el grafo de dependencias de swl-ses para responder:
|
|
10
|
-
¿qué se rompe si modifico esto? ¿cuál es el riesgo real de estos cambios?
|
|
11
|
-
|
|
12
|
-
## Uso
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
/swl:revisar-impacto — Resumen topológico general
|
|
16
|
-
/swl:revisar-impacto build — Construir/reconstruir el grafo
|
|
17
|
-
/swl:revisar-impacto build --force — Reconstruir ignorando cache SHA256
|
|
18
|
-
/swl:revisar-impacto status — Estado del grafo actual
|
|
19
|
-
/swl:revisar-impacto impacto <nombre> — Blast radius de un componente
|
|
20
|
-
/swl:revisar-impacto god_nodes [--top N] — Componentes más conectados
|
|
21
|
-
/swl:revisar-impacto comunidades — Estructura modular del sistema
|
|
22
|
-
/swl:revisar-impacto sorpresivo — Acoplamiento oculto cross-community
|
|
23
|
-
/swl:revisar-impacto preguntas — Preguntas arquitectónicas del grafo
|
|
24
|
-
/swl:revisar-impacto diff <grafo1> <grafo2> — Cambios entre dos snapshots
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Paso 0 — Verificar grafo disponible
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
ls .planning/graph.json .planning/REPORTE-GRAFO.md 2>/dev/null \
|
|
33
|
-
&& echo "GRAFO DISPONIBLE" || echo "GRAFO NO CONSTRUIDO"
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Si el grafo no existe, construirlo con `build` antes de cualquier análisis.
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Subcomando: build
|
|
41
|
-
|
|
42
|
-
Construye el grafo de dependencias desde los metadatos del sistema.
|
|
43
|
-
Parsea: `agentes/*.md`, `habilidades/*/SKILL.md`, `hooks/*.js`, `hooks/lib/*.js`, `comandos/swl/*.md`.
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
python scripts/lib/graph-builder.py
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Con flag `--force` ignora el cache SHA256 y reparse todos los archivos:
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
python scripts/lib/graph-builder.py --force
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Salidas generadas:
|
|
56
|
-
- `.planning/graph.json` — grafo persistente (networkx node-link format)
|
|
57
|
-
- `.planning/REPORTE-GRAFO.md` — reporte legible para agentes
|
|
58
|
-
- `.planning/graph-cache.json` — cache SHA256 por archivo
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Subcomando: status
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
python scripts/lib/graph-builder.py --stats
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Muestra conteo de nodos por tipo y aristas totales.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## Subcomando: impacto (blast radius)
|
|
73
|
-
|
|
74
|
-
Calcula qué componentes quedan afectados si un nodo cambia.
|
|
75
|
-
Usa BFS en el grafo invertido a profundidad 3.
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
python scripts/lib/graph-analyze.py blast_radius <nombre>
|
|
79
|
-
# Ejemplos:
|
|
80
|
-
python scripts/lib/graph-analyze.py blast_radius event-bus
|
|
81
|
-
python scripts/lib/graph-analyze.py blast_radius fastapi-experto
|
|
82
|
-
python scripts/lib/graph-analyze.py blast_radius atomic-write
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Interpretar el resultado:
|
|
86
|
-
- **dependientes**: componentes que dependen de `<nombre>` — se ven afectados si cambia
|
|
87
|
-
- **dependencias**: qué usa `<nombre>` — se ven afectados si fallan
|
|
88
|
-
- **grado alto** → blast radius alto → mayor precaución al modificar
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Subcomando: god_nodes
|
|
93
|
-
|
|
94
|
-
Identifica los componentes más conectados del sistema (single points of failure).
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
python scripts/lib/graph-analyze.py god_nodes --top 10
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Un god node con grado > 5 debe considerarse un componente crítico.
|
|
101
|
-
Modificarlo requiere revisión de todos sus dependientes.
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Subcomando: comunidades
|
|
106
|
-
|
|
107
|
-
Detecta módulos funcionales automáticamente mediante Louvain community detection.
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
python scripts/lib/graph-cluster.py
|
|
111
|
-
# Salida JSON:
|
|
112
|
-
python scripts/lib/graph-cluster.py json
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Interpretar:
|
|
116
|
-
- **cohesión < 0.10** con ≥ 5 nodos → comunidad candidata a refactoring
|
|
117
|
-
- **comunidades bien cohesionadas** → módulos funcionalmente coherentes
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Subcomando: sorpresivo
|
|
122
|
-
|
|
123
|
-
Detecta acoplamiento oculto: aristas cross-community inesperadas.
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
python scripts/lib/graph-analyze.py sorpresivo
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Una conexión "sorpresiva" es aquella que cruza comunidades y conecta tipos
|
|
130
|
-
distintos de componentes — acoplamiento que debería hacerse explícito.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Subcomando: preguntas
|
|
135
|
-
|
|
136
|
-
Genera preguntas arquitectónicas derivadas de la topología del grafo.
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
python scripts/lib/graph-analyze.py preguntas
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Fuentes: bridge nodes (alta betweenness), god nodes (alto grado), nodos huérfanos,
|
|
143
|
-
comunidades de baja cohesión. Alimentar al `arquitecto-swl` con estas preguntas.
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## Subcomando: diff
|
|
148
|
-
|
|
149
|
-
Compara dos snapshots del grafo para entender qué cambió estructuralmente.
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
# Guardar snapshot antes de los cambios:
|
|
153
|
-
cp .planning/graph.json .planning/graph-before.json
|
|
154
|
-
|
|
155
|
-
# Hacer cambios, reconstruir grafo:
|
|
156
|
-
python scripts/lib/graph-builder.py --force
|
|
157
|
-
|
|
158
|
-
# Comparar:
|
|
159
|
-
python scripts/lib/graph-analyze.py diff .planning/graph-before.json .planning/graph.json
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Flujo recomendado pre-modificación de componente crítico
|
|
165
|
-
|
|
166
|
-
```bash
|
|
167
|
-
# 1. Verificar que el grafo está actualizado
|
|
168
|
-
python scripts/lib/graph-builder.py
|
|
169
|
-
|
|
170
|
-
# 2. Calcular blast radius del componente a modificar
|
|
171
|
-
python scripts/lib/graph-analyze.py blast_radius <nombre>
|
|
172
|
-
|
|
173
|
-
# 3. Ver si es un god node
|
|
174
|
-
python scripts/lib/graph-analyze.py god_nodes --top 20 | grep <nombre>
|
|
175
|
-
|
|
176
|
-
# 4. Verificar comunidad del componente
|
|
177
|
-
python scripts/lib/graph-cluster.py json | python -c "
|
|
178
|
-
import json,sys
|
|
179
|
-
data=json.load(sys.stdin)
|
|
180
|
-
nombre='<nombre>'
|
|
181
|
-
for cid,c in data.items():
|
|
182
|
-
if nombre in c['nodos']:
|
|
183
|
-
print(f'Comunidad {cid}: {c[\"etiqueta\"]} (cohesión {c[\"cohesion\"]})')
|
|
184
|
-
"
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Cómo usar REPORTE-GRAFO.md
|
|
190
|
-
|
|
191
|
-
El archivo `.planning/REPORTE-GRAFO.md` es inyectado automáticamente por el hook
|
|
192
|
-
`grafo-contexto.js` antes de cualquier búsqueda de archivos (Glob/Grep/Read).
|
|
193
|
-
|
|
194
|
-
Esto significa que los agentes tienen contexto del grafo ANTES de leer archivos raw,
|
|
195
|
-
reduciendo el número de tool calls para mapear el codebase.
|
|
196
|
-
|
|
197
|
-
Para leer el reporte directamente:
|
|
198
|
-
|
|
199
|
-
```bash
|
|
200
|
-
cat .planning/REPORTE-GRAFO.md
|
|
201
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: swl:revisar-impacto
|
|
3
|
+
description: Analiza el impacto estructural de cambios usando el grafo de dependencias SWL. Proporciona blast radius topológico real, god nodes, comunidades y conexiones sorpresivas. Potenciado por graph-builder.py + graph-analyze.py (graphify-3 patterns).
|
|
4
|
+
allowed_tools: ["Bash", "Read"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:revisar-impacto — Análisis de impacto estructural
|
|
8
|
+
|
|
9
|
+
Usa el grafo de dependencias de swl-ses para responder:
|
|
10
|
+
¿qué se rompe si modifico esto? ¿cuál es el riesgo real de estos cambios?
|
|
11
|
+
|
|
12
|
+
## Uso
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
/swl:revisar-impacto — Resumen topológico general
|
|
16
|
+
/swl:revisar-impacto build — Construir/reconstruir el grafo
|
|
17
|
+
/swl:revisar-impacto build --force — Reconstruir ignorando cache SHA256
|
|
18
|
+
/swl:revisar-impacto status — Estado del grafo actual
|
|
19
|
+
/swl:revisar-impacto impacto <nombre> — Blast radius de un componente
|
|
20
|
+
/swl:revisar-impacto god_nodes [--top N] — Componentes más conectados
|
|
21
|
+
/swl:revisar-impacto comunidades — Estructura modular del sistema
|
|
22
|
+
/swl:revisar-impacto sorpresivo — Acoplamiento oculto cross-community
|
|
23
|
+
/swl:revisar-impacto preguntas — Preguntas arquitectónicas del grafo
|
|
24
|
+
/swl:revisar-impacto diff <grafo1> <grafo2> — Cambios entre dos snapshots
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Paso 0 — Verificar grafo disponible
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
ls .planning/graph.json .planning/REPORTE-GRAFO.md 2>/dev/null \
|
|
33
|
+
&& echo "GRAFO DISPONIBLE" || echo "GRAFO NO CONSTRUIDO"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Si el grafo no existe, construirlo con `build` antes de cualquier análisis.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Subcomando: build
|
|
41
|
+
|
|
42
|
+
Construye el grafo de dependencias desde los metadatos del sistema.
|
|
43
|
+
Parsea: `agentes/*.md`, `habilidades/*/SKILL.md`, `hooks/*.js`, `hooks/lib/*.js`, `comandos/swl/*.md`.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
python scripts/lib/graph-builder.py
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Con flag `--force` ignora el cache SHA256 y reparse todos los archivos:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
python scripts/lib/graph-builder.py --force
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Salidas generadas:
|
|
56
|
+
- `.planning/graph.json` — grafo persistente (networkx node-link format)
|
|
57
|
+
- `.planning/REPORTE-GRAFO.md` — reporte legible para agentes
|
|
58
|
+
- `.planning/graph-cache.json` — cache SHA256 por archivo
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Subcomando: status
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
python scripts/lib/graph-builder.py --stats
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Muestra conteo de nodos por tipo y aristas totales.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Subcomando: impacto (blast radius)
|
|
73
|
+
|
|
74
|
+
Calcula qué componentes quedan afectados si un nodo cambia.
|
|
75
|
+
Usa BFS en el grafo invertido a profundidad 3.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
python scripts/lib/graph-analyze.py blast_radius <nombre>
|
|
79
|
+
# Ejemplos:
|
|
80
|
+
python scripts/lib/graph-analyze.py blast_radius event-bus
|
|
81
|
+
python scripts/lib/graph-analyze.py blast_radius fastapi-experto
|
|
82
|
+
python scripts/lib/graph-analyze.py blast_radius atomic-write
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Interpretar el resultado:
|
|
86
|
+
- **dependientes**: componentes que dependen de `<nombre>` — se ven afectados si cambia
|
|
87
|
+
- **dependencias**: qué usa `<nombre>` — se ven afectados si fallan
|
|
88
|
+
- **grado alto** → blast radius alto → mayor precaución al modificar
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Subcomando: god_nodes
|
|
93
|
+
|
|
94
|
+
Identifica los componentes más conectados del sistema (single points of failure).
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
python scripts/lib/graph-analyze.py god_nodes --top 10
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Un god node con grado > 5 debe considerarse un componente crítico.
|
|
101
|
+
Modificarlo requiere revisión de todos sus dependientes.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Subcomando: comunidades
|
|
106
|
+
|
|
107
|
+
Detecta módulos funcionales automáticamente mediante Louvain community detection.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
python scripts/lib/graph-cluster.py
|
|
111
|
+
# Salida JSON:
|
|
112
|
+
python scripts/lib/graph-cluster.py json
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Interpretar:
|
|
116
|
+
- **cohesión < 0.10** con ≥ 5 nodos → comunidad candidata a refactoring
|
|
117
|
+
- **comunidades bien cohesionadas** → módulos funcionalmente coherentes
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Subcomando: sorpresivo
|
|
122
|
+
|
|
123
|
+
Detecta acoplamiento oculto: aristas cross-community inesperadas.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
python scripts/lib/graph-analyze.py sorpresivo
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Una conexión "sorpresiva" es aquella que cruza comunidades y conecta tipos
|
|
130
|
+
distintos de componentes — acoplamiento que debería hacerse explícito.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Subcomando: preguntas
|
|
135
|
+
|
|
136
|
+
Genera preguntas arquitectónicas derivadas de la topología del grafo.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
python scripts/lib/graph-analyze.py preguntas
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Fuentes: bridge nodes (alta betweenness), god nodes (alto grado), nodos huérfanos,
|
|
143
|
+
comunidades de baja cohesión. Alimentar al `arquitecto-swl` con estas preguntas.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Subcomando: diff
|
|
148
|
+
|
|
149
|
+
Compara dos snapshots del grafo para entender qué cambió estructuralmente.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Guardar snapshot antes de los cambios:
|
|
153
|
+
cp .planning/graph.json .planning/graph-before.json
|
|
154
|
+
|
|
155
|
+
# Hacer cambios, reconstruir grafo:
|
|
156
|
+
python scripts/lib/graph-builder.py --force
|
|
157
|
+
|
|
158
|
+
# Comparar:
|
|
159
|
+
python scripts/lib/graph-analyze.py diff .planning/graph-before.json .planning/graph.json
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Flujo recomendado pre-modificación de componente crítico
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# 1. Verificar que el grafo está actualizado
|
|
168
|
+
python scripts/lib/graph-builder.py
|
|
169
|
+
|
|
170
|
+
# 2. Calcular blast radius del componente a modificar
|
|
171
|
+
python scripts/lib/graph-analyze.py blast_radius <nombre>
|
|
172
|
+
|
|
173
|
+
# 3. Ver si es un god node
|
|
174
|
+
python scripts/lib/graph-analyze.py god_nodes --top 20 | grep <nombre>
|
|
175
|
+
|
|
176
|
+
# 4. Verificar comunidad del componente
|
|
177
|
+
python scripts/lib/graph-cluster.py json | python -c "
|
|
178
|
+
import json,sys
|
|
179
|
+
data=json.load(sys.stdin)
|
|
180
|
+
nombre='<nombre>'
|
|
181
|
+
for cid,c in data.items():
|
|
182
|
+
if nombre in c['nodos']:
|
|
183
|
+
print(f'Comunidad {cid}: {c[\"etiqueta\"]} (cohesión {c[\"cohesion\"]})')
|
|
184
|
+
"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Cómo usar REPORTE-GRAFO.md
|
|
190
|
+
|
|
191
|
+
El archivo `.planning/REPORTE-GRAFO.md` es inyectado automáticamente por el hook
|
|
192
|
+
`grafo-contexto.js` antes de cualquier búsqueda de archivos (Glob/Grep/Read).
|
|
193
|
+
|
|
194
|
+
Esto significa que los agentes tienen contexto del grafo ANTES de leer archivos raw,
|
|
195
|
+
reduciendo el número de tool calls para mapear el codebase.
|
|
196
|
+
|
|
197
|
+
Para leer el reporte directamente:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
cat .planning/REPORTE-GRAFO.md
|
|
201
|
+
```
|