kcp-commands & kcp-memory: las dos herramientas que le dan memoria a Claude Code en proyectos Java

Search for a command to run...

No comments yet. Be the first to comment.
Línea de apertura (opcional, para el feed): En cada sesión nueva, Claude abre el README, escanea el árbol de directorios, busca el pom.xml, encuentra src/main/java... 33 tool calls para orientarse. Co

Línea de apertura (opcional, para el feed): Llevas tres meses usando Claude en tu proyecto Java. Los mismos errores de hace tres meses siguen apareciendo. == para comparar BigDecimal. LocalDate.now()

Línea de apertura (opcional, para el feed): Tu equipo hizo commit directo a main porque "era un cambio pequeño". Dos horas después, toda la rama de producción estaba rota, tres desarrolladores bloquea

Línea de apertura (opcional, para el feed): Llevas seis meses usando Claude para tus decisiones de arquitectura Java. Eres más rápido. Pero ya no sabes si elegirías Spring Security + JWT o Keycloak si

Línea de apertura (opcional, para el feed): Claude Code empieza cada sesión desde cero. No recuerda qué archivos modificaste ayer. No recuerda el bug que arreglaste la semana pasada. No recuerda que mvn clean install genera 800 líneas de las cuales solo 8 importan. Dos herramientas del ecosistema KCP resuelven exactamente eso.
Basado en la presentación "KCP-COMMANDS & KCP-MEMORY" (SDD Breakout — Herramientas ExoCortex) de Jose Diaz Diaz · Autor: Thor Henning Hetland (Totto) · Ægis, Santiago de los Caballeros 2026, y en The KCP Ecosystem: A Tour for New Arrivals (Thor Henning Hetland, julio 2026).
El artículo anterior de esta serie presentó el knowledge.yaml como el índice de navegación que le dice a la IA dónde está todo al inicio de sesión. Eso resuelve el problema del descubrimiento.
Pero hay dos problemas que el knowledge.yaml solo no resuelve:
Context window burn: mvn test genera 500+ líneas. git log --oneline genera 200+ líneas. La IA consume tokens procesando ruido que nunca necesitó ver.
Session amnesia: Cada sesión nueva es una pizarra en blanco. El agente no sabe que la semana pasada arreglaste el N+1 query en OrderRepository. No sabe que el refactor de autenticación dejó tres TODOs pendientes. No sabe que decidiste usar @Tag("integration") para separar tests que necesitan Docker.
kcp-commands resuelve el primero. kcp-memory resuelve el segundo. Están diseñados para usarse juntos.
kcp-commands y kcp-memory trabajan en cadena: el hook escribe el log de eventos, el daemon indexa ese log y lo convierte en memoria recuperable.
kcp-commands es un PreToolUse + PostToolUse hook de Claude Code. Se dispara en cada llamada Bash del agente, en tres fases consecutivas.
Para comandos reconocidos, el hook inyecta un hint compacto con los flags que el agente probablemente necesita. En lugar de que Claude Code adivine los parámetros de mvn o kubectl, recibe una guía concisa antes de ejecutar.
Para Java developers, esto cubre:
mvn / ./mvnw — surefire flags, perfiles, skip tests
git — status, diff, log, branch, cherry-pick
docker / docker-compose — ps, logs, build, push
kubectl — get pods, describe, logs, apply
Esta es la fase de mayor impacto en context window. El manifiesto de cada comando define qué líneas conservar y qué desechar:
El manifest para mvn test se ve así (formato interno del hook):
# ~/.kcp/manifests/mvn-test.yaml
command: "mvn.*test|./mvnw.*test"
phase_a:
inject: |
Flags útiles: -pl <módulo> para módulo específico,
-Dtest=NombreTest para test único,
-DskipTests para compilar sin ejecutar.
phase_b:
filter: keep_matching
patterns:
- "BUILD (SUCCESS|FAILURE)"
- "Tests run:"
- "FAILED:"
- "ERROR:"
- "\\[ERROR\\]"
inject_on_failure: |
Si hay fallos con @Tag("integration"), pueden necesitar
la infraestructura de Docker levantada con docker-compose.
phase_c:
log: true
Cada llamada Bash queda registrada en ~/.kcp/events.jsonl. Este log es el insumo que consume kcp-memory. Sin kcp-commands, kcp-memory no tiene datos que indexar.
{"ts":"2026-07-31T09:14:22Z","cmd":"mvn test","project":"pedidos-api","exit":1,"summary":"FAILED: OrderServiceTest (1 failure)","filtered_lines":8,"original_lines":847}
{"ts":"2026-07-31T09:18:44Z","cmd":"git diff HEAD~1","project":"pedidos-api","exit":0,"summary":"Modified: OrderService.java, OrderRepository.java","filtered_lines":12,"original_lines":234}
{"ts":"2026-07-31T09:25:01Z","cmd":"mvn test","project":"pedidos-api","exit":0,"summary":"Tests run: 47, Failures: 0","filtered_lines":3,"original_lines":812}
| Métrica | Valor |
|---|---|
| Ahorro de context window por sesión | 33% promedio |
| Comandos cubiertos por manifests | 84% de las llamadas Bash típicas |
| Latencia del hook (JVM) | 12 ms por llamada |
| Manifests incluidos | 292 |
| Configuración requerida | 0 |
El hook funciona out of the box. No requiere ningún knowledge.yaml. No requiere configurar manifests. Instálalo y empieza a ahorrar tokens en la próxima sesión.
# Opción recomendada — daemon Java (12 ms/call):
curl -fsSL https://raw.githubusercontent.com/Cantara/kcp-commands/main/bin/install.sh | bash -s -- --java
# Alternativa — solo Node.js (no requiere JVM):
curl -fsSL https://raw.githubusercontent.com/Cantara/kcp-commands/main/bin/install.sh | bash -s -- --node
El installer registra el hook en el settings.json global de Claude Code. Después del primer claude que ejecutes, el hook está activo.
Repo: github.com/Cantara/kcp-memory · Versión: 0.32.0
Los agentes son amnésicos por diseño. Cada sesión nueva empieza desde cero. kcp-memory cierra ese hueco.
Imagina este escenario real en un proyecto Spring Boot:
Lunes: Debuggeas un N+1 query. Encuentras que OrderRepository.findByCustomer() hace lazy loading mal configurado. Arreglas con @EntityGraph. 45 minutos de investigación.
Martes: Nueva sesión. Pides a Claude que optimice queries en el módulo de clientes. El agente vuelve a investigar el mismo patrón de lazy loading. 30 minutos para redescubrir lo que ya sabes.
Miércoles: Refactorizas autenticación. Dejas 3 TODOs marcados en JWT config. Sesión termina antes de completarlos.
Jueves: Nueva sesión. No hay contexto de los TODOs. El agente no sabe qué estaba en progreso.
kcp-memory convierte el martes, miércoles y jueves en sesiones que arrancan informadas.
El daemon indexa y prioriza cuatro categorías de información:
| Categoría | Ejemplo Java |
|---|---|
| Bugs descubiertos y cómo se arreglaron | "N+1 en OrderRepository — @EntityGraph" |
| Decisiones de arquitectura de la sesión | "Usamos MapStruct en vez de ModelMapper — ADR-012" |
| Archivos tocados y por qué | "JwtTokenProvider.java — refactor expiración tokens" |
| Patrones extraídos como nuevas skills | "jakarta-migration.md — javax→jakarta en imports" |
| Issues recurrentes entre sesiones | "Port 5432 conflicto — usar POSTGRES_PORT=5433" |
Lo que Claude ve al abrir una sesión nueva en tu proyecto Spring Boot:
## Relevant session history — pedidos-api
2026-07-28: Fixed N+1 query in OrderRepository.findByCustomer().
Cause: default lazy loading on @OneToMany. Fix: @EntityGraph annotation.
Added pattern to performance-patterns.md skill.
2026-07-29: JWT refactor session ended mid-task.
3 TODOs pending in src/main/java/.../security/JwtTokenProvider.java (lines 87, 134, 201).
Context: expiry was calculated in seconds not ms — see PR #1847.
2026-07-30: Integration test failures.
Cause: docker-compose postgres port 5432 conflicts with local instance.
Fix: POSTGRES_PORT=5433 in .env.test
En lugar de empezar a explorar desde cero, el agente arranca con el contexto de lo que pasó — los problemas activos, las decisiones tomadas, los archivos en progreso.
kcp-memory indexa también los transcripts de sub-agentes. Esto significa que si usas Task tool o sub-agentes paralelos en Claude Code, la memoria es compartida entre todos ellos dentro del mismo proyecto. Un sub-agente que arregla tests y otro que refactoriza servicios ven el mismo contexto histórico.
SQLite local en ~/.kcp/memory.db. Sin cloud. Sin envío de datos. El contexto inyectado al inicio de sesión es generado localmente por el daemon.
# Instalar kcp-memory (requiere kcp-commands instalado primero):
# Ver instrucciones actualizadas en:
# https://github.com/Cantara/kcp-memory#install
kcp-commands + kcp-memory forman un sistema de dos capas:
La clave es que son independientes pero complementarios:
kcp-commands solo: ahorra context window en la sesión actual. Sin memoria cross-session.
kcp-memory solo: sin eventos que indexar (no hay events.jsonl), opera solo con transcripts de sesión — útil pero limitado.
Ambos juntos: ahorro de tokens + contexto histórico enriquecido = el loop completo.
No es necesario instalar todo a la vez. El ecosistema está diseñado para adopción incremental:
# Instalar kcp-commands (Java daemon):
curl -fsSL https://raw.githubusercontent.com/Cantara/kcp-commands/main/bin/install.sh | bash -s -- --java
# Abrir Claude Code. Ejecutar cualquier comando Maven o Git.
# Observar: la Fase A inyecta hints antes del comando.
# Observar: la Fase B devuelve output filtrado.
# El ahorro empieza desde la primera sesión.
# Instalar kcp-memory:
# https://github.com/Cantara/kcp-memory#install
# El daemon empieza a indexar events.jsonl y transcripts.
# La próxima sesión recibirá contexto de la sesión de hoy.
# Configurar Synthesis MCP en .claude/mcp.json
# Luego: synthesis scan . (desde la raíz del proyecto)
# Claude Code puede buscar, relacionar y preguntar sobre todo el codebase.
Agrega kcp-agent para load planning inspeccionable, y kcp-harness para enforcement. Estos son para cuando los agentes corren en producción o en entornos donde "el agente leyó el archivo X porque..." necesita ser auditable.
Si tu proyecto tiene patrones específicos — un wrapper de Maven, un runner de tests con flags especiales, un CLI interno — puedes agregar manifests propios en ~/.kcp/manifests/:
# ~/.kcp/manifests/my-project-test.yaml
command: "./scripts/run-tests.sh"
phase_a:
inject: |
Flags disponibles: --module <nombre>, --tag integration, --tag unit.
Los tests de integración requieren: docker-compose up -d postgres redis
phase_b:
filter: keep_matching
patterns:
- "PASSED|FAILED|ERROR"
- "Tests run:"
- "\\[WARN\\].*important"
inject_on_failure: |
Revisar logs en target/surefire-reports/ para stack traces completos.
phase_c:
log: true
Los 292 manifests incluidos cubren las herramientas más comunes. Los manifests propios se fusionan sin sobreescribir los del sistema.
| Problema | Herramienta |
|---|---|
| "mvn test genera 800 líneas de ruido" | ✅ kcp-commands Fase B |
| "La IA no sabe los flags correctos de kubectl" | ✅ kcp-commands Fase A |
| "Mañana la IA no recuerda el bug que arreglé hoy" | ✅ kcp-memory |
| "La IA no sabe la arquitectura del proyecto" | CLAUDE.md + knowledge.yaml |
| "La IA no puede buscar en el codebase" | Synthesis |
| "Necesito auditar qué cargó el agente" | kcp-agent + kcp-harness |
kcp-commands y kcp-memory son la entrada más directa al ecosistema KCP: impacto inmediato, configuración cero, instalación en dos comandos.
The KCP Ecosystem: A Tour for New Arrivals — Thor Henning Hetland
Enjoy!
Joe