karajan-code 1.37.0 → 1.38.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/README.md CHANGED
@@ -279,11 +279,9 @@ No per-project configuration required. If you want to customize, config is layer
279
279
 
280
280
  ## Why vanilla JavaScript?
281
281
 
282
- Because it should be.
282
+ Not nostalgia, not stubbornness. I've been using JavaScript since 1997, when Brendan Eich created it in a week and changed the lives of everyone building for the web. I know its guts, its bugs, its quirks. And I know that whoever truly understands JS turns those bugs into features. TypeScript exists so that developers used to strongly-typed languages don't panic when they see JS. I respect that. But I don't need it. Tests are my type safety. JSDoc and a good IDE are my intellisense. And not having a compiler between the code and me is what lets me ship 57 releases in 45 days without fear.
283
283
 
284
- Karajan has **2044 tests** across 161 files. It runs on Node.js without a build step. You can read the source, understand it, fork it, and modify it without a TypeScript compiler between you and the code.
285
-
286
- This is a deliberate choice, not a limitation. The tests are the type safety. The legibility is a feature. 57 releases in 45 days. That velocity is possible precisely because vanilla JS with good tests lets you move fast without fear.
284
+ [Why vanilla JavaScript: the long version](docs/why-vanilla-js.md)
287
285
 
288
286
  ## Recommended companions
289
287
 
package/docs/README.es.md CHANGED
@@ -1,134 +1,61 @@
1
1
  <p align="center">
2
- <img src="karajan-code-logo-small.png" alt="Karajan Code" width="200">
2
+ <img src="karajan-code-logo-small.png" alt="Karajan Code" width="180">
3
3
  </p>
4
4
 
5
5
  <h1 align="center">Karajan Code</h1>
6
6
 
7
7
  <p align="center">
8
- Orquestador local multi-agente con TDD, SonarQube y revision de codigo automatizada.
8
+ Orquestador local multi-agente. TDD-first, basado en MCP, JavaScript vanilla.
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/karajan-code"><img src="https://img.shields.io/npm/v/karajan-code.svg" alt="npm version"></a>
13
+ <a href="https://www.npmjs.com/package/karajan-code"><img src="https://img.shields.io/npm/dw/karajan-code.svg" alt="npm downloads"></a>
13
14
  <a href="https://github.com/manufosela/karajan-code/actions"><img src="https://github.com/manufosela/karajan-code/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
14
15
  <a href="https://www.gnu.org/licenses/agpl-3.0"><img src="https://img.shields.io/badge/license-AGPL--3.0-blue.svg" alt="License"></a>
15
16
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg" alt="Node.js"></a>
16
17
  </p>
17
18
 
18
19
  <p align="center">
19
- <a href="../README.md">Read in English</a>
20
+ <a href="../README.md">Read in English</a> · <a href="https://karajancode.com">Documentacion</a>
20
21
  </p>
21
22
 
22
23
  ---
23
24
 
24
- ## Que es Karajan Code?
25
-
26
- Karajan Code (`kj`) orquesta multiples agentes de IA a traves de un pipeline automatizado: generacion de codigo, analisis estatico, revision de codigo, testing y auditorias de seguridad. Todo en un solo comando.
27
-
28
- En lugar de ejecutar un agente de IA y revisar manualmente su output, `kj` encadena agentes con quality gates. El coder escribe codigo, SonarQube lo analiza, el reviewer lo revisa, y si hay problemas, el coder recibe otra oportunidad. Este bucle se repite hasta que el codigo es aprobado o se alcanza el limite de iteraciones.
29
-
30
- **Caracteristicas principales:**
31
- - **Pipeline multi-agente** con 11 roles configurables
32
- - **5 agentes de IA soportados**: Claude, Codex, Gemini, Aider, OpenCode
33
- - **Servidor MCP** con 20 herramientas. Usa `kj` desde Claude, Codex o cualquier host compatible con MCP sin salir de tu agente. [Ver configuracion MCP](#servidor-mcp)
34
- - **Bootstrap obligatorio.** Valida prerequisitos del entorno (git, remote, config, agentes, SonarQube) antes de cada ejecucion. Si algo falta, para con instrucciones claras
35
- - **Guardia anti-inyeccion.** Escanea diffs antes de pasarlos a la IA: detecta directivas de override, Unicode invisible y payloads ocultos en comentarios. Tambien como GitHub Action en cada PR
36
- - **TDD obligatorio.** Se exigen cambios en tests cuando se modifican ficheros fuente
37
- - **Integracion con SonarQube.** Analisis estatico con quality gates (requiere [Docker](#requisitos))
38
- - **Perfiles de revision.** standard, strict, relaxed, paranoid
39
- - **Tracking de presupuesto.** Monitorizacion de tokens y costes por sesion con `--trace`
40
- - **Automatizacion Git.** Auto-commit, auto-push, auto-PR tras aprobacion
41
- - **Gestion de sesiones.** Pausa/reanudacion con deteccion fail-fast y limpieza automatica de sesiones expiradas
42
- - **Sistema de plugins.** Extiende con agentes custom via `.karajan/plugins/`
43
- - **Checkpoints interactivos.** En lugar de matar tareas largas, pausa cada 5 minutos con un informe de progreso y te deja decidir: continuar, parar o ajustar el tiempo
44
- - **Descomposicion de tareas.** Triage detecta cuando una tarea debe dividirse y recomienda subtareas; con integracion Planning Game, crea cards vinculadas con bloqueo secuencial
45
- - **Retry con backoff.** Recuperacion automatica ante errores transitorios de API (429, 5xx) con backoff exponencial y jitter
46
- - **Pipeline stage tracker.** Vista de progreso acumulativo durante `kj_run` mostrando que stages estan completadas, en ejecucion o pendientes, tanto en CLI como via eventos MCP para renderizado en tiempo real en el host
47
- - **Guardarrailes de observabilidad del planner.** Telemetria continua de heartbeat/stall, proteccion configurable por silencio maximo (`session.max_agent_silence_minutes`) y limite duro de ejecucion (`session.max_planner_minutes`) para evitar bloqueos prolongados en `kj_plan`/planner
48
- - **Standby por rate-limit.** Cuando un agente alcanza limites de uso, Karajan parsea el tiempo de espera, espera con backoff exponencial y reanuda automaticamente en vez de fallar
49
- - **Preflight handshake.** `kj_preflight` requiere confirmacion humana de la configuracion de agentes antes de ejecutar, previniendo que la IA cambie asignaciones silenciosamente
50
- - **Config de 3 niveles.** Sesion > proyecto > global con scoping de `kj_agents`
51
- - **Mediacion inteligente del reviewer.** El scope filter difiere automaticamente issues del reviewer fuera de scope (ficheros no presentes en el diff) como deuda tecnica rastreada en vez de bloquear; Solomon media reviews estancados; el contexto diferido se inyecta en el prompt del coder
52
- - **Integracion con Planning Game.** Combina opcionalmente con [Planning Game](https://github.com/AgenteIA-Geniova/planning-game) para gestion agil de proyectos (tareas, sprints, estimacion). Como Jira, pero open-source y nativo XP
53
-
54
- > **Mejor con MCP.** Karajan Code esta disenado para usarse como servidor MCP dentro de tu agente de IA (Claude, Codex, etc.). El agente envia tareas a `kj_run`, recibe notificaciones de progreso en tiempo real, y obtiene resultados estructurados. Sin copiar y pegar.
55
-
56
- ## Requisitos
57
-
58
- - **Node.js** >= 18
59
- - **Docker** (necesario para SonarQube). Si no lo necesitas, desactivalo con `--no-sonar` o `sonarqube.enabled: false`
60
- - Al menos un agente de IA instalado: Claude, Codex, Gemini o Aider
61
-
62
- ## Pipeline
25
+ Tu describes lo que quieres construir. Karajan orquesta multiples agentes de IA para planificarlo, implementarlo, testearlo, revisarlo con SonarQube e iterar. Sin que tengas que supervisar cada paso.
63
26
 
64
- ```
65
- triage? ─> researcher? ─> planner? ─> coder ─> refactorer? ─> sonar? ─> reviewer ─> tester? ─> security? ─> commiter?
66
- ```
27
+ ## Que es Karajan?
67
28
 
68
- | Rol | Descripcion | Por defecto |
69
- |-----|-------------|-------------|
70
- | **triage** | Director de pipeline: analiza la complejidad y activa roles dinamicamente | **On** |
71
- | **researcher** | Investiga el contexto del codebase antes de planificar | Off |
72
- | **planner** | Genera planes de implementacion estructurados | Off |
73
- | **coder** | Escribe codigo y tests siguiendo metodologia TDD | **Siempre activo** |
74
- | **refactorer** | Mejora la claridad del codigo sin cambiar comportamiento | Off |
75
- | **sonar** | Ejecuta analisis estatico SonarQube y quality gates | On (si configurado) |
76
- | **reviewer** | Revision de codigo con perfiles de exigencia configurables | **Siempre activo** |
77
- | **tester** | Quality gate de tests y verificacion de cobertura | **On** |
78
- | **security** | Auditoria de seguridad OWASP | **On** |
79
- | **solomon** | Supervisor de sesion: monitoriza salud de iteraciones con 5 reglas (incl. reviewer overreach), media reviews estancados, escala ante anomalias | **On** |
80
- | **commiter** | Automatizacion de git commit, push y PR tras aprobacion | Off |
29
+ Karajan es un orquestador de codigo local. Corre en tu maquina, usa tus proveedores de IA existentes (Claude, Codex, Gemini, Aider, OpenCode) y coordina un pipeline de agentes especializados que trabajan juntos en tu codigo.
81
30
 
82
- Los roles marcados con `?` son opcionales y se pueden activar por ejecucion o via config.
31
+ No es un servicio en la nube. No es una extension de VS Code. Es una herramienta que instalas una vez y usas desde la terminal o como servidor MCP dentro de tu agente de IA.
83
32
 
84
- ## Instalacion
33
+ El nombre viene de Herbert von Karajan, el director de orquesta que creia que las mejores orquestas estan formadas por grandes musicos independientes que saben exactamente cuando tocar y cuando escuchar. La misma idea, aplicada a agentes de IA.
85
34
 
86
- ### Desde npm (recomendado)
35
+ ## Por que no usar solo Claude Code?
87
36
 
88
- ```bash
89
- npm install -g karajan-code
90
- kj init
91
- ```
92
-
93
- ### Desde codigo fuente
94
-
95
- ```bash
96
- git clone https://github.com/manufosela/karajan-code.git
97
- cd karajan-code
98
- ./scripts/install.sh
99
- ```
37
+ Claude Code es excelente. Usalo para codificacion interactiva basada en sesiones.
100
38
 
101
- ### Setup no interactivo (CI/automatizacion)
39
+ Usa Karajan cuando quieras:
102
40
 
103
- ```bash
104
- ./scripts/install.sh \
105
- --non-interactive \
106
- --kj-home /ruta/a/.karajan \
107
- --sonar-host http://localhost:9000 \
108
- --sonar-token "$KJ_SONAR_TOKEN" \
109
- --coder claude \
110
- --reviewer codex \
111
- --run-doctor true
112
- ```
41
+ - **TDD por defecto.** Los tests se escriben antes de la implementacion, no despues
42
+ - **Integracion con SonarQube.** Quality gates como parte del flujo, no como algo secundario
43
+ - **Solomon como jefe del pipeline.** Cada rechazo del reviewer es evaluado por un supervisor que decide si es valido o solo ruido de estilo
44
+ - **Enrutamiento multi-proveedor.** Claude como coder, Codex como reviewer, o cualquier combinacion
45
+ - **Operacion zero-config.** Auto-detecta frameworks de test, arranca SonarQube, simplifica el pipeline para tareas triviales
46
+ - **Arquitectura de roles composable.** Comportamientos de agente definidos como ficheros markdown que viajan con tu proyecto
47
+ - **Local-first.** Tu codigo, tus claves, tu maquina. Ningun dato sale salvo que tu lo digas
48
+ - **Zero costes de API.** Karajan usa CLIs de agentes de IA (Claude Code, Codex, Gemini CLI), no APIs. Pagas tu suscripcion existente (Claude Pro, ChatGPT Plus), no tarifas por token
113
49
 
114
- ### Setup multi-instancia
50
+ Si Claude Code es un programador de pares inteligente, Karajan es el pipeline CI/CD para desarrollo asistido por IA. Funcionan genial juntos: Karajan esta disenado para usarse como servidor MCP dentro de Claude Code.
115
51
 
116
- Guias completas: [`docs/multi-instance.md`](multi-instance.md) | [`docs/install-two-instances.md`](install-two-instances.md)
52
+ ## Instalacion
117
53
 
118
54
  ```bash
119
- ./scripts/setup-multi-instance.sh
55
+ npm install -g karajan-code
120
56
  ```
121
57
 
122
- ## Agentes soportados
123
-
124
- | Agente | CLI | Instalacion |
125
- |--------|-----|-------------|
126
- | **Claude** | `claude` | `npm install -g @anthropic-ai/claude-code` |
127
- | **Codex** | `codex` | `npm install -g @openai/codex` |
128
- | **Gemini** | `gemini` | Ver [Gemini CLI docs](https://github.com/google-gemini/gemini-cli) |
129
- | **Aider** | `aider` | `pipx install aider-chat` (o `pip3 install aider-chat`) |
130
-
131
- `kj init` auto-detecta los agentes instalados. Si solo hay uno disponible, se asigna a todos los roles automaticamente.
58
+ Eso es todo. No requiere Docker (SonarQube usa Docker, pero Karajan lo gestiona automaticamente). Sin ficheros de configuracion que copiar. `kj init` auto-detecta tus agentes instalados.
132
59
 
133
60
  ## Tres formas de usar Karajan
134
61
 
@@ -136,34 +63,39 @@ Karajan instala **tres comandos**: `kj`, `kj-tail` y `karajan-mcp`.
136
63
 
137
64
  ### 1. CLI: directamente desde terminal
138
65
 
66
+ Ejecuta Karajan directamente. Ves la salida completa del pipeline en tiempo real.
67
+
139
68
  ```bash
140
- kj run "Implementar autenticacion de usuario con JWT"
141
- kj code "Anadir validacion de inputs al formulario de registro"
142
- kj review "Revisar los cambios de autenticacion"
143
- kj plan "Refactorizar la capa de base de datos"
69
+ kj run "Crea una utilidad que valide numeros de DNI español, con tests"
70
+ kj code "Añade validacion de inputs al formulario de registro" # Solo coder
71
+ kj review "Revisa los cambios de autenticacion" # Revisar diff actual
72
+ kj audit "Analisis completo de salud de este codebase" # Auditoria solo-lectura
73
+ kj plan "Refactorizar la capa de base de datos" # Planificar sin codificar
144
74
  ```
145
75
 
146
76
  ### 2. MCP: dentro de tu agente de IA
147
77
 
148
- El caso de uso principal. Karajan corre como servidor MCP dentro de Claude Code, Codex o Gemini. El agente tiene acceso a 20 herramientas (`kj_run`, `kj_code`, `kj_review`, etc.) y delega el trabajo pesado al pipeline de Karajan.
78
+ Este es el caso de uso principal. Karajan corre como servidor MCP dentro de Claude Code, Codex o Gemini. Le pides algo a tu agente de IA y el delega el trabajo pesado al pipeline de Karajan.
149
79
 
150
80
  ```
151
81
  Tu → Claude Code → kj_run (via MCP) → triage → coder → sonar → reviewer → tester → security
152
82
  ```
153
83
 
84
+ El servidor MCP se auto-registra durante `npm install`. Tu agente de IA ve 20 herramientas (`kj_run`, `kj_code`, `kj_review`, etc.) y las usa segun necesite.
85
+
154
86
  **El problema**: cuando Karajan corre dentro de un agente de IA, pierdes visibilidad. El agente te muestra el resultado final, pero no las etapas del pipeline, iteraciones o decisiones de Solomon en tiempo real.
155
87
 
156
88
  ### 3. kj-tail: monitorizar desde otro terminal
157
89
 
158
- **La herramienta companera.** Abre un segundo terminal en el **mismo directorio del proyecto** donde esta trabajando tu agente de IA:
90
+ **La herramienta compañera.** Abre un segundo terminal en el **mismo directorio del proyecto** donde esta trabajando tu agente de IA:
159
91
 
160
92
  ```bash
161
93
  kj-tail
162
94
  ```
163
95
 
164
- Veras la salida del pipeline en vivo (etapas, resultados, iteraciones, errores) tal como ocurren.
96
+ Veras la salida del pipeline en vivo (etapas, resultados, iteraciones, errores) tal como ocurren. La misma vista que ejecutar `kj run` directamente.
165
97
 
166
- ```bash
98
+ ```
167
99
  kj-tail # Seguir pipeline en tiempo real (por defecto)
168
100
  kj-tail -v # Verbose: incluir heartbeats de agente y presupuesto
169
101
  kj-tail -t # Mostrar timestamps
@@ -196,144 +128,104 @@ kj-tail --help # Todas las opciones
196
128
  └──────────────────────────┘ └──────────────────────────┘
197
129
  ```
198
130
 
199
- **Ejemplo con pipeline completo**, tarea compleja con todos los roles:
131
+ [**Ver la demo completa del pipeline**](https://karajancode.com#demo): triage, arquitectura, TDD, SonarQube, code review, arbitraje de Solomon, auditoria de seguridad.
132
+
133
+ ## El pipeline
200
134
 
201
135
  ```
202
- ┌─ Terminal 1 ─────────────────────────────────────────────────────────────────┐
203
- │ │
204
- │ $ claude │
205
- │ │
206
- │ > Construye una API REST para un sistema de reservas. Requisitos: │
207
- │ > - Express + TypeScript con validacion Zod en cada endpoint │
208
- │ > - Endpoints: POST /bookings, GET /bookings/:id, │
209
- │ > PATCH /bookings/:id/cancel │
210
- │ > - Una reserva tiene: id, guestName, roomType (standard|suite|penthouse), │
211
- │ > checkIn, checkOut, status (confirmed|cancelled) │
212
- │ > - Validar: checkOut posterior a checkIn, sin fechas pasadas, │
213
- │ > roomType debe ser un valor valido del enum │
214
- │ > - Cancelar devuelve 409 si ya esta cancelada │
215
- │ > - Usa TDD. Ejecutalo con Karajan con architect y planner activos, │
216
- │ > modo paranoid. Coder claude, reviewer codex. │
217
- │ │
218
- │ Claude llama a kj_run via MCP con: │
219
- │ --enable-architect --enable-researcher --enable-planner --mode paranoid │
220
- │ │
221
- └──────────────────────────────────────────────────────────────────────────────┘
222
-
223
- ┌─ Terminal 2: kj-tail ────────────────────────────────────────────────────────┐
224
- │ │
225
- │ kj-tail v1.37.0 — .kj/run.log │
226
- │ │
227
- │ ├─ 📋 Triage: medium (sw) — activando researcher, architect, planner │
228
- │ ├─ ⚙️ Preflight passed — all checks OK │
229
- │ ├─ 🔬 Researcher: 8 ficheros, 3 patrones, 5 restricciones │
230
- │ ├─ 🏗️ Architect: diseno 3 capas (routes → service → validators) │
231
- │ ├─ 🧠 Planner: 6 pasos — tests primero, luego rutas, servicio, validadores │
232
- │ │ │
233
- │ ▶ Iteracion 1/5 │
234
- │ ├─ 🔨 Coder (claude): 3 endpoints + 18 tests │
235
- │ ├─ 📋 TDD: PASS (3 src, 2 test) │
236
- │ ├─ 🔍 Sonar: Quality gate OK │
237
- │ ├─ 👁️ Reviewer (codex): REJECTED (2 blocking) │
238
- │ │ "Falta 404 para GET booking inexistente" │
239
- │ │ "Endpoint cancel sin test de idempotencia" │
240
- │ ├─ ⚖️ Solomon: approve_with_conditions (2 condiciones) │
241
- │ │ "Anadir respuesta 404 y test para GET /bookings/:id con id desconocido" │
242
- │ │ "Anadir test: cancelar reserva ya cancelada devuelve 409, no 500" │
243
- │ │ │
244
- │ ▶ Iteracion 2/5 │
245
- │ ├─ 🔨 Coder (claude): corregido — 22 tests │
246
- │ ├─ 📋 TDD: PASS │
247
- │ ├─ 🔍 Sonar: OK │
248
- │ ├─ 👁️ Reviewer (codex): APPROVED │
249
- │ ├─ 🧪 Tester: passed — cobertura 94%, 22 tests │
250
- │ ├─ 🔒 Security: passed — 0 criticos, 1 bajo (helmet recomendado) │
251
- │ ├─ 📊 Audit: CERTIFIED (3 advertencias) │
252
- │ │ │
253
- │ 🏁 Resultado: APPROVED │
254
- │ 🔬 Investigacion: 8 ficheros, 3 patrones │
255
- │ 🗺 Plan: 6 pasos (tests primero) │
256
- │ 🧪 Cobertura: 94%, 22 tests │
257
- │ 🔒 Seguridad: OK │
258
- │ 🔍 Sonar: OK │
259
- │ 💰 Presupuesto: $0.42 (claude: $0.38, codex: $0.04) │
260
- │ │
261
- └──────────────────────────────────────────────────────────────────────────────┘
136
+ hu-reviewer? → triage → discover? → architect? → planner? → coder → sonar? → impeccable? → reviewer → tester? → security? → solomon → commiter?
262
137
  ```
263
138
 
264
- ## Comandos CLI
265
-
266
- Consulta la [documentacion completa de comandos](../README.md#cli-commands) en el README principal (ingles). Resumen:
267
-
268
- | Comando | Descripcion |
269
- |---------|-------------|
270
- | `kj init` | Wizard interactivo de configuracion |
271
- | `kj run <task>` | Pipeline completo: coder → sonar → reviewer |
272
- | `kj code <task>` | Solo coder (sin revision) |
273
- | `kj review <task>` | Solo reviewer (sobre diff actual) |
274
- | `kj plan <task>` | Generar plan de implementacion |
275
- | `kj scan` | Ejecutar analisis SonarQube |
276
- | `kj doctor` | Verificar entorno (git, Docker, agentes, SonarQube) |
277
- | `kj config` | Mostrar configuracion actual |
278
- | `kj report` | Informes de sesion con tracking de presupuesto |
279
- | `kj resume <id>` | Reanudar sesion pausada |
280
- | `kj roles` | Inspeccionar roles y templates del pipeline |
281
- | `kj sonar` | Gestionar contenedor Docker de SonarQube |
282
-
283
- ## Servidor MCP
284
-
285
- Karajan Code expone un servidor MCP para integracion con cualquier host compatible (Claude, Codex, agentes custom).
286
-
287
- Tras `npm install -g karajan-code`, el servidor MCP se auto-registra en las configs de Claude y Codex. Config manual:
288
-
289
- ```json
290
- {
291
- "mcpServers": {
292
- "karajan-mcp": {
293
- "command": "karajan-mcp"
294
- }
295
- }
296
- }
139
+ **15 roles**, cada uno ejecutado por el agente de IA que elijas:
140
+
141
+ | Rol | Que hace | Por defecto |
142
+ |-----|----------|-------------|
143
+ | **hu-reviewer** | Certifica historias de usuario antes de codificar (6 dimensiones, 7 antipatrones) | Off |
144
+ | **triage** | Clasifica complejidad, activa roles, auto-simplifica para tareas triviales | **On** |
145
+ | **discover** | Detecta huecos en requisitos (Mom Test, Wendel, JTBD) | Off |
146
+ | **architect** | Disena la arquitectura de la solucion antes de planificar | Off |
147
+ | **planner** | Genera planes de implementacion estructurados | Off |
148
+ | **coder** | Escribe codigo y tests siguiendo metodologia TDD | **Siempre on** |
149
+ | **refactorer** | Mejora la claridad del codigo sin cambiar comportamiento | Off |
150
+ | **sonar** | Analisis estatico SonarQube con quality gate enforcement | On (auto-gestionado) |
151
+ | **impeccable** | Auditoria UI/UX para tareas frontend (a11y, rendimiento, theming) | Auto (frontend) |
152
+ | **reviewer** | Code review con perfiles de exigencia configurables | **Siempre on** |
153
+ | **tester** | Quality gate de tests y verificacion de cobertura | **On** |
154
+ | **security** | Auditoria de seguridad OWASP | **On** |
155
+ | **solomon** | Jefe del pipeline: evalua cada rechazo, anula bloqueos solo de estilo | **On** |
156
+ | **commiter** | Automatizacion de git commit, push y PR tras aprobacion | Off |
157
+ | **audit** | Analisis de salud del codebase solo-lectura (5 dimensiones, scores A-F) | Standalone |
158
+
159
+ ## 5 agentes de IA soportados
160
+
161
+ | Agente | CLI | Instalacion |
162
+ |--------|-----|-------------|
163
+ | **Claude** | `claude` | `npm install -g @anthropic-ai/claude-code` |
164
+ | **Codex** | `codex` | `npm install -g @openai/codex` |
165
+ | **Gemini** | `gemini` | Ver [Gemini CLI docs](https://github.com/google-gemini/gemini-cli) |
166
+ | **Aider** | `aider` | `pipx install aider-chat` (o `pip3 install aider-chat`) |
167
+ | **OpenCode** | `opencode` | Ver [OpenCode docs](https://github.com/nicepkg/opencode) |
168
+
169
+ Mezcla y combina. Usa Claude como coder y Codex como reviewer. Karajan auto-detecta agentes instalados durante `kj init`.
170
+
171
+ ## Servidor MCP (20 herramientas)
172
+
173
+ Tras `npm install -g karajan-code`, el servidor MCP se auto-registra en Claude y Codex. Config manual si es necesario:
174
+
175
+ ```bash
176
+ # Claude: anadir a ~/.claude.json → "mcpServers":
177
+ # { "karajan-mcp": { "command": "karajan-mcp" } }
178
+
179
+ # Codex: anadir a ~/.codex/config.toml → [mcp_servers."karajan-mcp"]
180
+ # command = "karajan-mcp"
297
181
  ```
298
182
 
299
- ### Herramientas MCP
183
+ **20 herramientas** disponibles: `kj_run`, `kj_code`, `kj_review`, `kj_plan`, `kj_audit`, `kj_scan`, `kj_doctor`, `kj_config`, `kj_report`, `kj_resume`, `kj_roles`, `kj_agents`, `kj_preflight`, `kj_status`, `kj_init`, `kj_discover`, `kj_triage`, `kj_researcher`, `kj_architect`, `kj_impeccable`.
300
184
 
301
- | Herramienta | Descripcion |
302
- |-------------|-------------|
303
- | `kj_init` | Inicializar config y SonarQube |
304
- | `kj_doctor` | Verificar dependencias del sistema |
305
- | `kj_config` | Mostrar configuracion |
306
- | `kj_scan` | Ejecutar analisis SonarQube |
307
- | `kj_run` | Ejecutar pipeline completo (con notificaciones de progreso en tiempo real) |
308
- | `kj_resume` | Reanudar sesion pausada |
309
- | `kj_report` | Leer informes de sesion (soporta `--trace`) |
310
- | `kj_roles` | Listar roles o mostrar templates |
311
- | `kj_code` | Modo solo coder |
312
- | `kj_review` | Modo solo reviewer |
313
- | `kj_plan` | Generar plan de implementacion con telemetria heartbeat/stall y diagnostico mas claro |
185
+ Usa `kj-tail` en un terminal separado para ver lo que el pipeline esta haciendo en tiempo real (ver [Tres formas de usar Karajan](#tres-formas-de-usar-karajan)).
314
186
 
315
- ### MCPs complementarios recomendados
187
+ ## La arquitectura de roles
316
188
 
317
- Karajan Code funciona perfectamente solo, pero combinarlo con estos servidores MCP le da a tu agente un entorno de desarrollo completo:
189
+ Cada rol en Karajan esta definido por un fichero markdown: un documento plano que describe como debe comportarse el agente, que revisar y como es un buen output.
318
190
 
319
- | MCP | Para que | Caso de uso |
320
- |-----|----------|-------------|
321
- | [**Planning Game MCP**](https://github.com/AgenteIA-Geniova/planning-game-mcp) | Puente MCP para [Planning Game](https://github.com/AgenteIA-Geniova/planning-game), gestor agil open-source (tareas, sprints, estimacion, XP). Solo necesario si usas Planning Game | `kj_run` con `--pg-task` obtiene contexto completo de la tarea y actualiza el estado al completar |
322
- | [**GitHub MCP**](https://github.com/modelcontextprotocol/servers/tree/main/src/github) | Crear PRs, gestionar issues, leer repos desde el agente | Combinar con `--auto-push` para flujo completo: codigo → revision → push → PR |
323
- | [**Serena**](https://github.com/oramasearch/serena) | Navegacion a nivel de simbolo (find references, go-to-definition) para proyectos JS/TS | Activar con `--enable-serena` para inyectar contexto de simbolos en prompts de coder/reviewer |
324
- | [**Chrome DevTools MCP**](https://github.com/anthropics/anthropic-quickstarts/tree/main/chrome-devtools-mcp) | Automatizacion de navegador, screenshots, inspeccion de consola/red | Verificar cambios de UI visualmente tras modificar codigo frontend |
191
+ ```
192
+ .karajan/roles/ # Overrides de proyecto (opcional)
193
+ ~/.karajan/roles/ # Overrides globales (opcional)
194
+ templates/roles/ # Defaults built-in (incluidos en el paquete)
195
+ ```
196
+
197
+ Puedes sobreescribir cualquier rol built-in o crear nuevos. Sin codigo. Los agentes leen los ficheros de rol y adaptan su comportamiento. Codifica las convenciones de tu equipo, reglas de dominio y estandares de calidad, y cada ejecucion de Karajan los aplica automaticamente.
325
198
 
326
- ## Templates de roles
199
+ Usa `kj roles show <rol>` para inspeccionar cualquier template.
327
200
 
328
- Cada rol tiene un template `.md` con instrucciones que el agente de IA sigue. Los templates se resuelven en orden de prioridad:
201
+ ## Zero-config por diseño
329
202
 
330
- 1. **Override de proyecto**: `.karajan/roles/<rol>.md` (en la raiz del proyecto)
331
- 2. **Override de usuario**: `$KJ_HOME/roles/<rol>.md`
332
- 3. **Built-in**: `templates/roles/<rol>.md` (incluido en el paquete)
203
+ Karajan auto-detecta y auto-configura todo lo que puede:
333
204
 
334
- Usa `kj roles show <rol>` para inspeccionar cualquier template. Crea un override de proyecto para personalizar el comportamiento por proyecto.
205
+ - **TDD**: Detecta framework de tests (vitest, jest, mocha) y auto-activa TDD
206
+ - **Bootstrap gate**: Valida todos los prerequisitos (repo git, remote, config, agentes, SonarQube) antes de ejecutar. Falla con instrucciones claras, nunca degrada silenciosamente
207
+ - **Injection guard**: Escanea diffs en busca de prompt injection antes del review de IA. Detecta directivas de override, Unicode invisible, payloads en comentarios sobredimensionados. Tambien como GitHub Action en cada PR
208
+ - **SonarQube**: Auto-arranca contenedor Docker, genera config si falta
209
+ - **Complejidad del pipeline**: Triage clasifica la tarea, las triviales saltan el loop del reviewer
210
+ - **Caidas de proveedor**: Reintentos en 500/502/503/504 con backoff (igual que rate limits)
211
+ - **Cobertura**: Fallos de quality gate solo por cobertura se tratan como advisory
335
212
 
336
- **Variantes de revision**: `reviewer-strict`, `reviewer-relaxed`, `reviewer-paranoid`, seleccionables via flag `--mode` o config `review_mode`.
213
+ Sin configuracion por proyecto requerida. Si quieres personalizar, la config se apila: sesion > proyecto > global.
214
+
215
+ ## Por qué JavaScript vanilla?
216
+
217
+ No es nostalgia ni cabezonería. Es que llevo usando JavaScript desde 1997, cuando Brendan Eich lo creó en una semana y nos cambió la vida a los que hacíamos webs. Conozco sus tripas, sus bugs, sus rarezas. Y sé que quien conoce JS de verdad convierte esos bugs en features. TypeScript existe para que developers acostumbrados a lenguajes fuertemente tipados no entren en pánico al ver JS. Respeto eso. Pero yo no lo necesito. Los tests son mi seguridad de tipos. JSDoc y un buen IDE son mi intellisense. Y no tener un compilador entre el código y yo es lo que me permite moverme a 57 releases en 45 días sin miedo.
218
+
219
+ [Por qué JavaScript vanilla: la versión larga](why-vanilla-js.md)
220
+
221
+ ## Compañeros recomendados
222
+
223
+ | Herramienta | Por que |
224
+ |-------------|---------|
225
+ | [**RTK**](https://github.com/rtk-ai/rtk) | Reduce consumo de tokens 60-90% en salidas de comandos Bash |
226
+ | [**Planning Game MCP**](https://github.com/AgenteIA-Geniova/planning-game-mcp) | Gestion agil de proyectos (tareas, sprints, estimacion), nativo XP |
227
+ | [**GitHub MCP**](https://github.com/modelcontextprotocol/servers/tree/main/src/github) | Crear PRs, gestionar issues directamente desde el agente |
228
+ | [**Chrome DevTools MCP**](https://github.com/anthropics/anthropic-quickstarts/tree/main/chrome-devtools-mcp) | Verificar cambios de UI visualmente tras modificar frontend |
337
229
 
338
230
  ## Contribuir
339
231
 
@@ -342,18 +234,19 @@ git clone https://github.com/manufosela/karajan-code.git
342
234
  cd karajan-code
343
235
  npm install
344
236
  npm test # Ejecutar 2044 tests con Vitest
345
- npm run test:watch # Modo watch
346
237
  npm run validate # Lint + test
347
238
  ```
348
239
 
349
- - Tests: [Vitest](https://vitest.dev/)
350
- - Commits: [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `refactor:`, `test:`, `chore:`)
351
- - PRs: un solo proposito por PR, < 300 lineas cambiadas
240
+ Issues y pull requests bienvenidos. Si algo no funciona como esta documentado, [abre un issue](https://github.com/manufosela/karajan-code/issues). Es la contribucion mas util en esta fase.
352
241
 
353
242
  ## Enlaces
354
243
 
355
244
  - [Web](https://karajancode.com) (tambien [kj-code.com](https://kj-code.com))
245
+ - [Documentacion completa](https://karajancode.com/docs/)
356
246
  - [Changelog](../CHANGELOG.md)
357
247
  - [Politica de seguridad](../SECURITY.md)
358
248
  - [Licencia (AGPL-3.0)](../LICENSE)
359
- - [Issues](https://github.com/manufosela/karajan-code/issues)
249
+
250
+ ---
251
+
252
+ Construido por [@manufosela](https://github.com/manufosela). Head of Engineering en Geniova Technologies, co-organizador de NodeJS Madrid, autor de [Liderazgo Afectivo](https://www.amazon.es/dp/B0D7F4C8KC). 90+ paquetes npm publicados.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karajan-code",
3
- "version": "1.37.0",
3
+ "version": "1.38.0",
4
4
  "description": "Local multi-agent coding orchestrator with TDD, SonarQube, and code review pipeline",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0",
@@ -5,13 +5,21 @@ import { execFileSync } from "node:child_process";
5
5
 
6
6
  const cache = new Map();
7
7
 
8
- const SEARCH_DIRS = [
9
- "/opt/node/bin",
10
- path.join(os.homedir(), ".npm-global", "bin"),
11
- "/usr/local/bin",
12
- path.join(os.homedir(), ".local", "bin"),
13
- path.join(os.homedir(), ".opencode", "bin"),
14
- ];
8
+ const isWin = process.platform === "win32";
9
+
10
+ const SEARCH_DIRS = isWin
11
+ ? [
12
+ path.join(os.homedir(), "AppData", "Roaming", "npm"),
13
+ path.join(os.homedir(), "AppData", "Local", "npm"),
14
+ path.join(os.homedir(), ".opencode", "bin"),
15
+ ]
16
+ : [
17
+ "/opt/node/bin",
18
+ path.join(os.homedir(), ".npm-global", "bin"),
19
+ "/usr/local/bin",
20
+ path.join(os.homedir(), ".local", "bin"),
21
+ path.join(os.homedir(), ".opencode", "bin"),
22
+ ];
15
23
 
16
24
  function getNvmDirs() {
17
25
  const nvmDir = process.env.NVM_DIR || path.join(os.homedir(), ".nvm");
@@ -26,13 +34,14 @@ function getNvmDirs() {
26
34
  export function resolveBin(name) {
27
35
  if (cache.has(name)) return cache.get(name);
28
36
 
29
- // 1. Try system PATH via `which`
37
+ // 1. Try system PATH via `which` (Unix) or `where` (Windows)
30
38
  try {
31
- const resolved = execFileSync("which", [name], {
39
+ const whichCmd = isWin ? "where" : "which";
40
+ const resolved = execFileSync(whichCmd, [name], {
32
41
  encoding: "utf8",
33
42
  timeout: 3000,
34
43
  stdio: ["pipe", "pipe", "pipe"],
35
- }).trim();
44
+ }).trim().split(/\r?\n/)[0];
36
45
  if (resolved) {
37
46
  cache.set(name, resolved);
38
47
  return resolved;
@@ -43,11 +52,14 @@ export function resolveBin(name) {
43
52
 
44
53
  // 2. Search known directories
45
54
  const dirs = [...SEARCH_DIRS, ...getNvmDirs()];
55
+ const extensions = isWin ? ["", ".cmd", ".exe", ".bat"] : [""];
46
56
  for (const dir of dirs) {
47
- const candidate = path.join(dir, name);
48
- if (existsSync(candidate)) {
49
- cache.set(name, candidate);
50
- return candidate;
57
+ for (const ext of extensions) {
58
+ const candidate = path.join(dir, name + ext);
59
+ if (existsSync(candidate)) {
60
+ cache.set(name, candidate);
61
+ return candidate;
62
+ }
51
63
  }
52
64
  }
53
65
 
package/src/hu/store.js CHANGED
@@ -4,6 +4,21 @@ import { getKarajanHome } from "../utils/paths.js";
4
4
 
5
5
  // FUTURE: hu-storage adapter for PG/Trello/etc — currently local files only
6
6
 
7
+ /**
8
+ * Valid HU story status values.
9
+ * @type {Readonly<{PENDING: "pending", CODING: "coding", REVIEWING: "reviewing", DONE: "done", FAILED: "failed", BLOCKED: "blocked", CERTIFIED: "certified", NEEDS_CONTEXT: "needs_context"}>}
10
+ */
11
+ export const HU_STATUS = Object.freeze({
12
+ PENDING: "pending",
13
+ CODING: "coding",
14
+ REVIEWING: "reviewing",
15
+ DONE: "done",
16
+ FAILED: "failed",
17
+ BLOCKED: "blocked",
18
+ CERTIFIED: "certified",
19
+ NEEDS_CONTEXT: "needs_context"
20
+ });
21
+
7
22
  /** @returns {string} Path to the hu-stories directory (evaluated at call time). */
8
23
  function getHuDir() {
9
24
  return path.join(getKarajanHome(), "hu-stories");
@@ -151,3 +166,45 @@ export function answerContextRequest(batch, storyId, answer) {
151
166
  story.updated_at = new Date().toISOString();
152
167
  return story;
153
168
  }
169
+
170
+ /**
171
+ * Create a lightweight history record for a pipeline run.
172
+ * Stores a minimal single-HU batch in the same hu-stories directory
173
+ * so the HU Board can pick it up alongside full batches.
174
+ * @param {string} sessionId - The session identifier.
175
+ * @param {{task: string, result: string, approved: boolean, summary?: string, timestamp?: string}} data
176
+ * @returns {Promise<object>} The created batch object.
177
+ */
178
+ export async function createHistoryRecord(sessionId, { task, result, approved, summary, timestamp }) {
179
+ const ts = timestamp || new Date().toISOString();
180
+ const dir = path.join(getHuDir(), sessionId);
181
+ await fs.mkdir(dir, { recursive: true });
182
+
183
+ const batch = {
184
+ session_id: sessionId,
185
+ created_at: ts,
186
+ stories: [
187
+ {
188
+ id: `HU-hist-${sessionId}`,
189
+ status: approved ? "certified" : "failed",
190
+ original: { text: task },
191
+ blocked_by: [],
192
+ certified: approved ? { summary: summary || result } : null,
193
+ quality: null,
194
+ context_requests: [],
195
+ created_at: ts,
196
+ updated_at: ts
197
+ }
198
+ ],
199
+ history: {
200
+ task,
201
+ result,
202
+ approved,
203
+ summary: summary || null,
204
+ timestamp: ts
205
+ }
206
+ };
207
+
208
+ await fs.writeFile(path.join(dir, "batch.json"), JSON.stringify(batch, null, 2));
209
+ return batch;
210
+ }