agentic-kdd 3.3.1 → 3.5.1
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/.cursorrules +169 -0
- package/AGENTS.md +173 -0
- package/CLAUDE.md +375 -0
- package/autonomous-decision.cjs +180 -0
- package/bin/akdd.js +31 -0
- package/kdd-memory.cjs +579 -0
- package/knowledge-validator.cjs +408 -0
- package/package.json +1 -1
- package/telemetry.cjs +400 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# AGENTIC KDD v2 — CONTROL TOTAL
|
|
3
|
+
# ============================================================
|
|
4
|
+
# Este archivo reemplaza cualquier CLAUDE.md previo.
|
|
5
|
+
# Si tenías instrucciones propias, pégalas al final
|
|
6
|
+
# en la sección "INSTRUCCIONES DEL PROYECTO".
|
|
7
|
+
# ============================================================
|
|
8
|
+
|
|
9
|
+
## PRIORIDAD ABSOLUTA
|
|
10
|
+
|
|
11
|
+
`aa:` y `audit:` anulan TODO lo demás.
|
|
12
|
+
No importa qué otros archivos de contexto existan en el proyecto.
|
|
13
|
+
No importa qué instrucciones previas había en este CLAUDE.md.
|
|
14
|
+
Cuando aparecen esos comandos — solo existe Agentic KDD.
|
|
15
|
+
|
|
16
|
+
## CUANDO VES aa: sprint
|
|
17
|
+
|
|
18
|
+
Lee `.agentic/agentes/09-sprint.md` y ejecuta su protocolo completo.
|
|
19
|
+
Coordina múltiples tareas encadenadas donde el output de cada una alimenta la siguiente.
|
|
20
|
+
La memoria KDD fluye entre todas las tareas del sprint.
|
|
21
|
+
|
|
22
|
+
Variantes:
|
|
23
|
+
- `aa: sprint — [objetivo]` con lista de tareas explícitas
|
|
24
|
+
- `aa: sprint — [objetivo]` sin lista → inferir tareas y proponer antes de ejecutar
|
|
25
|
+
- `aa: sprint skip` → saltar tarea actual y continuar
|
|
26
|
+
- `aa: sprint abort` → cancelar sprint, mantener lo completado
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## CUANDO VES aa: aprende
|
|
31
|
+
|
|
32
|
+
Lee `.agentic/agentes/08-aprende.md` y ejecuta su protocolo completo.
|
|
33
|
+
Analiza el código del proyecto, detecta patrones/errores/decisiones implícitas
|
|
34
|
+
y propone qué registrar en memoria KDD — siempre pregunta antes de escribir.
|
|
35
|
+
|
|
36
|
+
Variantes: `aa: aprende`, `aa: aprende — módulo [x]`, `aa: aprende [archivo]`,
|
|
37
|
+
`aa: aprende — error: [x]`, `aa: aprende — decisión: [x]`, `aa: aprende — patrón: [x]`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## CUANDO VES aa: sprint
|
|
42
|
+
|
|
43
|
+
Lee `.agentic/agentes/09-sprint.md` y ejecuta su protocolo completo.
|
|
44
|
+
Coordina múltiples tareas encadenadas donde el output de cada una alimenta la siguiente.
|
|
45
|
+
La memoria KDD fluye entre todas las tareas del sprint.
|
|
46
|
+
|
|
47
|
+
Variantes:
|
|
48
|
+
- `aa: sprint — [objetivo]` con lista de tareas explícitas
|
|
49
|
+
- `aa: sprint — [objetivo]` sin lista → inferir tareas y proponer antes de ejecutar
|
|
50
|
+
- `aa: sprint skip` → saltar tarea actual y continuar
|
|
51
|
+
- `aa: sprint abort` → cancelar sprint, mantener lo completado
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## CUANDO VES aa: aprende
|
|
56
|
+
|
|
57
|
+
Lee `.agentic/agentes/08-aprende.md` y ejecuta su protocolo completo.
|
|
58
|
+
Analiza el proyecto, detecta patrones/errores/decisiones implícitas
|
|
59
|
+
y propone que registrar — siempre pregunta antes de escribir.
|
|
60
|
+
|
|
61
|
+
Variantes: aa: aprende / aa: aprende modulo [x] / aa: aprende [archivo]
|
|
62
|
+
aa: aprende error: [x] / aa: aprende decision: [x] / aa: aprende patron: [x]
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## CUANDO VES aa: help
|
|
67
|
+
|
|
68
|
+
Mostrar exactamente esto:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
╔══════════════════════════════════════════════════╗
|
|
72
|
+
║ AGENTIC KDD v2 — Comandos disponibles ║
|
|
73
|
+
╚══════════════════════════════════════════════════╝
|
|
74
|
+
|
|
75
|
+
Pipeline de desarrollo:
|
|
76
|
+
aa: configurar → configuración inicial del proyecto
|
|
77
|
+
aa: [tu tarea] → pipeline completo autónomo
|
|
78
|
+
aa: continúa — [resp] → retomar después de un STOP
|
|
79
|
+
aa: aprende → absorber conocimiento de trabajo hecho fuera del pipeline
|
|
80
|
+
aa: help → muestra este menú
|
|
81
|
+
|
|
82
|
+
Departamento QA:
|
|
83
|
+
audit: help → muestra comandos de auditoría
|
|
84
|
+
audit: auditar → auditoría completa
|
|
85
|
+
audit: [área] → auditoría específica
|
|
86
|
+
|
|
87
|
+
Consulta del grafo (en terminal):
|
|
88
|
+
akdd graph → estado del grafo de conocimiento
|
|
89
|
+
akdd update → actualizar Agentic KDD
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## CUANDO VES aa: sprint
|
|
93
|
+
|
|
94
|
+
Lee `.agentic/agentes/09-sprint.md` y ejecuta su protocolo completo.
|
|
95
|
+
Coordina múltiples tareas encadenadas donde el output de cada una alimenta la siguiente.
|
|
96
|
+
La memoria KDD fluye entre todas las tareas del sprint.
|
|
97
|
+
|
|
98
|
+
Variantes:
|
|
99
|
+
- `aa: sprint — [objetivo]` con lista de tareas explícitas
|
|
100
|
+
- `aa: sprint — [objetivo]` sin lista → inferir tareas y proponer antes de ejecutar
|
|
101
|
+
- `aa: sprint skip` → saltar tarea actual y continuar
|
|
102
|
+
- `aa: sprint abort` → cancelar sprint, mantener lo completado
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## CUANDO VES aa: aprende
|
|
107
|
+
|
|
108
|
+
Lee `.agentic/agentes/08-aprende.md` y ejecuta su protocolo.
|
|
109
|
+
Analiza el código, detecta patrones/errores/decisiones implícitas
|
|
110
|
+
y propone qué registrar en memoria KDD antes de escribir nada.
|
|
111
|
+
|
|
112
|
+
Variantes:
|
|
113
|
+
- `aa: aprende` → analiza todo
|
|
114
|
+
- `aa: aprende — módulo [x]` → foco en módulo
|
|
115
|
+
- `aa: aprende [archivo]` → foco en archivo
|
|
116
|
+
- `aa: aprende — error: [x]` → registrar error directo
|
|
117
|
+
- `aa: aprende — decisión: [x]` → registrar decisión directo
|
|
118
|
+
- `aa: aprende — patrón: [x]` → registrar patrón directo
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## CUANDO VES aa:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
1. Leer .agentic/config.md
|
|
126
|
+
2. Leer .agentic/memoria/trabajo.md
|
|
127
|
+
3. Si CONFIGURADO: NO → Setup primero
|
|
128
|
+
4. Ejecutar pipeline completo sin pausar entre agentes
|
|
129
|
+
5. No pedir confirmación al usuario entre fases
|
|
130
|
+
6. Detener SOLO ante STOP genuino
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Flujo completo:
|
|
134
|
+
Orquestador → Analista → Front/Back → QA → Memoria
|
|
135
|
+
|
|
136
|
+
## CUANDO VES audit:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
1. Leer .audit/AUDIT.md
|
|
140
|
+
2. Activar Director + subagentes indicados
|
|
141
|
+
3. Generar reporte en _output/audit-[fecha].md
|
|
142
|
+
4. NO tocar código — solo auditar
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
## CUANDO VES akdd <comando>
|
|
147
|
+
|
|
148
|
+
Si el usuario escribe `akdd <comando>` en el chat, llamar el MCP tool correspondiente.
|
|
149
|
+
El usuario NO necesita abrir terminal — funciona igual desde aquí.
|
|
150
|
+
|
|
151
|
+
| Usuario escribe | MCP tool a llamar |
|
|
152
|
+
|---|---|
|
|
153
|
+
| `akdd health` | `system_health` |
|
|
154
|
+
| `akdd health --fix` | `system_health` con `{fix: true}` |
|
|
155
|
+
| `akdd update` | `update_project` |
|
|
156
|
+
| `akdd collab init` | `collab_init` |
|
|
157
|
+
| `akdd collab invite` | `collab_invite` |
|
|
158
|
+
| `akdd collab status` | `collab_status` |
|
|
159
|
+
| `akdd metrics` | `metrics_summary` |
|
|
160
|
+
| `akdd benchmarks` | `report_benchmarks` |
|
|
161
|
+
| `akdd trail` | `recent_ciclos` |
|
|
162
|
+
| `akdd cure` | `mem_curate` |
|
|
163
|
+
| `akdd cure report` | `mem_curate` con `{mode: "report"}` |
|
|
164
|
+
| `akdd llms` | `generate_llms_txt` |
|
|
165
|
+
| `akdd ast` | `ast_index` |
|
|
166
|
+
| `akdd ast-impact <f>` | `ast_impact` con `{target: "<f>"}` |
|
|
167
|
+
| `akdd why <f>` | `decision_why` con `{target: "<f>"}` |
|
|
168
|
+
| `akdd audit` | `memory_audit` |
|
|
169
|
+
| `akdd causal-prune` | `causal_prune` |
|
|
170
|
+
|
|
171
|
+
Los comandos que SÍ requieren terminal (solo estos dos):
|
|
172
|
+
- `npm install -g agentic-kdd` → instalar el CLI por primera vez
|
|
173
|
+
- `akdd init` → primera instalación en un proyecto nuevo
|
|
174
|
+
|
|
175
|
+
Todo lo demás corre desde el chat.
|
|
176
|
+
|
|
177
|
+
## SIN aa: O audit:
|
|
178
|
+
|
|
179
|
+
Responder normalmente usando el contexto del proyecto.
|
|
180
|
+
|
|
181
|
+
## ARCHIVOS CLAVE
|
|
182
|
+
|
|
183
|
+
- `.agentic/config.md` → cerebro del proyecto
|
|
184
|
+
- `.agentic/PLAN.md` → tarea activa
|
|
185
|
+
- `.agentic/memoria/` → memoria KDD persistente
|
|
186
|
+
- `.agentic/agentes/` → instrucciones de cada agente
|
|
187
|
+
- `.agentic/conocimiento/` → docs del proyecto
|
|
188
|
+
- `.audit/` → Departamento QA
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
## RECUPERACIÓN DE SESIÓN
|
|
193
|
+
|
|
194
|
+
Si el usuario pega un bloque que empieza con `# Checkpoint Agentic KDD`:
|
|
195
|
+
1. Leer el checkpoint completo
|
|
196
|
+
2. Cargar el contexto de la última tarea y las anteriores
|
|
197
|
+
3. Responder: "✅ Contexto recuperado — continuando desde: [última tarea]"
|
|
198
|
+
4. Estar listo para ejecutar la siguiente instrucción con ese contexto
|
|
199
|
+
|
|
200
|
+
Si el usuario escribe `akdd historial`:
|
|
201
|
+
→ Llamar MCP tool `session_historial`
|
|
202
|
+
→ Mostrar el resultado formateado
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
## DRY-RUN MODE — aa: --dry-run
|
|
206
|
+
|
|
207
|
+
Si el usuario escribe `aa: --dry-run <tarea>`:
|
|
208
|
+
|
|
209
|
+
1. Correr Orquestador → Analista → Dev (SOLO planificación)
|
|
210
|
+
2. El Dev describe los cambios que HARÍA sin ejecutarlos:
|
|
211
|
+
- Lista de archivos que modificaría
|
|
212
|
+
- Diff propuesto por archivo (pseudocódigo o diff real si es posible)
|
|
213
|
+
- Contratos que verificaría
|
|
214
|
+
- Blast radius estimado
|
|
215
|
+
3. Presentar como:
|
|
216
|
+
```
|
|
217
|
+
📋 DRY-RUN: [tarea]
|
|
218
|
+
|
|
219
|
+
Archivos que modificaría:
|
|
220
|
+
- src/auth.ts (líneas 45-67: cambio de lógica de refresh token)
|
|
221
|
+
- src/session.ts (línea 12: actualizar TTL)
|
|
222
|
+
|
|
223
|
+
Contratos en riesgo: AUTH-001 (PROTECTED), AUTH-004 (VERIFIED)
|
|
224
|
+
Blast radius: HIGH (8 contratos)
|
|
225
|
+
|
|
226
|
+
¿Proceder con implementación real? (aa: implement [tarea])
|
|
227
|
+
```
|
|
228
|
+
4. NO escribir ningún archivo. NO correr tests. NO modificar memoria.
|
|
229
|
+
5. El dev decide si proceder con `aa: implement <tarea>`
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
## DENY LIST — Operaciones que requieren confirmación explícita
|
|
233
|
+
|
|
234
|
+
NUNCA ejecutar estas operaciones sin confirmación explícita en el chat:
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
REQUIEREN CONFIRMACIÓN EXPLÍCITA DEL DEV:
|
|
238
|
+
- rm -rf / rmdir /s → eliminar directorios completos
|
|
239
|
+
- DROP TABLE / DROP DATABASE → operaciones SQL destructivas
|
|
240
|
+
- DELETE FROM [tabla] sin WHERE → borrado masivo
|
|
241
|
+
- git push --force → force push a ramas protegidas
|
|
242
|
+
- npm publish → publicar paquetes npm
|
|
243
|
+
- docker rm / docker rmi → eliminar contenedores/imágenes
|
|
244
|
+
- Modificar .env, .env.production, secrets.* → archivos de secretos
|
|
245
|
+
- Migraciones SQL irreversibles → ALTER TABLE DROP COLUMN
|
|
246
|
+
- Deploy a producción → cualquier comando que afecte prod
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Si el pipeline genera una de estas operaciones:
|
|
250
|
+
1. STOP el pipeline
|
|
251
|
+
2. Mostrar exactamente qué operación intentaría correr
|
|
252
|
+
3. Preguntar confirmación explícita: "¿Confirmas ejecutar: [comando]?"
|
|
253
|
+
4. Solo proceder si el dev responde SÍ explícitamente
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
## ENCADENAMIENTO DE COMANDOS
|
|
257
|
+
|
|
258
|
+
Si el mensaje tiene esta forma:
|
|
259
|
+
```
|
|
260
|
+
aa: <tarea> audit: <tipo>
|
|
261
|
+
```
|
|
262
|
+
O cualquier combinación de `aa:` seguido de `audit:`, `ag:` u otro comando al final:
|
|
263
|
+
|
|
264
|
+
1. Ejecuta el pipeline `aa:` completo para la tarea
|
|
265
|
+
2. Al terminar, ejecuta automáticamente el comando encadenado
|
|
266
|
+
3. Reporta ambos resultados juntos al final
|
|
267
|
+
|
|
268
|
+
Ejemplos válidos:
|
|
269
|
+
```
|
|
270
|
+
aa: implementa el módulo de pagos audit: frontend
|
|
271
|
+
aa: refactoriza auth.ts audit: seguridad
|
|
272
|
+
aa: agrega las invitaciones ag: review src/routes/invitations.ts
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
El encadenamiento solo aplica cuando el segundo comando está AL FINAL del mensaje,
|
|
276
|
+
separado por espacio. No interrumpir el pipeline principal para ejecutarlo antes.
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
## QA MEJORADO — VALIDACIÓN CONTRA HISTORIAL
|
|
280
|
+
|
|
281
|
+
En la fase QA de cada ciclo `aa:`, además de verificar los criterios de aceptación
|
|
282
|
+
de la tarea actual, verificar lo siguiente contra la memoria del proyecto:
|
|
283
|
+
|
|
284
|
+
1. **Spec compliance** — ¿El comportamiento nuevo contradice alguna decisión
|
|
285
|
+
documentada en memoria con confianza HIGH o MEDIA?
|
|
286
|
+
Si sí → STOP con reporte exacto de la contradicción.
|
|
287
|
+
|
|
288
|
+
2. **Error pattern check** — ¿Alguno de los cambios toca un área donde hay
|
|
289
|
+
errores HIGH confidence en memoria?
|
|
290
|
+
Si sí → ejecutar los tests específicos de esa área antes de declarar PASS.
|
|
291
|
+
|
|
292
|
+
3. **Contract preservation** — El Preservation Gate ya cubre esto, pero en QA
|
|
293
|
+
también verificar que los contratos VERIFIED del módulo afectado siguen verdes.
|
|
294
|
+
|
|
295
|
+
4. **Behavioral consistency** — Si hay specs en `.agentic/specs/` para el módulo
|
|
296
|
+
tocado, verificar que el comportamiento nuevo es consistente con el spec.
|
|
297
|
+
|
|
298
|
+
Si alguno de estos checks falla → QA FAIL con razón específica, no solo
|
|
299
|
+
"tests failing". El dev necesita saber exactamente qué spec, qué error histórico
|
|
300
|
+
o qué contrato se está violando.
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
## DETECCIÓN Y CORRECCIÓN AUTÓNOMA DE PATRONES
|
|
304
|
+
|
|
305
|
+
Cuando durante un ciclo `aa:` encuentres el mismo patrón de error/bug en otros
|
|
306
|
+
módulos del proyecto, aplica esta lógica automáticamente:
|
|
307
|
+
|
|
308
|
+
### Paso 1 — Prerequisite check
|
|
309
|
+
Antes de aplicar los hallazgos, verificar si alguno bloquea la validación
|
|
310
|
+
del fix principal:
|
|
311
|
+
- ¿Algún módulo con el patrón es una dependencia del fix actual?
|
|
312
|
+
- Si SÍ → corrígelo PRIMERO, luego el fix pedido
|
|
313
|
+
|
|
314
|
+
### Paso 2 — Clasificar por riesgo (tabla de criticidad)
|
|
315
|
+
Para cada hallazgo, determinar el nivel de riesgo del archivo:
|
|
316
|
+
|
|
317
|
+
| Nivel | Acción autónoma |
|
|
318
|
+
|-----------|---------------------------------------------------|
|
|
319
|
+
| CRITICAL | NUNCA tocar solo — siempre avisar primero |
|
|
320
|
+
| SENSITIVE | Solo tocar si hay contrato verificado que respalde |
|
|
321
|
+
| NORMAL | Actuar solo si el patrón ya está en memoria |
|
|
322
|
+
| FREE | Actuar siempre autónomamente |
|
|
323
|
+
|
|
324
|
+
### Paso 3 — Aplicar
|
|
325
|
+
- Archivos AUTO_FIX → corregir en el mismo ciclo sin preguntar
|
|
326
|
+
- Archivos WARN → incluir en el reporte final como pendientes
|
|
327
|
+
|
|
328
|
+
### Paso 4 — Reporte al final del ciclo
|
|
329
|
+
Al terminar, incluir en el reporte:
|
|
330
|
+
```
|
|
331
|
+
✅ Tarea completada: [descripción]
|
|
332
|
+
|
|
333
|
+
🔍 Patrones detectados y corregidos autónomamente:
|
|
334
|
+
- [módulo]: [qué se corrigió] (riesgo: NORMAL, historial: 3x)
|
|
335
|
+
|
|
336
|
+
⚠️ Patrones detectados — requieren confirmación:
|
|
337
|
+
- [módulo]: [qué encontré] (riesgo: CRITICAL — revisar manualmente)
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
NO preguntar en medio del ciclo. NO interrumpir. Actuar y reportar al final.
|
|
341
|
+
|
|
342
|
+
## DETECCIÓN AUTOMÁTICA DE TAREAS SIN aa:
|
|
343
|
+
|
|
344
|
+
Esta regla actúa como red de seguridad para cuando el dev olvida escribir `aa:`.
|
|
345
|
+
|
|
346
|
+
Si el mensaje NO tiene `aa:` pero cumple los criterios de abajo,
|
|
347
|
+
trátalo exactamente como si tuviera `aa:` — ejecuta el pipeline completo.
|
|
348
|
+
|
|
349
|
+
### TRATAR COMO aa: si el mensaje:
|
|
350
|
+
- Empieza con verbo de acción técnica:
|
|
351
|
+
"implementa", "crea", "crea un", "fix", "arregla", "agrega", "añade",
|
|
352
|
+
"modifica", "refactoriza", "conecta", "integra", "genera", "construye",
|
|
353
|
+
"desarrolla", "corrige", "actualiza", "migra", "convierte", "extrae",
|
|
354
|
+
"aplica", "añade soporte", "haz que", "necesito que"
|
|
355
|
+
- Menciona un archivo o módulo específico: "en auth.ts", "en el módulo de pagos", "en src/"
|
|
356
|
+
- Tiene contexto técnico claro con intención de cambio: "el bug de X", "la feature de Y", "el error en Z"
|
|
357
|
+
- Empieza con prefijo técnico: `fix:` / `feat:` / `build:` / `dev:` / `chore:`
|
|
358
|
+
|
|
359
|
+
### NO ejecutar el pipeline si:
|
|
360
|
+
- Es una pregunta (termina en `?`)
|
|
361
|
+
- Empieza con: "explícame", "qué es", "cómo funciona", "cuándo", "por qué", "dónde", "muéstrame", "dame", "qué piensas"
|
|
362
|
+
- Es una consulta de estado: `akdd buscar`, `akdd health`, `akdd metrics`, `akdd trail`
|
|
363
|
+
- Es una conversación sobre el proyecto, no una acción sobre él
|
|
364
|
+
|
|
365
|
+
### Comportamiento al detectar tarea sin aa:
|
|
366
|
+
Antes de ejecutar, mostrar exactamente:
|
|
367
|
+
```
|
|
368
|
+
🔄 Detecté una tarea de desarrollo — ejecutando como aa:
|
|
369
|
+
```
|
|
370
|
+
Luego proceder con el pipeline completo como si el dev hubiera escrito `aa:`.
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
# ============================================================
|
|
374
|
+
# INSTRUCCIONES DEL PROYECTO — agregar las tuyas aquí abajo
|
|
375
|
+
# ============================================================
|
package/autonomous-decision.cjs
CHANGED
|
@@ -53,6 +53,186 @@ const BLAST_LEVELS = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };
|
|
|
53
53
|
|
|
54
54
|
const DEFERRED_QUEUE_PATH = '.agentic/deferred_queue.json';
|
|
55
55
|
|
|
56
|
+
// ─── FILE RISK TABLE ──────────────────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
const DEFAULT_RISK_TABLE = {
|
|
59
|
+
CRITICAL: ['auth.ts', 'middleware/', '.env', 'prisma/schema', 'secrets'],
|
|
60
|
+
SENSITIVE: ['routes/auth', 'lib/prisma', 'collab-manager', 'harness'],
|
|
61
|
+
NORMAL: ['routes/', 'lib/', 'services/', 'controllers/'],
|
|
62
|
+
FREE: ['tests/', '__tests__/', 'utils/', 'validators', 'constants'],
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
function classifyFileRisk(filePath, projectRoot) {
|
|
66
|
+
let riskTable = DEFAULT_RISK_TABLE;
|
|
67
|
+
try {
|
|
68
|
+
const configPath = path.join(projectRoot || process.cwd(), '.agentic/config.md');
|
|
69
|
+
const config = fs.readFileSync(configPath, 'utf8');
|
|
70
|
+
const tableMatch = config.match(/\[file_risk_table\]([\s\S]*?)(?=\[|$)/);
|
|
71
|
+
if (tableMatch) {
|
|
72
|
+
const lines = tableMatch[1].trim().split(/\r?\n/).filter(Boolean);
|
|
73
|
+
const custom = { CRITICAL: [], SENSITIVE: [], NORMAL: [], FREE: [] };
|
|
74
|
+
lines.forEach(function(line) {
|
|
75
|
+
const colonIdx = line.indexOf(':');
|
|
76
|
+
if (colonIdx < 0) return;
|
|
77
|
+
const lvl = line.substring(0, colonIdx).trim().toUpperCase();
|
|
78
|
+
const vals = line.substring(colonIdx + 1).split(',').map(function(p) { return p.trim(); }).filter(Boolean);
|
|
79
|
+
if (custom[lvl]) custom[lvl].push.apply(custom[lvl], vals);
|
|
80
|
+
});
|
|
81
|
+
riskTable = {
|
|
82
|
+
CRITICAL: DEFAULT_RISK_TABLE.CRITICAL.concat(custom.CRITICAL),
|
|
83
|
+
SENSITIVE: DEFAULT_RISK_TABLE.SENSITIVE.concat(custom.SENSITIVE),
|
|
84
|
+
NORMAL: DEFAULT_RISK_TABLE.NORMAL.concat(custom.NORMAL),
|
|
85
|
+
FREE: DEFAULT_RISK_TABLE.FREE.concat(custom.FREE),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
} catch(e) {}
|
|
89
|
+
|
|
90
|
+
const fp = (filePath || '').replace(/\\/g, '/').toLowerCase();
|
|
91
|
+
for (var i = 0; i < riskTable.CRITICAL.length; i++) if (fp.includes(riskTable.CRITICAL[i].toLowerCase())) return 'CRITICAL';
|
|
92
|
+
for (var i = 0; i < riskTable.SENSITIVE.length; i++) if (fp.includes(riskTable.SENSITIVE[i].toLowerCase())) return 'SENSITIVE';
|
|
93
|
+
for (var i = 0; i < riskTable.FREE.length; i++) if (fp.includes(riskTable.FREE[i].toLowerCase())) return 'FREE';
|
|
94
|
+
for (var i = 0; i < riskTable.NORMAL.length; i++) if (fp.includes(riskTable.NORMAL[i].toLowerCase())) return 'NORMAL';
|
|
95
|
+
return 'NORMAL';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ─── PATTERN DETECTION ACROSS MODULES ────────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
function detectPatternAcrossModules(db, errorSignatures, currentFiles, projectRoot) {
|
|
101
|
+
if (!db || !errorSignatures || errorSignatures.length === 0) return [];
|
|
102
|
+
|
|
103
|
+
const findings = [];
|
|
104
|
+
const currentAreas = (currentFiles || []).map(function(f) {
|
|
105
|
+
return path.basename(f, path.extname(f)).toLowerCase();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const sfn = function(fn) { try { return fn(); } catch(e) { return []; } };
|
|
109
|
+
|
|
110
|
+
errorSignatures.forEach(function(sig) {
|
|
111
|
+
if (!sig || sig.length < 3) return;
|
|
112
|
+
|
|
113
|
+
const likeQuery = '%' + sig + '%';
|
|
114
|
+
const placeholders = currentAreas.length > 0
|
|
115
|
+
? 'AND area NOT IN (' + currentAreas.map(function() { return '?'; }).join(',') + ')'
|
|
116
|
+
: '';
|
|
117
|
+
|
|
118
|
+
let otherModules = [];
|
|
119
|
+
try {
|
|
120
|
+
otherModules = db.prepare(
|
|
121
|
+
'SELECT DISTINCT area, id, titulo, confianza, aplicado FROM nodos ' +
|
|
122
|
+
'WHERE tipo IN (\'error\', \'patron\') ' +
|
|
123
|
+
'AND (titulo LIKE ? OR contenido LIKE ?) ' +
|
|
124
|
+
'AND estado = \'ACTIVO\' ' +
|
|
125
|
+
placeholders + ' ORDER BY aplicado DESC LIMIT 8'
|
|
126
|
+
).all.apply(null, [likeQuery, likeQuery].concat(currentAreas));
|
|
127
|
+
} catch(e) {}
|
|
128
|
+
|
|
129
|
+
otherModules.forEach(function(mod) {
|
|
130
|
+
const hasHistory = (mod.aplicado || 0) > 0;
|
|
131
|
+
const riskLevel = classifyFileRisk(mod.area, projectRoot);
|
|
132
|
+
|
|
133
|
+
let knownFix = null;
|
|
134
|
+
try {
|
|
135
|
+
const fixRow = db.prepare(
|
|
136
|
+
'SELECT descripcion FROM relaciones_semanticas ' +
|
|
137
|
+
'WHERE desde_entidad LIKE ? AND tipo = \'was_fixed_by\' ' +
|
|
138
|
+
'AND (invalid_at IS NULL OR invalid_at = \'\') LIMIT 1'
|
|
139
|
+
).get('%' + mod.area + '%');
|
|
140
|
+
if (fixRow) knownFix = fixRow.descripcion;
|
|
141
|
+
} catch(e) {}
|
|
142
|
+
|
|
143
|
+
let action;
|
|
144
|
+
if (riskLevel === 'CRITICAL') {
|
|
145
|
+
action = 'WARN';
|
|
146
|
+
} else if (riskLevel === 'SENSITIVE' && !knownFix) {
|
|
147
|
+
action = 'WARN';
|
|
148
|
+
} else if (hasHistory || knownFix) {
|
|
149
|
+
action = 'AUTO_FIX';
|
|
150
|
+
} else {
|
|
151
|
+
action = riskLevel === 'FREE' ? 'AUTO_FIX' : 'WARN';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
findings.push({
|
|
155
|
+
module: mod.area,
|
|
156
|
+
signature: sig,
|
|
157
|
+
titulo: mod.titulo,
|
|
158
|
+
risk_level: riskLevel,
|
|
159
|
+
has_history: hasHistory,
|
|
160
|
+
known_fix: knownFix,
|
|
161
|
+
action: action,
|
|
162
|
+
reason: action === 'AUTO_FIX'
|
|
163
|
+
? 'Pattern in ' + mod.area + ' (' + (mod.aplicado || 0) + 'x) — auto-fixing'
|
|
164
|
+
: riskLevel + ' file — requires confirmation before touching ' + mod.area,
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const seen = {};
|
|
170
|
+
return findings.filter(function(f) {
|
|
171
|
+
const key = f.module + ':' + f.signature;
|
|
172
|
+
if (seen[key]) return false;
|
|
173
|
+
seen[key] = true;
|
|
174
|
+
return true;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ─── PREREQUISITE CHECK FOR FINDINGS ─────────────────────────────────────────
|
|
179
|
+
|
|
180
|
+
function prerequisiteCheckFindings(db, findings, currentFiles) {
|
|
181
|
+
if (!db || !findings || !findings.length) {
|
|
182
|
+
return { prerequisites: [], non_blockers: findings || [], can_proceed: true, fix_order: [{ step: 'MAIN_TASK' }] };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const prerequisites = [];
|
|
186
|
+
const nonBlockers = [];
|
|
187
|
+
|
|
188
|
+
findings.forEach(function(finding) {
|
|
189
|
+
var isPrerequisite = false;
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
(currentFiles || []).forEach(function(file) {
|
|
193
|
+
const bn = path.basename(file);
|
|
194
|
+
const deps = db.prepare(
|
|
195
|
+
'SELECT hacia_entidad FROM relaciones_semanticas ' +
|
|
196
|
+
'WHERE desde_entidad LIKE ? ' +
|
|
197
|
+
'AND tipo IN (\'depende_de\', \'importa\', \'usa\', \'llama\') ' +
|
|
198
|
+
'AND (invalid_at IS NULL OR invalid_at = \'\') LIMIT 10'
|
|
199
|
+
).all('%' + bn + '%').map(function(r) { return r.hacia_entidad; });
|
|
200
|
+
|
|
201
|
+
if (deps.some(function(d) {
|
|
202
|
+
return d && d.toLowerCase().includes(finding.module.toLowerCase());
|
|
203
|
+
})) {
|
|
204
|
+
isPrerequisite = true;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
} catch(e) {}
|
|
208
|
+
|
|
209
|
+
if (isPrerequisite) {
|
|
210
|
+
prerequisites.push(Object.assign({}, finding, {
|
|
211
|
+
prerequisite_reason: finding.module + ' is upstream of current task — fix first',
|
|
212
|
+
}));
|
|
213
|
+
} else {
|
|
214
|
+
nonBlockers.push(finding);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const autoFixable = nonBlockers.filter(function(f) { return f.action === 'AUTO_FIX'; });
|
|
219
|
+
const warnOnly = prerequisites.concat(nonBlockers.filter(function(f) { return f.action === 'WARN'; }));
|
|
220
|
+
|
|
221
|
+
const fixOrder = prerequisites.map(function(p) { return Object.assign({}, p, { when: 'BEFORE_MAIN_TASK' }); });
|
|
222
|
+
fixOrder.push({ step: 'MAIN_TASK' });
|
|
223
|
+
autoFixable.forEach(function(n) { fixOrder.push(Object.assign({}, n, { when: 'AFTER_MAIN_TASK' })); });
|
|
224
|
+
|
|
225
|
+
return {
|
|
226
|
+
prerequisites: prerequisites,
|
|
227
|
+
non_blockers: nonBlockers,
|
|
228
|
+
can_proceed: prerequisites.length === 0,
|
|
229
|
+
auto_fixable: autoFixable,
|
|
230
|
+
warn_only: warnOnly,
|
|
231
|
+
fix_order: fixOrder,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
|
|
56
236
|
// ─── DB ───────────────────────────────────────────────────────────────────────
|
|
57
237
|
|
|
58
238
|
function openDB(projectRoot) {
|
package/bin/akdd.js
CHANGED
|
@@ -66,6 +66,15 @@ const HELP = `
|
|
|
66
66
|
akdd creative apply <id> Apply a suggestion
|
|
67
67
|
akdd creative wins View applied creative improvements
|
|
68
68
|
|
|
69
|
+
Memory (ranked retrieval):
|
|
70
|
+
akdd recall "query" Ranked BM25+vector search — replaces full file reads
|
|
71
|
+
akdd memory stats Memory retrieval stats (indexed, coverage, mode)
|
|
72
|
+
akdd memory index Re-index all .agentic/memoria/*.md files
|
|
73
|
+
akdd validate scan Scan all memory for stale/obsolete/poisoned entries
|
|
74
|
+
akdd validate report Health report of knowledge base
|
|
75
|
+
akdd telemetry Telemetry summary (spans, STOPs, recalls)
|
|
76
|
+
akdd telemetry view View last cycle trace (L4 audit trail)
|
|
77
|
+
|
|
69
78
|
Autonomous decisions (L4):
|
|
70
79
|
akdd decide <file> Analyze a change — STOP/WARN/IMPLEMENT/DEFER decision
|
|
71
80
|
akdd deferred View deferred queue (end-of-cycle suggestions)
|
|
@@ -276,6 +285,28 @@ switch (command) {
|
|
|
276
285
|
break;
|
|
277
286
|
}
|
|
278
287
|
|
|
288
|
+
// ── v3.4: KDD Memory, Knowledge Validator, Telemetry ─────────────────────
|
|
289
|
+
case 'recall':
|
|
290
|
+
runModule('kdd-memory.cjs', 'recall', args.slice(1).join(' '));
|
|
291
|
+
break;
|
|
292
|
+
case 'memory':
|
|
293
|
+
const sub = arg1 || 'stats';
|
|
294
|
+
if (sub === 'index') runModule('kdd-memory.cjs', 'index');
|
|
295
|
+
else if (sub === 'sync') runModule('kdd-memory.cjs', 'sync');
|
|
296
|
+
else runModule('kdd-memory.cjs', 'stats');
|
|
297
|
+
break;
|
|
298
|
+
case 'validate':
|
|
299
|
+
const vsub = arg1 || 'report';
|
|
300
|
+
if (vsub === 'scan') runModule('knowledge-validator.cjs', 'scan');
|
|
301
|
+
else if (vsub === 'report') runModule('knowledge-validator.cjs', 'report');
|
|
302
|
+
else runModule('knowledge-validator.cjs', 'validate', arg1);
|
|
303
|
+
break;
|
|
304
|
+
case 'telemetry':
|
|
305
|
+
const tsub = arg1 || 'summary';
|
|
306
|
+
if (tsub === 'view') runModule('telemetry.cjs', 'view', arg2 || '');
|
|
307
|
+
else runModule('telemetry.cjs', 'summary');
|
|
308
|
+
break;
|
|
309
|
+
|
|
279
310
|
// ── v3.3: Autonomous Decision Engine ──────────────────────────────────────
|
|
280
311
|
case 'decide': {
|
|
281
312
|
const files = args.slice(1);
|