@jossuealcala/madre 0.7.2 → 1.0.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.
Files changed (163) hide show
  1. package/CHANGELOG.md +773 -1
  2. package/README.md +92 -28
  3. package/bin/madre.mjs +30 -10
  4. package/docs/REFERENCE.md +157 -81
  5. package/docs/SDK.md +23 -19
  6. package/package.json +1 -1
  7. package/public/app.js +11207 -4196
  8. package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
  9. package/public/assets/brand/Geist-latin.woff2 +0 -0
  10. package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
  11. package/public/assets/brand/GeistMono-latin.woff2 +0 -0
  12. package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
  13. package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
  14. package/public/assets/brand/OFL-Geist.txt +93 -0
  15. package/public/assets/brand/OFL-GeistMono.txt +93 -0
  16. package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
  17. package/public/assets/brand/OFL-Sora.txt +93 -0
  18. package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
  19. package/public/assets/brand/Sora-latin.woff2 +0 -0
  20. package/public/assets/brand/madre-app-180.png +0 -0
  21. package/public/assets/brand/madre-app-192.png +0 -0
  22. package/public/assets/brand/madre-app-512.png +0 -0
  23. package/public/assets/brand/madre-app.svg +1 -0
  24. package/public/assets/brand/madre-favicon.svg +1 -0
  25. package/public/assets/news/1.0/alerts.webp +0 -0
  26. package/public/assets/news/1.0/bar.webp +0 -0
  27. package/public/assets/news/1.0/finder.webp +0 -0
  28. package/public/assets/news/1.0/github.webp +0 -0
  29. package/public/assets/news/1.0/intents.webp +0 -0
  30. package/public/assets/news/1.0/looks.webp +0 -0
  31. package/public/assets/news/1.0/modules.webp +0 -0
  32. package/public/assets/news/1.0/mother.webp +0 -0
  33. package/public/assets/news/1.0/nostromo.webp +0 -0
  34. package/public/assets/news/1.0/permissions.webp +0 -0
  35. package/public/assets/news/1.0/room.webp +0 -0
  36. package/public/assets/news/1.0/settings.webp +0 -0
  37. package/public/assets/wallpapers/biznaga.webp +0 -0
  38. package/public/assets/wallpapers/canela.webp +0 -0
  39. package/public/assets/wallpapers/jarrito.webp +0 -0
  40. package/public/assets/wallpapers/magna.webp +0 -0
  41. package/public/assets/wallpapers/oceano.webp +0 -0
  42. package/public/assets/wallpapers/paraiso.webp +0 -0
  43. package/public/assets/wallpapers/quila.webp +0 -0
  44. package/public/assets/wallpapers/tradicion.webp +0 -0
  45. package/public/assets/wallpapers/tropical.webp +0 -0
  46. package/public/assets/wallpapers/urbania.webp +0 -0
  47. package/public/assets/wallpapers/ventura.webp +0 -0
  48. package/public/assets/wallpapers/xico.webp +0 -0
  49. package/public/brands.js +28 -2
  50. package/public/editor.js +744 -0
  51. package/public/es.js +2784 -1026
  52. package/public/i18n.js +1 -1
  53. package/public/index.html +201 -175
  54. package/public/inquiry.js +11 -11
  55. package/public/loader.js +79 -0
  56. package/public/macroverso.js +1497 -0
  57. package/public/manifest.webmanifest +14 -0
  58. package/public/nostromo-engine.js +2222 -0
  59. package/public/resay.js +24 -0
  60. package/public/review-ask.js +85 -0
  61. package/public/salas-mac.css +787 -0
  62. package/public/salas-mac.html +154 -0
  63. package/public/salas-mac.js +3264 -0
  64. package/public/salas.css +85 -0
  65. package/public/salas.html +47 -0
  66. package/public/salas.js +200 -0
  67. package/public/styles.css +6207 -425
  68. package/public/touch.js +83 -0
  69. package/public/tour-chapters.js +342 -0
  70. package/public/tour.js +510 -0
  71. package/public/troubleshooting.js +159 -140
  72. package/src/adapters/codex.mjs +46 -6
  73. package/src/adapters/gemini.mjs +30 -10
  74. package/src/adapters/madre.mjs +110 -18
  75. package/src/adapters/process.mjs +42 -2
  76. package/src/auth-probe.mjs +2 -2
  77. package/src/bridge/devices.mjs +202 -0
  78. package/src/bridge/handoff.mjs +45 -0
  79. package/src/bridge/host.mjs +82 -0
  80. package/src/bridge/network.mjs +133 -0
  81. package/src/bridge/policy.mjs +89 -0
  82. package/src/bridge/qr.mjs +287 -0
  83. package/src/bridge/server.mjs +269 -0
  84. package/src/capabilities.mjs +5 -9
  85. package/src/chats.mjs +59 -22
  86. package/src/checkpoint.mjs +137 -35
  87. package/src/choices.mjs +18 -3
  88. package/src/cli-args.mjs +12 -1
  89. package/src/commands.mjs +15 -15
  90. package/src/config.mjs +73 -9
  91. package/src/conversation-context.mjs +5 -2
  92. package/src/dataset.mjs +3 -1
  93. package/src/directives.mjs +0 -5
  94. package/src/enlaces.mjs +451 -0
  95. package/src/event-store.mjs +55 -10
  96. package/src/exam.mjs +5 -5
  97. package/src/extensions.mjs +0 -2
  98. package/src/file-ops.mjs +23 -0
  99. package/src/files.mjs +52 -2
  100. package/src/github.mjs +407 -0
  101. package/src/json-file.mjs +63 -0
  102. package/src/lease.mjs +2 -2
  103. package/src/lobby-work.mjs +103 -0
  104. package/src/looks.mjs +55 -0
  105. package/src/maturity.mjs +3 -3
  106. package/src/mcp/github-server.mjs +164 -0
  107. package/src/mcp/image-server.mjs +1 -1
  108. package/src/mcp/memory-server.mjs +11 -3
  109. package/src/memory.mjs +38 -12
  110. package/src/models.mjs +89 -5
  111. package/src/modules/ahp.mjs +4 -4
  112. package/src/modules/ash.mjs +1 -1
  113. package/src/modules/bishop-plan.mjs +207 -0
  114. package/src/modules/bishop.mjs +645 -0
  115. package/src/modules/choices.mjs +2 -2
  116. package/src/modules/correo.mjs +1 -1
  117. package/src/modules/enlaces.mjs +255 -0
  118. package/src/modules/git-pulse.mjs +2 -2
  119. package/src/modules/github.mjs +322 -0
  120. package/src/modules/image-studio.mjs +3 -3
  121. package/src/modules/index.mjs +18 -4
  122. package/src/modules/intents-calibration.mjs +338 -0
  123. package/src/modules/intents-desk.mjs +481 -0
  124. package/src/modules/intents-observe.mjs +266 -0
  125. package/src/modules/intents-policy.mjs +414 -0
  126. package/src/modules/intents-try.mjs +91 -0
  127. package/src/modules/intents.mjs +145 -0
  128. package/src/modules/ollama.mjs +4 -4
  129. package/src/modules/playwright.mjs +121 -11
  130. package/src/modules/ripley.mjs +1 -1
  131. package/src/modules/runs.mjs +2 -2
  132. package/src/modules/sdk.mjs +10 -4
  133. package/src/ollama.mjs +6 -1
  134. package/src/outbound.mjs +19 -17
  135. package/src/override.mjs +100 -0
  136. package/src/ports.mjs +23 -1
  137. package/src/prices.mjs +72 -0
  138. package/src/privacy.mjs +30 -11
  139. package/src/quota-sources.mjs +0 -8
  140. package/src/request-guard.mjs +1 -1
  141. package/src/review-ask.mjs +111 -0
  142. package/src/room/archivist.mjs +55 -37
  143. package/src/room/budget.mjs +17 -5
  144. package/src/room/control.mjs +70 -7
  145. package/src/room/economy.mjs +35 -7
  146. package/src/room/escalation.mjs +2 -0
  147. package/src/room/guard.mjs +26 -2
  148. package/src/room/prompt.mjs +22 -15
  149. package/src/room/runs.mjs +84 -21
  150. package/src/room/vectors.mjs +19 -4
  151. package/src/room.mjs +351 -65
  152. package/src/router.mjs +3 -1
  153. package/src/runs.mjs +23 -5
  154. package/src/salas.mjs +313 -0
  155. package/src/sentinel-errors.mjs +1 -1
  156. package/src/server-sentinel.mjs +124 -0
  157. package/src/server.mjs +1526 -163
  158. package/src/setup.mjs +1 -0
  159. package/src/tour.mjs +159 -0
  160. package/src/updates.mjs +48 -8
  161. package/src/usage-sentinel.mjs +1 -1
  162. package/src/verdict.mjs +7 -7
  163. package/src/whats-new.mjs +160 -0
package/docs/REFERENCE.md CHANGED
@@ -2,22 +2,22 @@
2
2
 
3
3
  Todo lo que MADRE hace, con los números exactos. Para empezar en cinco minutos, el [README](../README.md).
4
4
 
5
- - [Arranque](#arranque--los-primeros-cinco-minutos) · [La sala](#la-sala) · [Idioma](#idioma)
6
- - [Modos de permiso](#modos-de-permiso) · [Qué puede cada agente](#qué-puede-cada-agente) · [Delegación](#delegación)
7
- - [Memoria](#memoria) · [MADRE AI](#madre-ai--tu-propio-modelo) · [El núcleo](#el-núcleo) · [MU/TH/UR](#muthur) · [Módulos](#módulos)
5
+ - [Arranque](#arranque--los-primeros-cinco-minutos) · [El proyecto](#el-proyecto) · [Idioma](#idioma)
6
+ - [Modos de permiso](#modos-de-permiso) · [Qué puede cada agente](#qué-puede-cada-agente) · [Planes](#planes)
7
+ - [Memoria](#memoria) · [Tu modelo](#tu-modelo) · [Lo que se envía](#lo-que-se-envía) · [Diagnóstico](#diagnóstico) · [Módulos](#módulos)
8
8
  - [Lo que sale de la máquina](#lo-que-sale-de-la-máquina) · [Config y variables](#referencia)
9
9
 
10
10
  ---
11
11
 
12
12
  ## ARRANQUE · LOS PRIMEROS CINCO MINUTOS
13
13
 
14
- Necesitas Node 22.5 o superior y al menos una de estas CLIs con sesión iniciada: **Codex**, **Claude Code**, **Gemini CLI**, **OpenCode**. Si además corre **Ollama** con un modelo de chat, la sala tiene un quinto agente local.
14
+ Necesitas Node 22.5 o superior y al menos una de estas CLIs con sesión iniciada: **Codex**, **Claude Code**, **Gemini CLI**, **OpenCode**. Si además corre **Ollama** con un modelo de chat, el proyecto tiene un quinto agente local.
15
15
 
16
- 1. Entra a la carpeta del proyecto y corre `npx @jossuealcala/madre start`. La sala abre siempre, tengas agentes o no. Si no hay ninguno, lo primero que ves es el puente: cada agente con su botón para instalarlo y firmarlo, ahí mismo. MADRE muestra el comando exacto antes de correrlo y transmite cada línea. En cuanto uno queda listo, la sala se desbloquea sola.
17
- 2. La sala abre en `http://127.0.0.1:4317`. Elige un agente en el selector o escribe `@claude …`. El chip junto a `to @agente` dice en qué modo sale el mensaje; `#1 EXCHANGE`, solo lectura, es el predeterminado.
18
- 3. Para sumar o reconectar una IA más tarde: `⚙ CONNECTIONS` en MU/TH/UR, donde la tripulación vive junto al resto de los ajustes. Codex y Claude Code se firman con un clic; Gemini y OpenCode aceptan su llave ahí mismo. MADRE no guarda credenciales: cada llave va al archivo de su propio CLI.
19
- 4. Con Ollama, `MODULES → OLLAMA` ya está encendido: la memoria se embebe localmente y `@madre` aparece en la fila.
20
- 5. `⚙ CONNECTIONS → MEMORY` ajusta quién destila la memoria y cada cuánto. `◉ NOSTROMO` muestra lo que la sala recuerda.
16
+ 1. Corre `npx @jossuealcala/madre` desde cualquier carpeta: abre Inicio, con todos tus proyectos y el Coordinador arriba. La primera vez lo acompaña un asistente de tres pasos: conectar los agentes (cada uno con su botón para instalarlo y firmarlo, ahí mismo; una vez para todos los proyectos), agregar los proyectos (eliges carpetas dentro de tu carpeta de usuario; agregar no abre) y abrir los que vas a usar. `npx @jossuealcala/madre start` dentro de una carpeta sigue abriendo ese proyecto directo; si no hay agentes, el proyecto abre igual en Conecta tus agentes para instalarlos y firmarlos.
17
+ 2. El proyecto abre en `http://127.0.0.1:4317`. Elige un agente en el selector o escribe `@claude …`. El chip junto a `to @agente` dice en qué modo sale el mensaje; `#1 SOLO CONVERSAR`, solo lectura, es el predeterminado.
18
+ 3. Para sumar o reconectar una IA más tarde: Ajustes → Agentes (el botón de ajustes de la barra, o ⌘, / Ctrl+,), donde los agentes viven junto al resto de los ajustes. Codex y Claude Code se firman con un clic; Gemini y OpenCode aceptan su llave ahí mismo. MADRE no guarda credenciales de proveedores: cada llave va al archivo de su propio CLI.
19
+ 4. Con Ollama, el módulo IA local (Módulos, en la barra) ya está encendido: la memoria se embebe localmente y `@madre` aparece en la fila.
20
+ 5. Ajustes → Memoria decide quién destila la memoria y cada cuánto. El Mapa de memoria, desde la cabecera de Diagnóstico, muestra lo que el proyecto recuerda.
21
21
 
22
22
  ```bash
23
23
  npx @jossuealcala/madre doctor # qué agentes hay, quién tiene sesión, si hay versión nueva
@@ -25,37 +25,37 @@ npx @jossuealcala/madre setup # el mismo alta, desde la terminal, si la pr
25
25
  npx @jossuealcala/madre start --no-open --project RUTA
26
26
  ```
27
27
 
28
- **Tres nombres.** **MADRE** es el producto. **MU/TH/UR** es su voz operativa: diagnóstico, conexiones, ajustes. **PULSE** es el canal sobre el que corre la sala: el registro de eventos, el bloque de delegación, la carpeta `.pulse/` donde caen los artefactos; por eso esos identificadores conservan su nombre.
28
+ **Tres nombres.** **MADRE** es el producto. **Diagnóstico** es su voz operativa: fallas, conexiones, ajustes. **Historial** es el canal sobre el que corre el proyecto: el registro de eventos, el bloque del plan, la carpeta `.pulse/` donde caen los artefactos; esos identificadores conservan su nombre de antes, PULSE.
29
29
 
30
30
  ---
31
31
 
32
- ## LA SALA
32
+ ## EL PROYECTO
33
33
 
34
- **El puente.** Sin agentes en línea la sala abre en el puente: una tarjeta por agente con su estado real y la única acción que le toca, `INSTALL` o `SIGN IN`. Todo corre en tu máquina, con el comando a la vista, y la salida se transmite a la misma pantalla. Codex y Claude Code se firman con un clic porque su CLI abre el navegador; Gemini y OpenCode aceptan su llave ahí mismo, que MADRE escribe donde ese CLI la busca, con el archivo cerrado a tu usuario y sin guardar copia en ninguna parte, solo desde esta computadora. Cada tarjeta dice además con qué cuenta se firma ese agente y si hay una entrada sin pagar, para que elegir no sea a ciegas. El puente se repliega en cuanto un agente queda listo y no vuelve: es el primer contacto de una sala sin nadie dentro. A partir de ahí la tripulación vive en `⚙ CONNECTIONS`, con los mismos botones y, al lado, los modos, los permisos y las llaves de cada agente.
34
+ **Conecta tus agentes.** Sin agentes en línea el proyecto abre en Conecta tus agentes: una tarjeta por agente con su estado real y la única acción que le toca, `INSTALL` o `SIGN IN`. Todo corre en tu máquina, con el comando a la vista, y la salida se transmite a la misma pantalla. Codex y Claude Code se firman con un clic porque su CLI abre el navegador; Gemini y OpenCode aceptan su llave ahí mismo, que MADRE escribe donde ese CLI la busca, con el archivo cerrado a tu usuario y sin guardar copia en ninguna parte, solo desde esta computadora. Cada tarjeta dice además con qué cuenta se firma ese agente y si hay una entrada sin pagar, para que elegir no sea a ciegas. Esa pantalla se repliega en cuanto un agente queda listo y no vuelve: es el primer contacto de un proyecto sin nadie dentro. A partir de ahí los agentes viven en `⚙ CONNECTIONS`, con los mismos botones y, al lado, los modos, los permisos y las llaves de cada agente.
35
35
 
36
- **La barra.** La marca con su latido, la raíz del proyecto, la tripulación, `LIVE`, las alertas (`STOP ALL`, versión nueva), `MODULES`, `MU/TH/UR`, tema y panel de archivos. Cada esfera de agente lleva un anillo con su consumo: el límite real del proveedor cuando el CLI lo publica, si no, la ventana local de MADRE. Un clic la despliega.
36
+ **La barra.** La marca con su latido, la raíz del proyecto, los agentes, `LIVE`, las alertas (`DETENER TODO`, versión nueva), `MODULES`, `Diagnóstico`, tema y panel de archivos. Cada esfera de agente lleva el Uso, su consumo: el límite real del proveedor cuando el CLI lo publica, si no, la ventana local de MADRE. Un clic la despliega.
37
37
 
38
38
  **Las burbujas.** Cada respuesta dice quién habla, a quién, en qué modo y con qué modelo; debajo, hora, tokens del turno y acumulado. Markdown completo, tablas, bloques de código con COPY. Las rutas que un agente menciona (`src/room.mjs:42`) abren el visor. Al pasar el ratón: valorar bien o mal, copiar, responder con otro agente.
39
39
 
40
- **El compositor.**
40
+ **La caja de Escribir.**
41
41
 
42
42
  | Escribes | Pasa |
43
43
  |---|---|
44
44
  | `@codex`, `@claude`, `@gemini`, `@opencode`, `@madre` | Menciona a un agente; `@` abre la lista |
45
45
  | `!src/room.mjs:12-20` | Adjunta un archivo del proyecto, con líneas si las das; `!` busca entre los archivos |
46
- | `#0` a `#4` | Fija el modo de permiso de ese mensaje. `#3` y `#4` abren la anulación, igual que el chip: un modo que pide dos llaves con el ratón no sale gratis por teclearlo |
46
+ | `#0` a `#4` | Fija el modo de permiso de ese mensaje. `#3` y `#4` abren el desbloqueo, igual que el chip: un modo que pide dos llaves con el ratón no sale gratis por teclearlo |
47
47
  | `/create …`, `/image …`, `/stopall`, `/git …`, `/ahp …` | Comandos; `/` abre el menú. `/git push` muestra qué saldría; solo `/git push confirm` lo envía |
48
48
  | `STOPALL` | Freno maestro |
49
- | Clip, arrastrar o pegar una imagen | Adjunto para la sala, nunca en el proyecto |
50
- | `@madre, pregúntale al crew …` | Mesa redonda: un paso por agente en línea, cierre citado |
49
+ | Clip, arrastrar o pegar una imagen | Adjunto para el proyecto, nunca dentro de su carpeta |
50
+ | `@madre, pregúntale a los agentes …` | Preguntar a todos: un paso por agente en línea, cierre citado |
51
51
 
52
52
  Un segundo clic en la esfera elegida, o el chip `default model ▾`, elige el modelo de esa petición: Codex, Claude, Gemini y OpenCode con sus listas reales, o un nombre libre. Se recuerda por agente.
53
53
 
54
- **Archivos.** El icono de la derecha abre el árbol del proyecto en solo lectura. El visor numera líneas; clic y Shift+clic seleccionan un rango y `REVIEW WITH` lo manda a un agente. Con **RIPLEY** encendido en `MODULES`, HTML, SVG y Markdown se renderizan en un marco sellado en lugar de mostrar su código, con barra atrás/recargar y recarga automática cuando un agente cambia el archivo.
54
+ **Archivos.** El icono de la derecha abre el árbol del proyecto en solo lectura. El visor numera líneas; clic y Shift+clic seleccionan un rango y `REVIEW WITH` lo manda a un agente. Con **Vista previa** encendida en `MODULES`, HTML, SVG y Markdown se renderizan en un marco sellado en lugar de mostrar su código, con barra atrás/recargar y recarga automática cuando un agente cambia el archivo.
55
55
 
56
- **Tema.** Sol/luna en la barra: automático, claro u oscuro. El claro no brilla; la pantalla de MU/TH/UR sigue siendo fósforo.
56
+ **Tema.** Sol/luna en la barra: automático, claro u oscuro. El claro no brilla; la pantalla de Diagnóstico sigue siendo fósforo.
57
57
 
58
- **Idioma.** La sala habla **español** por defecto. El botón `EN` de la barra la pasa a inglés y el navegador lo recuerda; `PULSE_LANGUAGE=en` manda sobre el config en el siguiente arranque. Un idioma es solo cómo se lee: lo que quedó escrito en el ledger conserva las palabras con que se escribió, y al mostrarse se vuelve a decir en el idioma de la sala.
58
+ **Idioma.** El proyecto habla **español** por defecto. El botón `EN` de la barra lo pasa a inglés y el navegador lo recuerda; `PULSE_LANGUAGE=en` manda sobre el config en el siguiente arranque. Un idioma es solo cómo se lee: lo que quedó escrito en el ledger conserva las palabras con que se escribió, y al mostrarse se vuelve a decir en el idioma del proyecto.
59
59
 
60
60
  La **terminal sigue en inglés a propósito**: `madre doctor` y el arranque imprimen lo que la gente pega en un issue o busca en un motor, y en inglés se encuentra. Lo que imprime un CLI por su cuenta tampoco se toca nunca.
61
61
 
@@ -67,23 +67,23 @@ Cada mensaje sale con un modo. Tu modo es el techo de cualquier plan que ese men
67
67
 
68
68
  | Modo | Nombre | Qué permite |
69
69
  |---|---|---|
70
- | `#0` | **GHOST** | Fuera del registro. No se escribe en el ledger, nadie lo recuerda, desaparece al recargar. Los tokens sí cuentan. |
71
- | `#1` | **EXCHANGE** | Leer el proyecto y coordinar. El predeterminado. |
72
- | `#2` | **CREATE** | Añadir archivos y carpetas nuevos donde corresponda en el proyecto. Lo que ya existía no cambia: si un agente lo toca, MADRE lo restaura al terminar y lo dice. |
73
- | `#3` | **CONTROL** | Editar el proyecto real sin aprobación por acción. Un titular por sala, checkpoint antes, lista de cambios y `UNDO` después. |
74
- | `#4` | **AIRLOCK** | Todo lo de CONTROL más ejecutar comandos: pruebas, builds, `git push`, deploys con las CLIs y sesiones que ya hay en la máquina. Los archivos vuelven con `UNDO`; lo que sale de la nave, no. La anulación pide dos llaves: la designación y la palabra `AIRLOCK`. |
70
+ | `#0` | **INCÓGNITO** | Fuera del registro. No se escribe en el ledger, nadie lo recuerda, desaparece al recargar. Los tokens sí cuentan. |
71
+ | `#1` | **SOLO CONVERSAR** | Leer el proyecto y coordinar. El predeterminado. |
72
+ | `#2` | **CREAR** | Añadir archivos y carpetas nuevos donde corresponda en el proyecto. Lo que ya existía no cambia: si un agente lo toca, MADRE lo restaura al terminar y lo dice. |
73
+ | `#3` | **EDITAR** | Editar el proyecto real sin aprobación por acción. Un titular por proyecto, punto de restauración antes, lista de cambios y `DESHACER` después. |
74
+ | `#4` | **ACCESO TOTAL** | Todo lo de EDITAR más ejecutar comandos: pruebas, builds, `git push`, deploys con las CLIs y sesiones que ya hay en la máquina. Los archivos vuelven con `DESHACER`; lo que sale de la nave, no. El desbloqueo pide la misma llave dos veces: el nombre del proyecto (o tu frase), escrito dos veces. |
75
75
 
76
- **CREATE por dentro.** El agente decide dónde va lo nuevo según las convenciones del proyecto, y crea carpetas si hace falta; `.pulse/out/<turno>/` queda como borrador para lo que no tiene sitio. MADRE toma un checkpoint antes del turno y, al terminar, conserva lo que apareció, lo muestra bajo la respuesta como artefactos, y restaura cualquier archivo previo que se haya modificado, renombrado o borrado, avisando en la sala. Las CLIs reciben sus herramientas de escritura sobre el proyecto y la instrucción de no tocar lo existente; la garantía la da la restauración de MADRE al terminar, no la regla previa.
76
+ **CREAR por dentro.** El agente decide dónde va lo nuevo según las convenciones del proyecto, y crea carpetas si hace falta; `.pulse/out/<turno>/` queda como borrador para lo que no tiene sitio. MADRE toma un punto de restauración antes del turno y, al terminar, conserva lo que apareció, lo muestra bajo la respuesta como artefactos, y restaura cualquier archivo previo que se haya modificado, renombrado o borrado, avisando en el proyecto. Las CLIs reciben sus herramientas de escritura sobre el proyecto y la instrucción de no tocar lo existente; la garantía la da la restauración de MADRE al terminar, no la regla previa.
77
77
 
78
- **CONTROL por dentro.** Antes del turno, un commit real bajo `refs/madre/checkpoints/` que no toca tu rama, tu índice ni tu stash. Durante el turno, `.git/`, `.pulse/`, `.madre/`, los `.env` y `.claude/settings.local.json` quedan en solo lectura a nivel de sistema de archivos y recuperan sus permisos al terminar. Después, la lista de archivos añadidos, modificados y borrados, y `UNDO` restaura el checkpoint. Armar `#3` pide la designación del proyecto; armar `#4` pide además la palabra `AIRLOCK`. En `#4` cada CLI recibe su herramienta de comandos (Codex sin sandbox de red, Claude `Bash`, Gemini `run_shell_command`, OpenCode `bash`) y la instrucción de decir en una línea qué va a salir y adónde antes de que salga.
78
+ **EDITAR por dentro.** Antes del turno, un commit real bajo `refs/madre/checkpoints/` que no toca tu rama, tu índice ni tu stash. Durante el turno, `.git/`, `.pulse/`, `.madre/`, los `.env` y `.claude/settings.local.json` quedan en solo lectura a nivel de sistema de archivos y recuperan sus permisos al terminar. Después, la lista de archivos añadidos, modificados y borrados, y `DESHACER` restaura el punto de restauración. Desbloquear `#3` pide el nombre del proyecto; desbloquear `#4` lo pide dos veces. En `#4` cada CLI recibe su herramienta de comandos (Codex sin sandbox de red, Claude `Bash`, Gemini `run_shell_command`, OpenCode `bash`) y la instrucción de decir en una línea qué va a salir y adónde antes de que salga.
79
79
 
80
- **Escalación.** Si un plan en `#1` llega a un paso que pide crear algo, la sala se detiene y pregunta: `GRANT ONCE · GRANT FOR PLAN · DENY`, con cronómetro de tres minutos. Solo el humano concede; un permiso escrito por un agente dentro de la conversación no cuenta.
80
+ **Solicitud de permiso.** Si un plan en `#1` llega a un paso que pide crear algo, el proyecto se detiene y pregunta: `GRANT ONCE · GRANT FOR PLAN · DENY`, con cronómetro de tres minutos. Solo el humano concede; un permiso escrito por un agente dentro de la conversación no cuenta.
81
81
 
82
- **Modo por paso.** Un orquestador puede pedir el modo de cada paso: `@codex #2: crea la página`, `@claude #3: arregla el router`. MADRE lo acota al modo de tu mensaje y al `MAX MODE` de ese agente. Con tu mensaje en `#3`, la palabra del orquestador basta; con tu mensaje en `#1`, un paso `#2` pasa por la escalación.
82
+ **Modo por paso.** Un orquestador puede pedir el modo de cada paso: `@codex #2: crea la página`, `@claude #3: arregla el router`. MADRE lo acota al modo de tu mensaje y al `MAX MODE` de ese agente. Con tu mensaje en `#3`, la palabra del orquestador basta; con tu mensaje en `#1`, un paso `#2` pasa por la solicitud de permiso.
83
83
 
84
- **Dos controles por agente.** En `⚙ CONNECTIONS` cada agente tiene `MAX MODE`, hasta dónde puede llegar un mensaje dirigido a él, y `DEFAULT MODE`, dónde empieza: `#1` solo lectura hasta que armes CREATE, o `#2` para que cada turno pueda añadir archivos sin pedirlo. Aparte, dos habilidades: generar imágenes y web.
84
+ **Dos controles por agente.** El Modo máximo, en Ajustes → Permisos, dice hasta dónde puede llegar un mensaje dirigido a cada agente; el Modo inicial, en Ajustes → Agentes, dónde empieza: `#1` solo lectura hasta que armes CREAR, o `#2` para que cada turno pueda añadir archivos sin pedirlo. Aparte, dos habilidades: generar imágenes y web.
85
85
 
86
- **Comandos que pide un agente.** Con el módulo **Runs** encendido, un agente en `#1`, `#2` o `#3` que necesita un comando que no puede correr (las pruebas, un build, un linter) termina su respuesta con un bloque `pulse-run`: el motivo en la primera línea y un comando por línea, cada uno con `$`. MADRE muestra cada línea como un botón y no corre nada hasta que lo presionas. Cada línea corre sola, desde la raíz del proyecto y **sin shell**: lo que lees en el botón es exactamente lo que se ejecuta, así que las líneas con `|`, `&&`, `;`, redirecciones, `$VARIABLES`, comodines, `~` o `cd` se muestran con el motivo y no se pueden correr. Antes de correr, MADRE toma un checkpoint; la salida vuelve a la sala como tarjeta, la leen todos los agentes en su siguiente turno, y si el comando cambió archivos, `UNDO` los regresa. Lo que el comando haya mandado fuera de la máquina no regresa. Un comando a la vez, diez minutos como máximo, y `STOP ALL` lo detiene. En `#4` el agente corre sus propios comandos y no se le enseña el bloque.
86
+ **Comandos que pide un agente.** Con el módulo **Comandos** encendido, un agente en `#1`, `#2` o `#3` que necesita un comando que no puede correr (las pruebas, un build, un linter) termina su respuesta con un bloque `pulse-run`: el motivo en la primera línea y un comando por línea, cada uno con `$`. MADRE muestra cada línea como un botón y no corre nada hasta que lo presionas. Cada línea corre sola, desde la raíz del proyecto y **sin shell**: lo que lees en el botón es exactamente lo que se ejecuta, así que las líneas con `|`, `&&`, `;`, redirecciones, `$VARIABLES`, comodines, `~` o `cd` se muestran con el motivo y no se pueden correr. Antes de correr, MADRE toma un punto de restauración; la salida vuelve al proyecto como tarjeta, la leen todos los agentes en su siguiente turno, y si el comando cambió archivos, `DESHACER` los regresa. Lo que el comando haya mandado fuera de la máquina no regresa. Un comando a la vez, diez minutos como máximo, y `DETENER` en su tarjeta o `DETENER TODO` lo detienen. Un comando que abre un puerto es un servidor: no tiene límite de tiempo, su tarjeta dice dónde escucha y lo abre en TUS SERVIDORES, y mientras sirve puedes correr otro comando. Los agentes saben que un servidor para el proyecto escucha solo en `127.0.0.1`. En `#4` el agente corre sus propios comandos y no se le enseña el bloque.
87
87
 
88
88
  ---
89
89
 
@@ -92,18 +92,18 @@ Cada mensaje sale con un modo. Tu modo es el techo de cualquier plan que ese men
92
92
  | | Lee el proyecto | Recibe imágenes | Crea archivos acotado | Genera imágenes | Web |
93
93
  |---|---|---|---|---|---|
94
94
  | **Codex** | sí | `-i` | sandbox de escritura | sí, nativo, con su cuenta de ChatGPT | `web_search` |
95
- | **Claude Code** | sí | lectura de la ruta | reglas de permiso por ruta | sí, con **Image Studio** | WebFetch / WebSearch |
96
- | **Gemini CLI** | sí | `read_file` | política por patrón | sí, con **Image Studio** | `google_web_search` |
97
- | **OpenCode** | sí | `-f` | permisos `edit` por patrón | sí, con **Image Studio** | webfetch / websearch |
95
+ | **Claude Code** | sí | lectura de la ruta | reglas de permiso por ruta | sí, con **Imágenes** | WebFetch / WebSearch |
96
+ | **Gemini CLI** | sí | `read_file` | política por patrón | sí, con **Imágenes** | `google_web_search` |
97
+ | **OpenCode** | sí | `-f` | permisos `edit` por patrón | sí, con **Imágenes** | webfetch / websearch |
98
98
  | **@madre** | la memoria | no | no | no | no |
99
99
 
100
- **Image Studio** es un módulo de MADRE: un servidor MCP propio que expone `generate_image` sobre los modelos de imagen de la API de Gemini, con tu propia key y tus créditos. Hoy **solo Gemini**, y por una razón: es la única cuenta de la tripulación cuya llave MADRE ya encuentra sin pedirte una nueva, y tiene capa gratis. Anthropic no genera imágenes —Claude las lee, no las hace—, la cuenta de ChatGPT con la que se firma Codex no da acceso a la API de imágenes, y OpenCode depende del proveedor al que lo apuntes. Se conecta a Claude, Gemini y OpenCode solo dentro de un permiso CREATE con el alcance de imágenes encendido, en sus homes aislados, y la imagen cae en la carpeta del turno como cualquier artefacto. `/image <petición>` arma el permiso y enruta al agente que puede generar. Con los cuatro agentes puedes pedir una imagen; Codex la hace con lo suyo, los demás con Image Studio.
100
+ **Imágenes** es un módulo de MADRE: un servidor MCP propio que expone `generate_image` sobre los modelos de imagen de la API de Gemini, con tu propia key y tus créditos. Hoy **solo Gemini**, y por una razón: es la única cuenta de los agentes cuya llave MADRE ya encuentra sin pedirte una nueva, y tiene capa gratis. Anthropic no genera imágenes —Claude las lee, no las hace—, la cuenta de ChatGPT con la que se firma Codex no da acceso a la API de imágenes, y OpenCode depende del proveedor al que lo apuntes. Se conecta a Claude, Gemini y OpenCode solo dentro de un permiso CREAR con el alcance de imágenes encendido, en sus homes aislados, y la imagen cae en la carpeta del turno como cualquier artefacto. `/image <petición>` arma el permiso y enruta al agente que puede generar. Con los cuatro agentes puedes pedir una imagen; Codex la hace con lo suyo, los demás con Imágenes.
101
101
 
102
- El acceso web es un permiso permanente por agente, apagado por defecto, que se enciende en `⚙ CONNECTIONS`.
102
+ El acceso web es un permiso permanente por agente, apagado por defecto, que se enciende en Ajustes → Agentes, con Acceso a la web.
103
103
 
104
104
  ---
105
105
 
106
- ## DELEGACIÓN
106
+ ## PLANES
107
107
 
108
108
  Un agente puede poner a trabajar a los demás. Si le pides coordinar, termina su respuesta con un bloque `pulse`, un paso por línea:
109
109
 
@@ -113,15 +113,17 @@ Un agente puede poner a trabajar a los demás. Si le pides coordinar, termina su
113
113
  @claude: Compara ambas síntesis y marca dónde divergen.
114
114
  ```
115
115
 
116
- MADRE ejecuta los pasos como turnos normales: cada uno queda en el ledger, pasa por handoff, presupuesto y timeout. El paso dirigido al orquestador es su turno de cierre. Los delegados no delegan, así que todo plan termina. Máximo cuatro pasos más el cierre.
116
+ MADRE ejecuta los pasos como turnos normales: cada uno queda en el ledger, pasa por traspaso, presupuesto y timeout. El paso dirigido al orquestador es su turno de cierre. Un paso del plan no arma otro plan, así que todo plan termina. Máximo cuatro pasos más el cierre.
117
117
 
118
- **STOP ALL.** El botón de la barra, `STOPALL` en el compositor o `curl -X POST http://127.0.0.1:4317/api/stop-all` detienen todos los planes y matan todos los procesos de agente. MU/TH/UR avisa en rojo cuando la sala se escapa: tres agentes a la vez, un agente con dos turnos cruzados, un plan de más de cinco minutos.
118
+ **TURNOS.** En Diagnóstico, junto al centinela. Encendido por defecto: una conversación que sigue trabajando cuando abres otra no se detiene, sigue escribiendo su registro y el panel de conversaciones la marca hasta que termina. Dos límites: conversaciones trabajando a la vez (2) y turnos a la vez en cada una (3); un mensaje que los pasaría se rechaza con el motivo antes de empezar. Todas las conversaciones comparten un solo titular de EDITAR o ACCESO TOTAL. Apagado, una sola conversación maneja a los agentes y no se puede cambiar de una que está trabajando. `DETENER TODO` detiene todas.
119
+
120
+ **DETENER TODO.** El botón de la barra, `STOPALL` en la caja de Escribir o `curl -X POST http://127.0.0.1:4317/api/stop-all` detienen todos los planes y matan todos los procesos de agente. Diagnóstico avisa en rojo cuando el proyecto se escapa: tres agentes a la vez, un agente con dos turnos cruzados, un plan de más de cinco minutos.
119
121
 
120
122
  ---
121
123
 
122
124
  ## MEMORIA
123
125
 
124
- Todo lo dicho fuera de GHOST queda indexado junto al ledger, en `~/.pulse/rooms/<sala>/memory.sqlite`. Nada de esto requiere un comando: ocurre solo.
126
+ Todo lo dicho fuera de INCÓGNITO queda indexado junto al ledger, en `~/.pulse/rooms/<sala>/memory.sqlite`. Nada de esto requiere un comando: ocurre solo.
125
127
 
126
128
  **Recall.** Cuando la conversación excede la ventana de contexto, cada turno recibe los intercambios anteriores que coinciden con la petición, citados con su número de secuencia, para cualquier agente.
127
129
 
@@ -131,85 +133,158 @@ Todo lo dicho fuera de GHOST queda indexado junto al ledger, en `~/.pulse/rooms/
131
133
 
132
134
  **Herramientas.** Cada turno lleva adjunto el servidor MCP `pulse-memory`: `memory_search`, `memory_recall`, `memory_notes`, `memory_timeline`, `project_state` y `memory_note`, que guarda una nota cuando tú pides explícitamente recordar algo. La burbuja muestra `◉ memory saved`.
133
135
 
134
- **NOSTROMO.** El mapa de la memoria, detrás de la designación del proyecto: MADRE es un sol rojo que late, cada memoria un planeta en el color de su tipo, unidos por venas que pulsan. Se navega, se lee y solo se puede borrar, con doble confirmación. Ocho toques al corazón activan CODE000 y sellan el archivo diez minutos.
136
+ **Mapa de memoria.** La memoria en un mapa, detrás del nombre del proyecto: MADRE es un sol rojo que late, cada memoria un planeta en el color de su tipo, unidos por venas que pulsan. Se navega, se lee y solo se puede borrar, con doble confirmación. Ocho toques al corazón activan el Bloqueo temporal y sellan el archivo diez minutos.
135
137
 
136
- **@madre.** Con Ollama y un modelo de chat, la memoria habla: `@madre` responde desde todo el archivo con citas `[#n]`, dice cuando la sala nunca discutió algo, no escribe ni ejecuta, y convoca al crew si se lo pides. Sus tokens son locales y no cuentan. Cuando existe un modelo entrenado con la sala, lo usa.
138
+ **@madre.** Con Ollama y un modelo de chat, la memoria habla: `@madre` responde desde todo el archivo con citas `[#n]`, dice cuando el proyecto nunca discutió algo, no escribe ni ejecuta, y convoca a los agentes si se lo pides. Sus tokens son locales y no cuentan. Cuando existe un modelo entrenado con el proyecto, lo usa.
137
139
 
138
- **Ajustes.** `⚙ CONNECTIONS → MEMORY`: quién destila, quiénes pueden, cada cuánto, dónde se embebe, cuánto contexto puede ocupar el recall. Todo en `~/.pulse/config.json`, sin reiniciar.
140
+ **Ajustes.** Ajustes → Memoria: quién destila, quiénes pueden, cada cuánto, dónde se embebe, cuánto contexto puede ocupar el recall. Todo en `~/.pulse/config.json`, sin reiniciar.
139
141
 
140
- **Privacidad.** Una CLI corre con su propio contexto privado y puede escribirlo en una respuesta. En `⚙ CONNECTIONS → PRIVACY` nombras los términos que no deben viajar por la sala: MADRE los sustituye por `[ENTIDAD-ORG]` antes de que lleguen al ledger, al archivista, a los demás agentes o al dataset, y `PURGE ROOM` limpia lo que la sala ya tenía. Los términos viven en `config.json`; la sala solo registra cuántos.
142
+ **Privacidad.** Una CLI corre con su propio contexto privado y puede escribirlo en una respuesta. En Ajustes → Privacidad nombras los términos que no deben viajar por el proyecto: MADRE los sustituye por `[ENTIDAD-ORG]` antes de que lleguen al ledger, al archivista, a los demás agentes o al dataset, y Borrar datos privados limpia lo que el proyecto ya tenía. Los términos viven en `config.json`; el proyecto solo registra cuántos.
141
143
 
142
144
  ---
143
145
 
144
- ## MADRE AI · TU PROPIO MODELO
146
+ ## TU MODELO
145
147
 
146
- La sala acumula material de entrenamiento mientras trabajas. `MEMORY` muestra en vivo cuántos pares limpios lleva hacia un LoRA, con 300 como objetivo: turnos humano→agente, pasos delegados y notas destiladas; fuera quedan las respuestas de `@madre`, las enlatadas y lo que marques como mala respuesta con el pulgar de cada burbuja.
148
+ El proyecto acumula material de entrenamiento mientras trabajas. `MEMORY` muestra en vivo cuántos pares limpios lleva hacia un LoRA, con 300 como objetivo: turnos humano→agente, pasos del plan y notas destiladas; fuera quedan las respuestas de `@madre`, las enlatadas y lo que marques como mala respuesta con el pulgar de cada burbuja.
147
149
 
148
- `EXPORT DATASET` escribe `train.jsonl` y `valid.jsonl` junto al ledger, redactados. La tarjeta `TRAIN` trae los comandos ya rellenados con tu carpeta de sala y el modelo base que cabe en tu máquina. El entrenamiento corre fuera de MADRE, con mlx en Apple Silicon; la receta vive en [`docs/training/`](training/README.md). En cuanto Ollama tiene un modelo `madre-<proyecto>`, `@madre` responde con él y las demás CLIs reciben la indicación de preguntarle primero: la memoria del proyecto deja de costar tokens.
150
+ `EXPORT DATASET` escribe `train.jsonl` y `valid.jsonl` junto al ledger, redactados. La tarjeta `TRAIN` trae los comandos ya rellenados con tu carpeta de proyecto y el modelo base que cabe en tu máquina. El entrenamiento corre fuera de MADRE, con mlx en Apple Silicon; la receta vive en [`docs/training/`](training/README.md). En cuanto Ollama tiene un modelo `madre-<proyecto>`, `@madre` responde con él y las demás CLIs reciben la indicación de preguntarle primero: la memoria del proyecto deja de costar tokens.
149
151
 
150
- **Ollama.** Si corre en la máquina, MADRE lo usa sin configurar nada: embeddings locales, archivista local, `@madre`. `MODULES → OLLAMA` muestra servidor, modelos y roles, descarga los recomendados con `PULL` y deja apagar cada rol. `qwen2.5:7b` en 16 GB, `qwen2.5:3b` en 8 GB; MADRE prefiere modelos de chat general sobre los `-coder`.
152
+ **Ollama.** Si corre en la máquina, MADRE lo usa sin configurar nada: búsqueda inteligente local, archivista local, `@madre`. El módulo IA local, en Módulos, muestra servidor, modelos y roles, descarga los recomendados y deja apagar cada rol. `qwen2.5:7b` en 16 GB, `qwen2.5:3b` en 8 GB; MADRE prefiere modelos de chat general sobre los `-coder`.
151
153
 
152
154
  ---
153
155
 
154
- ## EL CORE
156
+ ## LO QUE SE ENVÍA
155
157
 
156
- Entra a **◉ NOSTROMO** y haz clic en el núcleo, la estrella del centro. Cada turno, la sala escribe un documento en tu nombre y se lo entrega a un proceso; hasta ahora ese documento existía solo el instante en que el proceso lo leía. Ahí está entero: bloque por bloque, con lo que pesa cada uno y las palabras exactas que el agente recibe.
158
+ Entra al **Mapa de memoria** desde la cabecera de Diagnóstico y haz clic en el núcleo, la estrella del centro. Cada turno, el proyecto escribe un documento en tu nombre y se lo entrega a un proceso; hasta ahora ese documento existía solo el instante en que el proceso lo leía. Ahí está entero: bloque por bloque, con lo que pesa cada uno y las palabras exactas que el agente recibe.
157
159
 
158
- Cambia a quién va y las palabras cambian; sube el modo y aparece el permiso que se le daría, escrito —sin crear carpeta ni tomar checkpoint para enseñarlo—. Preguntar qué diría la sala no es la sala diciéndolo: nada se cuenta, nada se guarda, nada sale. Y se lee, nunca se escribe: lo que MADRE promete sobre la tripulación es cierto porque esas palabras son fijas.
160
+ Cambia a quién va y las palabras cambian; sube el modo y aparece el permiso que se le daría, escrito —sin crear carpeta ni tomar punto de restauración para enseñarlo—. Preguntar qué diría el proyecto no es el proyecto diciéndolo: nada se cuenta, nada se guarda, nada sale. Y se lee, nunca se escribe: lo que MADRE promete sobre los agentes es cierto porque esas palabras son fijas.
159
161
 
160
162
  **THE LAUNCH.** Debajo del documento, el comando exacto que MADRE correría para entregarlo: el ejecutable, el directorio, cada bandera y el lugar donde entra el briefing. No es una descripción — lo arman los mismos adaptadores que lo armarían de verdad. Debajo, lo que mantiene la corrida dentro del turno (la sesión que no persiste, el hogar temporal que se borra al terminar) y los servidores MCP que podría llamar, con sus herramientas contadas. **De ese comando nunca se imprime un valor de entorno, solo los nombres**: una línea de comandos es algo que la gente fotografía.
161
163
 
162
- **Lo que salió de esta máquina.** El registro de salidas: cada destino al que MADRE o un agente llamó, con su cuenta. Nunca cuerpos, ni cabeceras, ni valores de consulta — solo a dónde y cuántas veces.
164
+ **Envíos.** El registro de salidas: cada destino al que MADRE o un agente llamó, con su cuenta. Nunca cuerpos, ni cabeceras, ni valores de consulta — solo a dónde y cuántas veces.
163
165
 
164
- **La consola.** Dentro del núcleo, MU/TH/UR contesta desde lo que la sala ya tiene. Tres respuestas que no entiende y la interfaz se cierra.
166
+ **La consola.** Dentro del núcleo, Diagnóstico contesta desde lo que el proyecto ya tiene. Tres respuestas que no entiende y la interfaz se cierra.
165
167
 
166
- ## MU/TH/UR
168
+ ## DIAGNÓSTICO
167
169
 
168
- El botón de la barra abre la pantalla de diagnóstico. Escribe un síntoma, un agente o una palabra y MU/TH/UR clasifica las condiciones registradas en esta sala contra su catálogo, con el remedio para tu sistema operativo. El mismo catálogo en terminal: `madre doctor --catalog [texto]`.
170
+ El botón de la barra abre la pantalla de diagnóstico. Escribe un síntoma, un agente o una palabra y Diagnóstico clasifica las condiciones registradas en este proyecto contra su catálogo, con el remedio para tu sistema operativo; cuando el proyecto puede aplicarlo, el remedio trae Aplicar. El mismo catálogo en terminal: `madre doctor --catalog [texto]`. La sesión de cada CLI, los modos, las habilidades, los tiempos, la memoria y la privacidad están en Ajustes.
169
171
 
170
- | Sección | Qué hace |
172
+ | En el encabezado | Qué hace |
171
173
  |---|---|
172
- | `⚙ CONNECTIONS` | Sesión, versión y ruta de cada CLI; `SIGN IN` y `RECHECK`; `MAX MODE`, `DEFAULT MODE` y habilidades; timeouts, presupuesto, delegación, modelo de OpenCode; MEMORY y PRIVACY |
173
- | `◉ NOSTROMO` | El mapa de la memoria |
174
- | `SENTINEL` | Fallos que ninguna condición explica y caídas del proceso, con rutas, usuarios, correos y claves eliminados. Cada reporte tiene `REPORT ON GITHUB ↗` para leerlo antes de publicarlo; `AUTO-REPORT`, apagado por defecto, envía los nuevos al colector del proyecto |
175
- | `RELEASE CHANNEL` | Una consulta a npm al día. Si hay versión nueva, una alerta en la barra y aquí `RESTART WITH x.y.z`: la sala cierra, instala y vuelve en la misma dirección; o el comando para hacerlo tú. Nunca mientras los agentes trabajan |
176
- | `✎ FEEDBACK` | Un issue en blanco con tu entorno ya escrito |
177
- | `?` | El recorrido de cuatro pasos, el mismo que se abre la primera vez |
174
+ | Mapa de memoria (cerebro) | La memoria en un mapa. También está en la barra de arriba |
175
+ | Ajustes (engrane) | Abre Ajustes › Versión y reportes, donde vive el centinela: los fallos que ninguna condición explica y las caídas del proceso, con rutas, usuarios, correos y claves eliminados. Cada reporte se lee antes de enviarse; el autorreporte viene apagado |
176
+ | ¿No se arregló? | Al pie de cada remedio: reporta que no funcionó, con el código de la condición |
177
+ | `?` | El recorrido de cinco paradas, el mismo que se abre la primera vez. Si dejaste a medias la lista de primeros pasos y la ocultaste, también la regresa |
178
178
 
179
179
  ---
180
180
 
181
181
  ## MÓDULOS
182
182
 
183
- `MODULES` en la barra lista los disponibles y su estado. Ninguno escribe en el proyecto salvo la instalación de AHP+, que muestra el comando y pide confirmación.
183
+ `MODULES` en la barra lista los disponibles y su estado. Ninguno escribe en el proyecto salvo la instalación de Continuidad, que muestra el comando y pide confirmación.
184
184
 
185
185
  | Módulo | Qué añade |
186
186
  |---|---|
187
- | **Git Pulse** | `/git status`, `/git log [n]`, `/git diff`, `/git branches`: hechos del repositorio como tarjeta en el hilo, que los agentes también leen. `/git commit "mensaje"` y `/git push confirm`: tu mano sobre el repositorio, con vista previa de lo que saldría |
188
- | **Image Studio** | `generate_image` para Claude, Gemini y OpenCode, con tu key de Gemini, dentro de CREATE |
189
- | **RIPLEY** | El visor renderiza HTML, SVG y Markdown en un marco sellado, con recarga automática |
190
- | **OLLAMA** | Embeddings, archivista y `@madre` en local, gratis y sin cuenta. Se instala, se despierta y descarga su modelo desde el puente |
191
- | **PLAYWRIGHT** | Un navegador headless por turno que solo alcanza esta MADRE: abrir la vista previa de RIPLEY, hacer clic, leer consola, capturas al borrador del turno. Requiere `@playwright/mcp` |
192
- | **Runs** | Un agente te pide correr un comando que su modo no le deja correr; cada línea es un botón, corre sin shell desde la raíz del proyecto, con checkpoint antes y la salida de vuelta en la sala. Cuesta unos 190 tokens de instrucción por turno debajo de AIRLOCK mientras está encendido |
193
- | **Ash** | La economía de tokens de la sala. El interruptor pide a los agentes respuestas en prosa compacta; lo demás está siempre encendido y no se nota: el briefing lleva solo los bloques que el turno puede usar, lo que nunca cambia se lee primero para que el caché lo reconozca, y la transcripción se queda quieta en vez de deslizarse. Nada de lo que tú escribes se altera. En `⚙ CONNECTIONS` se ve a dónde se van los tokens |
194
- | **AHP+** | Integración externa opcional: estado verificado del proyecto, checkpoints y handoffs en `.ahp/`; `/ahp status`, `/ahp check`, `/ahp context` |
187
+ | **Git** | `/git status`, `/git log [n]`, `/git diff`, `/git branches`: hechos del repositorio como tarjeta en el hilo, que los agentes también leen. `/git commit "mensaje"` y `/git push confirm`: tu mano sobre el repositorio, con vista previa de lo que saldría |
188
+ | **Imágenes** | `generate_image` para Claude, Gemini y OpenCode, con tu key de Gemini, dentro de CREAR |
189
+ | **Vista previa** | El visor renderiza HTML, SVG y Markdown en un marco sellado, con recarga automática |
190
+ | **IA local** | Búsqueda inteligente, archivista y `@madre` en local, gratis y sin cuenta. Se instala, se despierta y descarga su modelo desde Conecta tus agentes |
191
+ | **Navegador de pruebas** | Un navegador headless en los turnos que piden ver, probar o capturar una página. Solo alcanza esta MADRE y los servidores que arrancaste desde COMANDOS: abrir la Vista previa o la app servida, hacer clic, leer consola, capturas al borrador del turno. Al encenderlo, MADRE comprueba que el servidor arranque con su navegador. Requiere `@playwright/mcp` |
192
+ | **GitHub** | `/gh`: pull requests abiertos, el CI de tu rama e issues abiertos como tarjeta. `/gh pr [n]`, `/gh ci`, `/gh issues`. `/gh pr create "título"`, `/gh comment <n> "texto"` y `/gh issue "título"` enseñan primero lo que se publicaría y solo publican con `confirm`. Los agentes leen en cualquier modo y escriben solo en `#4` ACCESO TOTAL. Entra con tu sesión de `gh`; sin ella, con un token de acceso detallado guardado en la bodega de MADRE |
193
+ | **Comandos** | Un agente te pide correr un comando que su modo no le deja correr; cada línea es un botón, corre sin shell desde la raíz del proyecto, con punto de restauración antes y la salida de vuelta en el proyecto. Un comando que abre un puerto es un servidor: sigue corriendo hasta que lo detienes desde su tarjeta, y mientras sirve puedes correr otro. Cuesta unos 300 tokens de instrucción por turno debajo de ACCESO TOTAL mientras está encendido |
194
+ | **Ahorro de tokens** | La economía de tokens del proyecto. El interruptor pide a los agentes respuestas en prosa compacta; lo demás está siempre encendido y no se nota: el briefing lleva solo los bloques que el turno puede usar, lo que nunca cambia se lee primero para que el caché lo reconozca, y la transcripción se queda quieta en vez de deslizarse. Nada de lo que tú escribes se altera. En su ventana, en Módulos, se ve a dónde se van los tokens |
195
+ | **Intenciones** | Bajo la caja, cuánto debe pensar Claude Code o Codex para el mensaje que escribes: subir cuando la petición parece pedir más, bajar solo cuando se vio o se midió que basta. Aprende primero de tu uso real, sin gastar tokens: lee en el registro del proyecto qué nivel usaste para cada tipo de pedido y si te alcanzó (seguiste con otra cosa) o se quedó corto (fallo, mala calificación o lo volviste a pedir en 15 minutos); esa lectura vive solo en memoria. Las pruebas rápida y completa de su tarjeta miden más rápido, con preguntas reales del proyecto y un juicio a ciegas, qué nivel basta para cada tipo de pregunta. Las mediciones viven en `~/.pulse/rooms/<sala>/intents.jsonl`. Nada cambia solo |
196
+ | **Continuidad** | Integración externa opcional: estado verificado del proyecto, checkpoints y handoffs en `.ahp/`; `/ahp status`, `/ahp check`, `/ahp context` |
197
+
198
+ Cada módulo es un archivo. Los tuyos van en `~/.pulse/modules/` (todos los proyectos) o en `<proyecto>/.madre/modules/` (ese proyecto): un `.mjs` con `export default { … }`, sin build ni registro, con interruptor, ajustes, comandos `/nombre`, herramientas MCP para los agentes y rutas propias. `RELOAD MODULES` lo recarga sin reiniciar. Guía y ejemplo listo para copiar en [`docs/SDK.md`](SDK.md). Cómo escribir uno, en [CONTRIBUTING.md](../CONTRIBUTING.md#writing-a-module).
199
+
200
+ ---
201
+
202
+ ## INICIO · TODOS TUS PROYECTOS
203
+
204
+ **Inicio** junta todos tus proyectos: la tecla de los tres círculos al principio de la barra. Muestra los proyectos abiertos en esta Mac (quién te espera, quién trabaja, su última conversación y cuántas memorias guarda, por tipo) y los **dormidos**: proyectos cerrados cuya carpeta sigue en disco. El plan completo vive en `docs/MACROVERSO.md`.
205
+
206
+ | En Inicio | Pasa |
207
+ |---|---|
208
+ | **Abrir** | Lleva a ese proyecto en su puerto; con ⌘ se abre al lado |
209
+ | **Cerrar** | Detiene lo que corre en ese proyecto y lo cierra, como `Ctrl+C` en su terminal. Pregunta antes |
210
+ | **Despertar** | Abre un proyecto dormido como lo haría `madre start --project <carpeta>`; lo que dice al arrancar queda en `start.log`, junto a su registro |
211
+ | **Detener todo** | Frena a todos los agentes de todos los proyectos |
212
+ | **Quitar de MADRE** (⋯ en su tarjeta, o clic derecho) | Lo saca de Inicio. Si está abierto, lo cierra antes, y termina sus conexiones. Su carpeta en la Mac no se toca, y su memoria se queda en MADRE: si la vuelves a agregar, ahí está. Pregunta antes |
213
+
214
+ En un proyecto, la tecla junto a la casa **cambia de proyecto**: su indicador dice quién te espera (un número), quién trabaja (late) y quién terminó mientras estabas en otro (verde). Abre un panel con los demás proyectos abiertos; un clic lleva ahí y ⌘-clic abre otra pestaña. Lo lee de `GET /api/salas/open`: las salas abiertas, cada una con su resumen y sin el censo; solo esta Mac.
215
+
216
+ **El Mapa de proyectos**, desde Inicio en una pantalla de 900 px o más: tus proyectos en el espacio abierto, y cada uno es un Mapa de memoria dibujado por el mismo motor que el de su proyecto (`public/nostromo-engine.js`). Arrastra el espacio para moverlo, rueda para acercarte, **Recentrar** para volver a casa. Clic o ← → para volar a uno: el proyecto elegido es el único vivo, con su magma y sus pulsos; arrástralo para girarlo, toca una memoria para leerla en la ficha, Esc para soltarla y otra vez Esc para volver. De lejos cada proyecto se lee de su propio proceso sin las palabras de sus memorias (`GET /api/salas/universe?id=`); solo el elegido las pide (`&full=1`).
217
+
218
+ **Conexiones.** Una conexión es un contrato entre dos proyectos que firmas en Inicio (**Conectar proyectos**, o arrastrando un proyecto sobre otro en el Mapa de proyectos): quién lee de quién (o los dos), qué tipos cruzan y hasta cuándo. Cruzan solo notas destiladas que viajan a los turnos (bodega y puente), limpias por el guardia de privacidad del proyecto que entrega; nunca el registro, archivos, llaves, enfermería ni esclusa; y solo de lectura. En el proyecto que puede leer, cada turno lleva el servidor MCP `pulse-enlaces` (`enlace_rooms`, `enlace_search`); sin contrato no existe. Firmar y revocar dejan una línea en los dos proyectos; cada lectura queda contada (`enlace.read` en el que entrega, `enlace.received` en el que lee) y se ve en Inicio y como pulsos en la conexión del Mapa de proyectos.
219
+
220
+ **Quién leyó.** Cada lectura pertenece a un turno: la herramienta dice su agente y su turno, y el proyecto que lee comprueba que ese turno está corriendo ahí, para ese agente y arriba de INCÓGNITO; si no, no lee nada (ni dice si la conexión existe). La lectura queda con su agente y su turno en el proyecto que lee, con el agente en el que entrega, y bajo la respuesta de ese turno una línea dice «leyó 3 notas de gumball». En Inicio, cada conexión dice quién leyó al último.
221
+
222
+ **Incluir siempre.** Una casilla por conexión, apagada por defecto, en la hoja de firma y en cada conexión de Inicio. Marcada, cada turno del proyecto que lee recibe, sin pedirlas, hasta 3 notas del otro proyecto que casan con la pregunta (en un bloque del prompt, «recordó 3 notas de gumball» bajo la respuesta). Cada turno así es una lectura del tope por hora de la conexión; pasado el tope, el turno sigue sin notas. Nunca en INCÓGNITO, nunca para `@madre`, nunca en el proyecto del Coordinador. Solo tú la marcas o la quitas, desde Inicio; el Coordinador nunca la marca en las conexiones que firma.
223
+
224
+ | Ruta | Qué | Quién |
225
+ |---|---|---|
226
+ | `POST /api/salas/enlaces` · `POST /api/salas/enlaces/revoke` | Firmar y revocar. Dos proyectos se conectan una sola vez: mientras haya una conexión vigente entre ellos, en cualquier dirección, firmar otra responde 409 | La página de Inicio |
227
+ | `POST /api/salas/forget` | Quitar un proyecto de MADRE: lo cierra si está abierto, revoca sus conexiones y aparta su `project.json` como `project.forgotten.json`. Nunca el del Coordinador | La página de Inicio con su `Origin`, nunca un proceso |
228
+ | `GET /api/tour` · `POST /api/tour` | El recorrido de 1.0: si se debe el bonjour, si la persona viene de 0.7.2, capítulos leídos, dónde iba, pistas vistas. Se guarda en `~/.pulse/tour.json`, uno por persona, no uno por puerto | Las páginas de esta Mac |
229
+ | `GET /api/looks` · `POST /api/looks` | La apariencia que comparten Inicio y todos los proyectos: tema, acento, fondo y sus dos diales, burbujas y texto. Se guarda en `~/.pulse/looks.json`, una por persona; cada página la lee al abrir y al volver a verse, y la escribe al cambiarla. Lo que Inicio elige para sus tarjetas se queda en su navegador | Las páginas de esta Mac |
230
+ | `GET /api/tour/projects` · `POST /api/tour/projects` | Los proyectos de 0.7.2 que Inicio no puede listar (sin `project.json`) y traer uno: se busca su carpeta por nombre en las carpetas de siempre y se confirma por el hash de su id. Los quitados a propósito no vuelven | Las páginas de esta Mac |
231
+ | `POST /api/override/arm` | La llave de #3 y #4, comprobada por el proyecto (`src/override.mjs`): lo que se escribió, una o dos veces, y un pase para ese agente y ese modo. Un mensaje a #3 o #4 va solo con su pase; sin permiso recordado abre un mensaje, con él, los que quepan en sus minutos. STOP ALL y un reinicio los retiran. Ocho llaves equivocadas en un minuto responden 429. La huella de la frase nunca sale por `GET /api/settings` ni `/api/state` | Las páginas de esta Mac |
232
+ | `GET /api/enlace/memories` | Lo que este proyecto entrega por un contrato: solo `travels()` y los tipos del contrato, redactado; 404 si el contrato no sirve a quien pide, 423 sellado, 429 sobre el tope | Otro proceso de MADRE con la llave del canal (`~/.pulse/credentials/enlaces.json`), sin `Origin` |
233
+ | `POST /api/enlace/ask` | Lo que este proyecto pide a otro; solo para un turno que corre aquí (409 si no); registra `enlace.received` con agente y turno | El servidor `pulse-enlaces` de un turno, con la llave |
234
+ | `POST /api/salas/enlaces/recall` | Marcar o quitar «Incluir siempre» de una conexión | La página de Inicio, nunca un proceso |
235
+ | `POST /api/enlace/notice` | La línea de Diagnóstico al firmar o revocar | El proyecto que sirve Inicio, con la llave |
236
+
237
+ Los contratos viven en `~/.pulse/config.json` bajo `enlaces` y los cruces en `enlaces.jsonl` junto al registro de cada proyecto.
238
+
239
+ Cada proyecto recuerda dónde está su carpeta (`project.json`, junto a su registro); un proyecto abierto por última vez con una MADRE anterior aparece cuando se vuelve a abrir.
240
+
241
+ **El proyecto del Coordinador.** `madre salas` abre un proyecto que vive en una carpeta de MADRE (`~/.pulse/salas`, creada la primera vez): la puerta de entrada cuando no estás en ningún proyecto, y también lo que abre `madre` a secas desde tu carpeta personal. Es un proyecto como los demás —su conversación, su memoria, sus modos— y en Inicio va primero, con su marca. Su barra lleva la tecla **Mapa de proyectos**. Nunca entrega notas por una conexión, y es el único que puede recibir permiso para dar órdenes a otro (la hoja de firma lo pide con el nombre de ese proyecto).
242
+
243
+ **El Coordinador**, el guardián de tus proyectos, vive en su propio proyecto: ahí viven también lo que sabe de todos (contratos, censo y notas de los proyectos conectados). En su ficha de MÓDULOS eliges qué agente listo habla por él (`@madre` por defecto si Ollama está listo) y su modo de órdenes. Con `@madre`, el Coordinador solo responde: no propone órdenes ni conexiones. Con cualquier otro agente, si le pides actuar o conectar, cierra su respuesta con un bloque `pulse-salas`: el motivo, hasta 4 órdenes `@sala/agente #modo: tarea` y hasta 2 conexiones `enlace A → B: tipos; 7 días; órdenes #1`. El proyecto lo convierte en una tarjeta con una fila por orden y por conexión. Si una pregunta necesita un proyecto sin conexión, el Coordinador propone la conexión por su cuenta.
244
+
245
+ | Modo (ficha del Coordinador) | `#0`–`#1` | `#2` | `#3`–`#4` | Conexiones |
246
+ |---|---|---|---|---|
247
+ | **Manual** (por defecto) | Espera **Enviar** | Espera **Enviar** | Llega a su proyecto como propuesta | Ver abajo |
248
+ | **Híbrido** | Sale sola dentro del contrato | Espera **Enviar** | Llega a su proyecto como propuesta | Ver abajo |
249
+ | **Automático** | Sale sola dentro del contrato | Sale sola dentro del contrato | Llega a su proyecto como propuesta | Ver abajo |
250
+
251
+ | Regla | Dónde se cumple |
252
+ |---|---|
253
+ | Solo el Coordinador ordena, y solo en respuesta a un mensaje que escribiste en su proyecto; nunca en respuesta a una pregunta traída de otro proyecto | El módulo, en el proyecto del Coordinador |
254
+ | Una conexión que solo lee, sin órdenes, la firma el Coordinador al proponerla, por 7 días como máximo; la fila dice «Firmado por el Coordinador» y trae **Revocar**. En la ficha, «Conexiones de lectura: you» te las deja todas a ti. Una conexión con órdenes, que deja editar, la firmas siempre tú: **Firmar** en su fila, con el nombre del proyecto que recibiría órdenes. Firmada, las órdenes del plan que la esperaban se liberan | El contrato (`src/enlaces.mjs`) y la misma firma que la hoja de Inicio |
255
+ | Una orden llega hasta el modo que firmó el contrato y nunca pasa de `#2`. `#3` y `#4` llegan a su proyecto como tarjeta **Desbloquear y enviar**, que la escribe en la caja; al enviarla, el proyecto pide la llave de siempre. Inicio la muestra como «te espera» | El proyecto que recibe |
256
+ | Una orden a la vez por proyecto; nunca interrumpe a un proyecto que está trabajando; tope de órdenes por hora del contrato, contado aparte de las lecturas | El proyecto que recibe |
257
+ | Lo que sale solo, sale una vez: si no puede, queda retenido con su motivo y espera tu botón. Una orden que falla o un DETENER TODO en el proyecto del Coordinador detienen el envío automático del plan | El módulo, en el proyecto del Coordinador |
258
+ | El proyecto ordenado responde en su conversación («del Coordinador · orden n de m») y no puede armar un plan ni dar órdenes. Una orden en curso se detiene desde su fila | El núcleo: la orden corre a profundidad 1 y sin plan |
259
+ | La respuesta vuelve a la conversación del plan como tarjeta (≤ 1200 caracteres, empieza con el proyecto y el agente) y no arranca ningún turno; una línea cierra el plan | El proyecto del Coordinador |
260
+ | Una orden o una pregunta traída por el Coordinador no es palabra tuya: no entra al dataset de entrenamiento | `src/dataset.mjs` |
261
+
262
+ **Levantar al Coordinador desde cualquier proyecto:** `/bishop ¿qué decidió gumball sobre los pagos?`. Si el proyecto del Coordinador duerme, lo despierta; la pregunta corre allí, con lo que el Coordinador sabe de los proyectos conectados, y la respuesta vuelve al proyecto donde preguntaste como una tarjeta **solo para ti**: los agentes de ese proyecto no la leen, porque leer otro proyecto es lo que hace una conexión.
263
+
264
+ | Ruta | Qué | Quién |
265
+ |---|---|---|
266
+ | `POST /api/x/bishop/send` · `skip` · `propose` · `stop` · `link` | Enviar, saltar, llevar una propuesta a su proyecto, detener una orden en curso, firmar una conexión propuesta; el servidor actúa sobre lo que registró, nunca sobre lo que dice la página | La página del proyecto del Coordinador |
267
+ | `POST /api/x/bishop/order` · `proposal` · `halt` | Una orden, una propuesta `#3`/`#4` o un alto que llegan al proyecto al que van; el proyecto revisa llave, contrato, origen, modo, agente, ocupación y tope | El proyecto del Coordinador, con la llave del canal |
268
+ | `POST /api/x/bishop/result` · `consult` | La respuesta a una orden, y una pregunta de `/bishop` | El proyecto que obedeció o que preguntó, con la llave |
269
+ | `POST /api/x/bishop/answer` | La respuesta a `/bishop`, como `bishop.answer` | El proyecto del Coordinador, con la llave |
195
270
 
196
- Cada módulo es un archivo. Los tuyos van en `~/.pulse/modules/` (todas las salas) o en `<proyecto>/.madre/modules/` (ese proyecto): un `.mjs` con `export default { … }`, sin build ni registro, con interruptor, ajustes, comandos `/nombre`, herramientas MCP para los agentes y rutas propias. `RELOAD MODULES` lo recarga sin reiniciar. Guía y ejemplo listo para copiar en [`docs/SDK.md`](SDK.md). Cómo escribir uno, en [CONTRIBUTING.md](../CONTRIBUTING.md#writing-a-module).
271
+ Los planes viven en `bishop-plans.json` junto al registro del proyecto del Coordinador (los últimos 40) y cada orden recibida se cuenta en `enlaces.jsonl` del proyecto que la recibió.
197
272
 
198
273
  ---
199
274
 
200
275
  ## LO QUE SALE DE LA MÁQUINA
201
276
 
202
- - **Nada por sí solo.** MADRE no tiene nube, cuenta ni backend. No guarda credenciales.
277
+ - **Nada por sí solo.** MADRE no tiene nube, cuenta ni backend. No guarda credenciales de proveedores.
203
278
  - **Lo que un agente lee, viaja a su proveedor.** Codex a OpenAI, Claude Code a Anthropic, Gemini CLI a Google, OpenCode a quien tenga configurado. Si `OPENAI_BASE_URL` o `ANTHROPIC_BASE_URL` cambia ese destino, MADRE enseña solo el hostname y bloquea el turno antes de armar el briefing; un gateway verificado se autoriza por agente con `PULSE_ALLOW_CUSTOM_AGENT_ENDPOINTS`. Aplican la cuenta, los límites y los términos del destino efectivo. `@madre` y el archivista con Ollama no salen de la máquina.
204
279
  - **Dos envíos propios, ambos bajo tu interruptor.** El sentinel, apagado por defecto, envía reportes redactados al colector del proyecto. El canal de liberación, encendido por defecto, pregunta a npm por la última versión: viaja el nombre del paquete, nada más, la misma petición que hace `npx`. `PULSE_UPDATE_CHECK=0` lo apaga.
205
- - **Escritura.** En `#1` nadie escribe. En `#2` solo se añade: lo que existía se restaura al terminar el turno. En `#3` todo el proyecto salvo las zonas prohibidas, con checkpoint y `UNDO`. En un proyecto sin git, MADRE guarda sus fotografías en un repositorio sombra fuera del proyecto. Un comando que pide un agente lo corres tú, con checkpoint antes y `UNDO` después.
206
- - **Memoria.** Todo lo dicho fuera de GHOST queda en `~/.pulse/rooms/<sala>/` y vuelve a los prompts de todos los agentes de esa sala. GHOST es la salida para lo que no debe recordarse; PRIVACY, para los nombres que nunca deben aparecer.
280
+ - **Escritura.** En `#1` nadie escribe. En `#2` solo se añade: lo que existía se restaura al terminar el turno. En `#3` todo el proyecto salvo las zonas prohibidas, con punto de restauración y `DESHACER`. En un proyecto sin git, MADRE guarda sus fotografías en un repositorio sombra fuera del proyecto. Un comando que pide un agente lo corres tú, con punto de restauración antes y `DESHACER` después.
281
+ - **Memoria.** Todo lo dicho fuera de INCÓGNITO queda en `~/.pulse/rooms/<sala>/` y vuelve a los prompts de todos los agentes de ese proyecto. INCÓGNITO es la salida para lo que no debe recordarse; PRIVACY, para los nombres que nunca deben aparecer.
207
282
 
208
283
  ---
209
284
 
210
285
  ## REFERENCIA
211
286
 
212
- **`~/.pulse/config.json`**, o `PULSE_HOME/config.json`. Lo escribe MU/TH/UR; las variables de entorno mandan al siguiente arranque.
287
+ **`~/.pulse/config.json`**, o `PULSE_HOME/config.json`. Lo escribe Diagnóstico; las variables de entorno mandan al siguiente arranque.
213
288
 
214
289
  ```json
215
290
  {
@@ -227,23 +302,24 @@ Cada módulo es un archivo. Los tuyos van en `~/.pulse/modules/` (todas las sala
227
302
 
228
303
  | Variable | Predeterminado | Efecto |
229
304
  |---|---|---|
230
- | `PULSE_HOME` | `~/.pulse` | Raíz de las salas y del config |
305
+ | `PULSE_HOME` | `~/.pulse` | Raíz de los proyectos y del config |
231
306
  | `PULSE_LANGUAGE` | del config, si no `es` | `es` o `en`; manda sobre el config y sobre lo que el navegador recuerde |
232
307
  | `PULSE_SOFT_TOKEN_BUDGET` | `500000` | Presupuesto local de tokens por agente, ventana rodante de 5 h |
233
308
  | `PULSE_CONTEXT_MAX_CHARS` | `16000` | Ventana de transcript inyectada |
234
309
  | `PULSE_RECALL_SHARE` | `0.3` | Parte de la ventana para la memoria recordada (`0` la apaga) |
235
310
  | `PULSE_DISTILL` · `_EVERY` · `_IDLE_MS` · `_MAX_CHARS` · `_AGENT` · `_MODEL` | `1` · `10` · `600000` · `6000` · — · — | Destilación de notas |
236
- | `PULSE_EMBED` · `PULSE_EMBED_PROVIDER` | `1` · `auto` | Embeddings; `ollama`, `gemini`, `auto` |
311
+ | `PULSE_EMBED` · `PULSE_EMBED_PROVIDER` | `1` · `auto` | Búsqueda inteligente; `ollama`, `gemini`, `auto` |
237
312
  | `PULSE_OLLAMA` · `_HOST` · `_MODEL` · `_EMBED_MODEL` | `1` · `http://127.0.0.1:11434` · el mejor · el mejor | Ollama |
238
313
  | `PULSE_MEMORY_TOOLS` | `1` | Servidor MCP `pulse-memory` en cada turno |
239
- | `PULSE_PRIVATE_TERMS` · `PULSE_PRIVATE_MARKER` | — · `[ENTIDAD-ORG]` | Términos privados extra y su marcador |
314
+ | `PULSE_PRIVATE_TERMS` · `PULSE_PRIVATE_MARKER` | — · `[ENTIDAD-ORG]` | Datos ocultos extra y su marcador |
240
315
  | `PULSE_UPDATE_CHECK` | `1` | `0` apaga la consulta diaria a npm |
316
+ | `PULSE_GH` | `1` | `0` hace que el módulo GitHub ignore la sesión de `gh` y entre solo con el token que pegaste |
241
317
  | `PULSE_REPORT_URL` · `PULSE_AUTO_REPORT` | colector del proyecto · `0` | Sentinel |
242
318
  | `PULSE_AGENT_TIMEOUT_MS` · `PULSE_<AGENTE>_TIMEOUT_MS` | `180000` · — | Timeouts |
243
319
  | `PULSE_ALLOW_CUSTOM_AGENT_ENDPOINTS` | — | Lista separada por comas (`codex`, `claude`) de gateways que el humano verificó y permite; sin ella, una dirección base no oficial se bloquea |
244
320
  | `PULSE_MAX_MESSAGE_CHARS` | `20000` | Tamaño máximo de un mensaje |
245
- | `PULSE_DELEGATION` · `PULSE_MAX_PLAN_STEPS` | `1` · `4` | Delegación |
246
- | `PULSE_ESCALATION_MS` | `180000` | Cronómetro de la escalación |
321
+ | `PULSE_DELEGATION` · `PULSE_MAX_PLAN_STEPS` | `1` · `4` | Planes |
322
+ | `PULSE_ESCALATION_MS` | `180000` | Cronómetro de la solicitud de permiso |
247
323
  | `PULSE_OPENCODE_MODEL` | del config | `proveedor/modelo` para OpenCode |
248
324
  | `PULSE_CLAUDE_USAGE` · `PULSE_OFFICIAL_QUOTA` | `0` · `1` | Cuota oficial de Claude (lee el llavero); `0` apaga todas las lecturas de proveedor |
249
325
  | `PULSE_GEMINI_IDLE_MS` · `PULSE_GEMINI_RETRIES` · `PULSE_GEMINI_FALLBACK_MODEL` | `90000` · `1` · `gemini-2.5-flash` | Gemini bajo carga |
package/docs/SDK.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # MADRE SDK · escribe tus propios módulos
2
2
 
3
- Un módulo de MADRE es **un archivo**. Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, pulsas RELOAD en MODULES y aparece con su interruptor. Puedes escribirlo a mano o pedírselo a una IA con este documento como contexto.
3
+ Un módulo de MADRE es **un archivo**. Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, recargas los módulos desde «Crea tu módulo» en MÓDULOS y aparece en el tablero con su interruptor. Puedes escribirlo a mano o pedírselo a una IA con este documento como contexto.
4
4
 
5
5
  ## Dónde vive
6
6
 
@@ -72,13 +72,13 @@ la suite compara esta tabla contra el código, así que si alguna vez se separan
72
72
  | `toggle(ctx, payload)` | Sustituye el interruptor por defecto; `confirm: 'texto'` pide confirmación antes de encender |
73
73
  | `onToggle(ctx, enabled)` | Reacciona al interruptor |
74
74
  | `slash` | Comandos `/nombre` que corren en el servidor con tu `ctx` y devuelven `{ ok, title, text }`. La sala los muestra como tarjeta y los agentes los leen |
75
- | `toolsForTurn(ctx, turn)` | Servidores MCP para el turno de un agente: `[{ name, command, args, env, tools, sends, brief }]`. MADRE los adjunta a la CLI en su corrida aislada y describe `brief` al agente |
75
+ | `toolsForTurn(ctx, turn)` | Servidores MCP para el turno de un agente: `[{ name, command, args, env, tools, sends, brief }]`. MADRE los adjunta a la CLI en su corrida aislada y describe `brief` al agente. `turn` trae el agente, el modo, el arriendo, la carpeta, el puerto y `turn.turn`: el id de la respuesta que ese turno escribirá. Si tu servidor llama de vuelta a la sala en nombre del turno, manda ese id; `ctx.room.runningTurn(id)` dice si sigue corriendo y para qué agente |
76
76
  | `toolsForTurn` → `sends` | Cuáles de tus herramientas **mandan algo fuera**. El núcleo las retira por debajo de `#4` AIRLOCK: ni se le cuenta al modelo que existen. Ver abajo |
77
77
  | `reaches` | A dónde llega tu módulo, en las mismas cuatro respuestas que da MADRE de las suyas. Ver abajo |
78
78
  | `secrets` | Las llaves que necesitas, declaradas en vez de dibujadas: `[{ name, label, note, where }]`. MADRE pinta el campo, la guarda en su bodega bajo tu id y te la devuelve por `ctx.vault`. Ver abajo |
79
- | `routes` | Rutas HTTP propias: `{ method, path, handler(ctx, { payload, params, url }) }` → `{ status, body }` |
80
- | `onEvent(ctx, event)` | Cada evento del ledger |
81
- | `controls` | Los ajustes de tu módulo, declarados en vez de dibujados: `[{ key, label, type: 'select' \| 'switch' \| 'text', options, note, invert }]`. MADRE los pinta en la ficha y los guarda en tu bloque de `config.json` |
79
+ | `routes` | Rutas HTTP propias: `{ method, path, handler(ctx, { payload, params, url, request, viaPhone }) }` → `{ status, body }`. `viaPhone` es `true` cuando la petición llega desde un teléfono emparejado: niégalo tú si tu ruta es de la Mac |
80
+ | `onEvent(ctx, event)` | Cada evento del ledger de cada conversación viva de la sala, mientras tu módulo está encendido. `ctx.room` y `ctx.chat` son los de esa conversación y `ctx.record` escribe en ella. Corre aparte: lo que tarde o falle no detiene a la sala. Como siempre, un módulo no fabrica mensajes ni turnos |
81
+ | `controls` | Los ajustes de tu módulo, declarados en vez de dibujados: `[{ key, label, type: 'select' \| 'switch' \| 'text', options, choices, note, invert }]`. MADRE los pinta en la ficha y los guarda en tu bloque de `config.json`. En un `select`, `choices: [{ value, label }]` dice qué frase lee la persona por cada valor que se guarda (si lo das, `options` sale de ahí); sin él, la persona lee el valor tal cual |
82
82
  | `onSettings(ctx, settings)` | Te avisa cuando la humana cambió uno de tus `controls`, por si algo vivo tiene que enterarse |
83
83
  | `conditions` | Entradas para el catálogo de MU/TH/UR, con remedio por plataforma |
84
84
  | `kind` | `'builtin'` (por defecto) cambia cómo se comporta MADRE y vive en `config.json`; `'installer'` escribe en el proyecto con un comando que la humana confirma antes de que corra |
@@ -235,18 +235,22 @@ Y en la cabecera de MODULES hay **+ ADD A MODULE** para instalar el `.mjs` de al
235
235
 
236
236
  ## La ficha
237
237
 
238
- Todas las fichas de MODULES tienen los mismos pisos, en el mismo orden. No dibujas una tarjeta: declaras, y MADRE la arma. Es lo que hace que nueve módulos —y el tuyo— se lean igual.
238
+ No dibujas nada: declaras, y MADRE arma tu módulo igual que los suyos. En MÓDULOS cada módulo es una tarjeta del tablero y, al tocarla, una ficha con los mismos bloques que AJUSTES. Por eso el tuyo se lee igual que los que trae MADRE.
239
239
 
240
- | Piso | Qué muestra | De dónde sale |
240
+ **La tarjeta del tablero** lleva un ícono, tu `name`, una línea con tu `summary` y su interruptor si es un módulo que se enciende. Un módulo tuyo lleva la etiqueta «Tuyo».
241
+
242
+ **La ficha**, en este orden:
243
+
244
+ | Bloque | Qué muestra | De dónde sale |
241
245
  |---|---|---|
242
- | 1 · Quién es | el nombre, `ON`/`OFF`, quién lo hizo, la versión, el botón `↻` y lo que encontró la última mirada | `name`, `vendor`, `version` o `tracks`, `status(ctx).status.detail` |
243
- | 2 · Qué hace | una frase, no tres | `summary` |
244
- | 3 · Qué toca | lo que escribe y lo que necesita, plegado, con su número al lado | `creates`, `requires` (y `commands`, en su propio pliegue) |
245
- | 4 · Ajustes | lo tuyo: selectores, interruptores, campos | `controls`, y lo que tu módulo lea de sí mismo |
246
- | 5 · Llaves | un campo por secreto, lo que hay guardado (nombre y largo, nunca el valor) y `OLVIDARLA` | `secrets` |
247
- | 6 · El interruptor | install, enable o disable. Solo, y siempre abajo | `toggle` / `installCommand` |
246
+ | Qué hace | tu frase, el interruptor «Activo» con lo que dice tu módulo de sí mismo, y la versión con «Buscar una nueva» | `summary`, `status(ctx).status.detail`, `vendor`, `version` o `tracks` |
247
+ | Ajustes | una fila por control: su nombre a la izquierda, el selector, interruptor o campo a la derecha; se guarda al cambiarlo | `controls` |
248
+ | Llaves | un campo por secreto, lo que hay guardado (nombre y largo, nunca el valor) y la opción de olvidarla | `secrets` |
249
+ | Lo que toca | cada cosa que escribe o necesita, con su etiqueta | `creates`, `requires` |
250
+ | Comandos | lo que agrega a la caja de texto | `commands` o `slash` |
251
+ | Tuyo | traer un archivo más nuevo y quitarlo | el archivo que instalaste, `updates` |
248
252
 
249
- El estado es una palabra y un punto —`ON` u `OFF`—, nunca un botón: las acciones se presionan abajo. La principal queda al final; un módulo `DEV` también ofrece `DESINSTALAR`, mientras que uno integrado solo puede apagarse. Un módulo apagado se atenúa entero menos esa fila.
253
+ Un módulo que se instala en el proyecto en vez de encenderse conserva su tarjeta de instalación, con el comando a la vista antes de correr nada, dentro del bloque «Qué hace». Las cifras al inicio de la ficha y la ventana propia son de los módulos de MADRE que guardan una lectura (Ash, Intenciones, Ollama); no hace falta declarar nada para ellas.
250
254
 
251
255
  ## El `ctx`
252
256
 
@@ -276,11 +280,11 @@ ctx = {
276
280
 
277
281
  Escribe `/module <lo que debe hacer>` en el compositor. Es la entrada explícita al flujo guiado: si `#2 CREATE` no está activo, MADRE te pide elegirlo y conserva intacta tu petición. Con `#2` activo, mantiene el agente que elegiste y le entrega el contrato del SDK y el ejemplo. El agente debe escribir **un solo archivo** llamado `<id>.module.mjs` en su carpeta de borrador; no puede instalarlo por su cuenta.
278
282
 
279
- MADRE reconoce ese nombre y pone una tarjeta en la sala: `INSTALL FOR EVERY ROOM` o `INSTALL FOR THIS PROJECT`. Léelo, decide, un clic. MADRE lo valida en una copia, lo guarda como `<id>.mjs` en la carpeta que elegiste y aparece en MODULES con la etiqueta `DEV`. También puedes pedir lo mismo en lenguaje natural mientras estés en `#2` o más; `/module` hace explícito el formato y no concede permisos por sí solo.
283
+ MADRE reconoce ese nombre y pone una tarjeta en la sala: `INSTALL FOR EVERY ROOM` o `INSTALL FOR THIS PROJECT`. Léelo, decide, un clic. MADRE lo valida en una copia, lo guarda como `<id>.mjs` en la carpeta que elegiste y aparece en MÓDULOS con la etiqueta «Tuyo». También puedes pedir lo mismo en lenguaje natural mientras estés en `#2` o más; `/module` hace explícito el formato y no concede permisos por sí solo.
280
284
 
281
285
  Los agentes nunca escriben en `~/.pulse/modules` ni en `.madre/modules`: proponen, tú instalas.
282
286
 
283
- Un módulo tuyo lleva `DEV` y se quita desde su propia tarjeta con `DESINSTALAR` —también aparece en la tarjeta `</>`—. MADRE confirma el archivo exacto, borra ese archivo y su registro de origen para actualizaciones, y lo retira de la sala sin reiniciarla. No borra archivos que el módulo haya creado ni sus ajustes guardados. Los módulos que vienen con MADRE no muestran ese botón: no se quitan, se apagan.
287
+ Un módulo tuyo lleva la etiqueta «Tuyo» y se quita desde su ficha con «Quitar» —también desde «Crea tu módulo», en la lista de los tuyos—. MADRE confirma el archivo exacto, borra ese archivo y su registro de origen para actualizaciones, y lo retira de la sala sin reiniciarla. No borra archivos que el módulo haya creado ni sus ajustes guardados. Los módulos que vienen con MADRE no muestran ese botón: no se quitan, se apagan.
284
288
 
285
289
  ## Lo que un módulo no puede tocar
286
290
 
@@ -290,13 +294,13 @@ Un módulo corre dentro del proceso de MADRE con tus permisos: instala solo lo q
290
294
  - No puede usar el `id` de un módulo integrado ni de otro ya cargado.
291
295
  - `record()` rechaza los tipos de evento reservados (`message.*`, `agent.*`); no puede fabricar turnos ni mensajes.
292
296
  - No recibe credenciales de nadie; usa, como MADRE, las sesiones que ya viven en la máquina.
293
- - Un error en `toolsForTurn` entrega nada; en un comando, la tarjeta dice el error; al cargar, la tarjeta `</>` dice qué archivo y por qué. Nada de eso detiene la sala.
297
+ - Un error en `toolsForTurn` entrega nada; en un comando, la tarjeta dice el error; al cargar, el tablero avisa cuántos no cargaron y «Crea tu módulo» dice qué archivo y por qué. Nada de eso detiene la sala.
294
298
 
295
299
  ## Probarlo
296
300
 
297
301
  1. Copia el archivo a `~/.pulse/modules/`.
298
- 2. En la sala, MODULES → `RELOAD MODULES`. Si el archivo tiene un error, la tarjeta de desarrollo lo dice con la línea exacta.
302
+ 2. En la sala, MÓDULOS → «Crea tu módulo» → «Recargar módulos». Si el archivo tiene un error, ahí mismo lo dice con la línea exacta.
299
303
  3. Enciéndelo con su interruptor. Escribe `/tu-comando` en el compositor.
300
- 4. Cambia el archivo y vuelve a RELOAD: no hace falta reiniciar la sala.
304
+ 4. Cambia el archivo y vuelve a recargar: no hace falta reiniciar la sala.
301
305
 
302
306
  Con una IA: pásale este documento y `hello-module.mjs`, describe lo que quieres y pídele un solo archivo `.mjs` con `export default { … }`. Lo demás lo hace MADRE.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jossuealcala/madre",
3
- "version": "0.7.2",
3
+ "version": "1.0.0",
4
4
  "description": "MADRE · one local room where the AI coding agents already on your machine (Codex, Claude Code, Gemini CLI, OpenCode) work on your project together, share one memory you can see and explore, and answer to you. Read-only by default, with per-message permission modes and checkpoints you can undo. Nothing leaves your machine on its own.",
5
5
  "keywords": [
6
6
  "ai-agents",