@jossuealcala/madre 0.2.3 → 0.3.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/CONTRIBUTING.md +31 -2
  3. package/README.md +145 -187
  4. package/SECURITY.md +1 -1
  5. package/bin/madre.mjs +35 -2
  6. package/docs/INTERNALS.md +75 -0
  7. package/docs/training/Modelfile +5 -0
  8. package/docs/training/README.md +47 -0
  9. package/docs/training/train.sh +17 -0
  10. package/package.json +5 -3
  11. package/public/app.js +353 -5
  12. package/public/brands.js +18 -0
  13. package/public/index.html +2 -0
  14. package/public/styles.css +49 -11
  15. package/public/troubleshooting.js +31 -0
  16. package/src/adapters/madre.mjs +195 -0
  17. package/src/auth-probe.mjs +1 -0
  18. package/src/capabilities.mjs +1 -0
  19. package/src/conversation-context.mjs +4 -2
  20. package/src/dataset.mjs +127 -0
  21. package/src/distiller.mjs +16 -6
  22. package/src/embeddings.mjs +7 -1
  23. package/src/event-store.mjs +29 -1
  24. package/src/extensions.mjs +24 -224
  25. package/src/memory.mjs +64 -4
  26. package/src/modules/ahp.mjs +64 -0
  27. package/src/modules/ashcode.mjs +28 -0
  28. package/src/modules/git-pulse.mjs +26 -0
  29. package/src/modules/helpers.mjs +30 -0
  30. package/src/modules/image-studio.mjs +39 -0
  31. package/src/modules/index.mjs +21 -0
  32. package/src/modules/ollama.mjs +56 -0
  33. package/src/modules/ripley.mjs +20 -0
  34. package/src/modules/sdk.mjs +78 -0
  35. package/src/ollama.mjs +118 -0
  36. package/src/privacy.mjs +109 -0
  37. package/src/room/archivist.mjs +141 -0
  38. package/src/room/attachments.mjs +15 -0
  39. package/src/room/budget.mjs +83 -0
  40. package/src/room/context.mjs +31 -0
  41. package/src/room/control.mjs +66 -0
  42. package/src/room/escalation.mjs +41 -0
  43. package/src/room/ghost.mjs +32 -0
  44. package/src/room/guard.mjs +52 -0
  45. package/src/room/prompt.mjs +66 -0
  46. package/src/room/vectors.mjs +47 -0
  47. package/src/room.mjs +190 -392
  48. package/src/server.mjs +229 -41
  49. package/src/setup.mjs +25 -7
  50. package/src/updates.mjs +79 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,66 @@ Todas las versiones publicadas de `@jossuealcala/madre`. Fechas en ISO.
4
4
 
5
5
  Una versión se cierra cuando está en npm: hasta entonces su sección se llama **Sin publicar** y puede crecer. Cada versión publicada tiene exactamente una etiqueta `vX.Y.Z`, una release en GitHub y una sección aquí; el parche puede llegar a dos dígitos (`0.2.10`) antes de subir el menor. Ver `docs/ROADMAP.md` para el criterio de qué sube cada número.
6
6
 
7
+ ## 0.3.1 · 2026-09-19
8
+
9
+ ### Canal de liberación: la sala avisa cuando hay versión nueva
10
+ - MADRE consulta en npm la versión `latest` una vez al día (`~/.pulse/updates.json` como caché, compartida por todas las salas). Viaja el nombre del paquete y nada más, la misma petición que hace `npx`. Encendido por defecto; se apaga en MU/TH/UR → RELEASE CHANNEL o con `PULSE_UPDATE_CHECK=0`.
11
+ - Si hay versión nueva, una alerta ámbar en la barra, del mismo corte que STOP ALL, lo dice y MU/TH/UR muestra el comando exacto según cómo corre esta copia (npx, dependencia del proyecto, global o fuente), con botón de copiar y enlace a lo que trae la release. MADRE nunca se actualiza sola mientras trabajas. `madre doctor` imprime la misma línea. Los usuarios de 0.3.0 no reciben aviso: el canal nace aquí.
12
+
13
+ ### Documentación
14
+ - README reescrito y reordenado: arranque, la sala, modos, qué puede cada agente, delegación, memoria, MADRE AI, MU/TH/UR, módulos, lo que sale de la máquina y referencia. Corrige lo que no coincidía: cinco agentes, imágenes con los cuatro CLIs (Codex nativo, los demás con Image Studio), versión actual. La profundidad técnica pasa a `docs/INTERNALS.md`, que también viaja en el paquete.
15
+
16
+ ### Consola
17
+ - Elegir una condición desde el registro despliega la lista de condiciones conocidas aunque estuviera plegada, y lleva al remedio elegido.
18
+ - MU/TH/UR respira: cada bloque de una pantalla (CONNECTIONS, MEMORY, PRIVACY, SENTINEL, RELEASE CHANNEL) empieza con 40 px de aire y una línea tenue sobre su título.
19
+ - La barra es más ancha que el hilo: la raíz del proyecto se lee completa junto a MADRE, STOP ALL va en una línea. En MU/TH/UR la lista de condiciones conocidas se colapsa como la de condiciones registradas, y RELEASE CHANNEL viste como el resto del panel.
20
+
21
+ ### Dataset limpio y valoraciones (hacia MADRE AI)
22
+ - El dataset ya no incluye las respuestas de `@madre` ni las enlatadas de MADRE, y sí incluye los pasos delegados agente→agente con su instrucción como pregunta (`kind: delegated`). En una sala real el corpus pasó de 88 a 118 pares sin escribir una línea más.
23
+ - Cada respuesta tiene dos botones nuevos junto a copiar y responder: bien y mal. Se guardan en el ledger como `message.rated`; el dataset excluye lo marcado mal y cuenta lo marcado bien. Un clic saca del corpus una alucinación.
24
+ - MEMORY muestra el contador en vivo "pares limpios / 300", con turnos, delegados, notas y valoraciones, sin exportar nada; y una tarjeta TRAIN con los cuatro comandos de la receta ya rellenados con la carpeta de la sala, el modelo base que cabe en esta máquina y el nombre `madre-<proyecto>` que `@madre` tomará al aparecer en Ollama. `docs/training/` viaja ahora en el paquete de npm.
25
+ - Cuando `@madre` corre el modelo entrenado del proyecto, el briefing de las CLIs lo dice y les pide preguntarle a él antes de gastar tokens propios en "qué decidimos" o "dónde quedamos".
26
+
27
+ ### PRIVACY: términos que nunca viajan por la sala (ERROR-001)
28
+ - Una CLI corre con su propio contexto privado (instrucciones de organización, la cuenta con la que está firmada, CLAUDE.md de otras carpetas) y puede confundirlo con contexto compartido: en una sala real Claude escribió el nombre de la organización del humano, que nunca se había dicho en la sala, y de ahí pasó al ledger, al archivista y al dataset candidato. Cuatro saltos sin control.
29
+ - Nueva sección `⚙ CONNECTIONS → PRIVACY`: términos privados, uno por línea, y el marcador que los sustituye (`[ENTIDAD-ORG]` por defecto). MADRE los reemplaza en cada salto: en la respuesta de un agente antes de grabarla (la burbuja lleva una línea "privacy · @agente · n términos"), en el índice, en las notas del archivista y de `memory_note`, y en el dataset exportado. El humano no se reescribe; la sala solo avisa si su mensaje lleva un término. Los términos viven en `config.json` y en `PULSE_PRIVATE_TERMS`; el ledger solo registra cuántos.
30
+ - `PURGE ROOM`, tras la designación del proyecto, reescribe lo que la sala ya tiene, incluidos los mensajes del humano: ledger (mismas secuencias, en sitio y atómico), índice y memorias, conservando qué estaba destilado. La sección muestra cuánto queda expuesto antes y después.
31
+ - El briefing de toda CLI dice que su configuración es privada y que no traiga a la sala nada que venga de ahí. MU/TH/UR tiene la condición `privacy-leak`.
32
+
33
+ ### @madre sabe quién es y convoca al crew
34
+ - Mesa redonda: «@madre, pregúntale al crew …» o «convoca al crew y …» abre un plan escrito por la sala, no por el modelo: un paso por agente CLI en línea con la pregunta del humano y un turno de cierre en el que `@madre` resume con citas `[#n]` sin inventar consenso. Solo el humano convoca; con la delegación apagada `@madre` explica cómo pedirlo.
35
+ - Respuestas locales sin modelo: «¿quién eres / qué haces / eres el archivista?» explica que `@madre` y el archivista son el mismo modelo local en dos papeles y cómo se le enseña; «genera / guarda / aprende … memoria» explica que la memoria se destila sola y, si quien pide es un agente, lo manda a `memory_note`; las órdenes de acción de un agente reciben una respuesta para agentes. Preguntas y turnos de cierre siempre llegan al modelo.
36
+ - Las respuestas enlatadas de `@madre` se marcan `synthetic`: no entran al archivo ni a la transcripción que `@madre` vuelve a leer, así un modelo pequeño ya no las repite como si fueran suyas. Las CLIs sí las ven.
37
+ - El briefing de las CLIs dice explícito que guardar es `memory_note` propio y que a `@madre` solo se le pregunta. El chip `TO @madre` ahora dice "memory · answers & asks the crew · never writes".
38
+
39
+ ## 0.3.0 · 2026-09-18
40
+
41
+ ### Ollama, la inteligencia local (roadmap 2a)
42
+ - Nuevo módulo `OLLAMA`: si Ollama corre en la máquina, los embeddings de la memoria se calculan localmente y la destilación la hace primero un modelo local, gratis y sin que nada salga. MODULES muestra servidor, modelos y roles, descarga los recomendados con `PULL` (progreso en la sala) y permite apagar cada rol o el módulo. Sin Ollama, todo sigue igual.
43
+ - El archivista local pide JSON estructurado y no cuenta contra ningún presupuesto de proveedor; el reporte `memory.distilled` dice `local`, modelo y tokens.
44
+ - Variables: `PULSE_EMBED_PROVIDER`, `PULSE_OLLAMA_HOST`, `PULSE_OLLAMA_MODEL`, `PULSE_OLLAMA_EMBED_MODEL`.
45
+
46
+ ### CONTROL: prevención antes que restauración
47
+ - Mientras un agente tiene CONTROL, los `.env`, `.pulse/`, `.madre/` y `.claude/settings.local.json` quedan en solo lectura a nivel de sistema de archivos y recuperan sus permisos al terminar; el aviso lista qué se bloqueó. `.git/` sigue restaurándose desde el checkpoint después del turno.
48
+
49
+ ### Núcleo
50
+ - `src/room.mjs` pasa de 1204 a 908 líneas: prompt, contexto, CONTROL, escalación, archivista, vectores, presupuesto, GHOST y adjuntos viven ahora en `src/room/`, cada uno con una responsabilidad. Mismo comportamiento, misma suite.
51
+
52
+ ### Dataset y modelo del proyecto (roadmap 2c)
53
+ - `EXPORT DATASET` en MEMORY y `madre dataset` en terminal escriben `train.jsonl` / `valid.jsonl` junto al ledger: los turnos reales de la sala como pares de chat redactados, más las notas destiladas como pares de recuerdo. `docs/training/` trae la receta LoRA con mlx-lm, el `Modelfile` y `train.sh`. Un modelo registrado en Ollama como `madre-<proyecto>` lo toma `@madre` automáticamente.
54
+
55
+ ### @madre, el quinto agente (roadmap 2b)
56
+ - Con Ollama y un modelo de chat, `@madre` entra a la sala: responde desde todo el archivo con citas `[#n]`, dice cuando algo nunca se discutió, nunca escribe ni delega, y sus tokens locales no cuentan. Los orquestadores pueden delegarle pasos de verificación. Entra y sale con Ollama (`agents.updated`); interruptor en MODULES → OLLAMA.
57
+ - El asistente de terminal y `madre doctor` muestran Ollama junto a las CLIs (servidor, modelo de chat, embeddings) y cuentan a `@madre` como agente en línea: con Ollama corriendo la sala abre aunque ninguna CLI tenga sesión, con el aviso de conectar una para trabajar en archivos.
58
+ - `@madre` ya no se confunde de identidad ni promete lo que no hace: la identidad se repite al final del briefing, cada llamada a Ollama pide una ventana de 8k tokens (la de 4k por defecto recortaba el prompt de sistema), las órdenes de acción (convocar, delegar, ejecutar, escribir) se contestan sin llamar al modelo señalando a los agentes CLI, y el chip `TO @madre` dice "memory · answers, does not act". Los modelos de chat generales (`qwen2.5`, `llama3.1`, `gemma3`) van antes que los `-coder`.
59
+ - README: seis módulos con OLLAMA y el SDK enlazado a CONTRIBUTING, enlaces absolutos para que npm los resuelva, estado real del adaptador de Claude (MCP de memoria), y bloque "Primeros cinco minutos" con el recorrido completo desde `npx` hasta conectar las IAs desde MU/TH/UR sin volver a la terminal.
60
+
61
+ ### SDK de módulos
62
+ - `src/modules/sdk.mjs` con `defineModule`: un módulo es un archivo con sus ajustes en `config.json`, su descripción para MODULES, su interruptor, sus rutas y sus hooks. Los seis módulos (AHP+, Image Studio, Git Pulse, AshCode, RIPLEY, Ollama) viven en `src/modules/`; `extensions.mjs` queda como capa de compatibilidad y el servidor monta las rutas de los módulos de forma genérica.
63
+
64
+ ### Memoria configurable desde MU/TH/UR
65
+ - Sección `MEMORY` en CONNECTIONS: archivista preferido, quiénes pueden destilar, cada cuántos intercambios o minutos de reposo, proveedor de embeddings y porcentaje de recall. Se guarda en `config.json` y se aplica en vivo.
66
+
7
67
  ## 0.2.3 · 2026-09-18
8
68
 
9
69
  ### RIPLEY navega
package/CONTRIBUTING.md CHANGED
@@ -6,9 +6,10 @@ MADRE is one local room where several AI coding CLIs work on a project together.
6
6
 
7
7
  ```
8
8
  node --version # ≥ 22.5
9
- npm test # 111 tests, no model calls
9
+ npm test # the whole suite, no model calls
10
10
  npm run pack:check # packs, installs, exercises the CLI
11
11
  node ./bin/madre.mjs doctor --catalog # what MU/TH/UR already knows
12
+ node ./bin/madre.mjs start --no-open # the room from source, URL in the terminal
12
13
  ```
13
14
 
14
15
  ## What a good change looks like
@@ -19,12 +20,40 @@ node ./bin/madre.mjs doctor --catalog # what MU/TH/UR already knows
19
20
  - Agents never write outside their lease. If you widen what an agent may do, the permission modes and MU/TH/UR's catalog must say so.
20
21
  - MU/TH/UR speaks in uppercase and in short sentences; the room speaks like a person. Keep both voices.
21
22
 
23
+ ## Writing a module
24
+
25
+ A module is one file in `src/modules/`, registered in `src/modules/index.mjs`:
26
+
27
+ ```js
28
+ import { defineModule } from './sdk.mjs';
29
+ export default defineModule({
30
+ id: 'night-vision', name: 'Night Vision', vendor: 'MADRE', summary: '…',
31
+ settings: { enabled: false, gain: 2 }, // lives in ~/.pulse/config.json → modules.nightVision
32
+ confirm: 'Send { "confirm": true }…', // optional: the switch asks first
33
+ async status(ctx) { return { detail: '…' }; },// optional: what MODULES shows
34
+ async onToggle(ctx, enabled) {}, // optional: apply live
35
+ routes: [{ method: 'GET', path: '/api/night-vision', handler: async (ctx, { payload }) => ({ status: 200, body: {} }) }],
36
+ });
37
+ ```
38
+
39
+ `ctx` carries `projectRoot`, `config`, `settings`, `agents`, `room`, `readConfig()`, `updateConfig(patch)`, `record(type, payload)` and `services` (what the server offers: `imageKey`, `setImageModule`, `ollama`). A builtin gets a default switch that flips `enabled`, persists and records `extension.toggled`. Add a card branch in `public/app.js` only if the generic switch is not enough, and a condition in `public/troubleshooting.js` so MU/TH/UR knows it.
40
+
41
+ ## Look and voice
42
+
43
+ Three layers that never mix: the dialogue reads like a chat (system font, bubbles), the metadata reads like a terminal (mono, 10px, uppercase, grey), and MOTHER's screens (diagnosis, memory, control) are phosphor on black. One colour per meaning: phosphor is MADRE, amber is CREATE, red is CONTROL, each provider keeps its own colour. Toasts speak as `MU/TH/UR › …`. A new component that needs a new colour is a sign the component is wrong, not the palette.
44
+
22
45
  ## Where things live
23
46
 
24
47
  ```
25
48
  bin/madre.mjs the CLI · start, doctor, setup
26
49
  src/server.mjs HTTP + SSE, settings, modules, sentinel routes
27
- src/room.mjs turns, permission modes, plans, CONTROL, handoff, memory hooks
50
+ src/room.mjs the turn engine: send, dispatch, turns, plans, handoff, scopes
51
+ src/room/ its pieces: prompt (what an agent reads), context (transcript + recall),
52
+ control (checkpoint, diff, undo), escalation (waiting for the human),
53
+ archivist (distillation), vectors (embeddings), budget (token window),
54
+ ghost (off the record), attachments
55
+ src/modules/ one file per module on the SDK (sdk.mjs): ahp, image-studio, git-pulse, ashcode,
56
+ ripley, ollama; index.mjs is the registry, extensions.mjs the compatibility layer
28
57
  src/adapters/ one file per CLI: Codex, Claude Code, Gemini CLI, OpenCode
29
58
  src/memory.mjs SQLite index, distilled notes, vectors, recall
30
59
  src/distiller.mjs the archivist's prompt and parsing