@jossuealcala/madre 0.7.1 → 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 (165) hide show
  1. package/CHANGELOG.md +833 -1
  2. package/README.md +92 -28
  3. package/SECURITY.md +1 -0
  4. package/bin/madre.mjs +30 -10
  5. package/docs/REFERENCE.md +158 -79
  6. package/docs/SDK.md +23 -19
  7. package/package.json +1 -1
  8. package/public/app.js +11599 -4186
  9. package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
  10. package/public/assets/brand/Geist-latin.woff2 +0 -0
  11. package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
  12. package/public/assets/brand/GeistMono-latin.woff2 +0 -0
  13. package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
  14. package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
  15. package/public/assets/brand/OFL-Geist.txt +93 -0
  16. package/public/assets/brand/OFL-GeistMono.txt +93 -0
  17. package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
  18. package/public/assets/brand/OFL-Sora.txt +93 -0
  19. package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
  20. package/public/assets/brand/Sora-latin.woff2 +0 -0
  21. package/public/assets/brand/madre-app-180.png +0 -0
  22. package/public/assets/brand/madre-app-192.png +0 -0
  23. package/public/assets/brand/madre-app-512.png +0 -0
  24. package/public/assets/brand/madre-app.svg +1 -0
  25. package/public/assets/brand/madre-favicon.svg +1 -0
  26. package/public/assets/news/1.0/alerts.webp +0 -0
  27. package/public/assets/news/1.0/bar.webp +0 -0
  28. package/public/assets/news/1.0/finder.webp +0 -0
  29. package/public/assets/news/1.0/github.webp +0 -0
  30. package/public/assets/news/1.0/intents.webp +0 -0
  31. package/public/assets/news/1.0/looks.webp +0 -0
  32. package/public/assets/news/1.0/modules.webp +0 -0
  33. package/public/assets/news/1.0/mother.webp +0 -0
  34. package/public/assets/news/1.0/nostromo.webp +0 -0
  35. package/public/assets/news/1.0/permissions.webp +0 -0
  36. package/public/assets/news/1.0/room.webp +0 -0
  37. package/public/assets/news/1.0/settings.webp +0 -0
  38. package/public/assets/wallpapers/biznaga.webp +0 -0
  39. package/public/assets/wallpapers/canela.webp +0 -0
  40. package/public/assets/wallpapers/jarrito.webp +0 -0
  41. package/public/assets/wallpapers/magna.webp +0 -0
  42. package/public/assets/wallpapers/oceano.webp +0 -0
  43. package/public/assets/wallpapers/paraiso.webp +0 -0
  44. package/public/assets/wallpapers/quila.webp +0 -0
  45. package/public/assets/wallpapers/tradicion.webp +0 -0
  46. package/public/assets/wallpapers/tropical.webp +0 -0
  47. package/public/assets/wallpapers/urbania.webp +0 -0
  48. package/public/assets/wallpapers/ventura.webp +0 -0
  49. package/public/assets/wallpapers/xico.webp +0 -0
  50. package/public/brands.js +28 -2
  51. package/public/editor.js +744 -0
  52. package/public/es.js +2863 -1008
  53. package/public/i18n.js +1 -1
  54. package/public/index.html +201 -175
  55. package/public/inquiry.js +11 -11
  56. package/public/loader.js +79 -0
  57. package/public/macroverso.js +1497 -0
  58. package/public/manifest.webmanifest +14 -0
  59. package/public/nostromo-engine.js +2222 -0
  60. package/public/resay.js +24 -0
  61. package/public/review-ask.js +85 -0
  62. package/public/salas-mac.css +787 -0
  63. package/public/salas-mac.html +154 -0
  64. package/public/salas-mac.js +3264 -0
  65. package/public/salas.css +85 -0
  66. package/public/salas.html +47 -0
  67. package/public/salas.js +200 -0
  68. package/public/styles.css +6303 -414
  69. package/public/touch.js +83 -0
  70. package/public/tour-chapters.js +342 -0
  71. package/public/tour.js +510 -0
  72. package/public/troubleshooting.js +159 -140
  73. package/src/adapters/claude.mjs +4 -3
  74. package/src/adapters/codex.mjs +49 -8
  75. package/src/adapters/gemini.mjs +30 -10
  76. package/src/adapters/madre.mjs +110 -18
  77. package/src/adapters/process.mjs +42 -2
  78. package/src/auth-probe.mjs +2 -2
  79. package/src/bridge/devices.mjs +202 -0
  80. package/src/bridge/handoff.mjs +45 -0
  81. package/src/bridge/host.mjs +82 -0
  82. package/src/bridge/network.mjs +133 -0
  83. package/src/bridge/policy.mjs +89 -0
  84. package/src/bridge/qr.mjs +287 -0
  85. package/src/bridge/server.mjs +269 -0
  86. package/src/capabilities.mjs +5 -9
  87. package/src/chats.mjs +59 -22
  88. package/src/checkpoint.mjs +137 -35
  89. package/src/choices.mjs +45 -6
  90. package/src/cli-args.mjs +12 -1
  91. package/src/commands.mjs +15 -15
  92. package/src/config.mjs +73 -9
  93. package/src/conversation-context.mjs +5 -2
  94. package/src/dataset.mjs +3 -1
  95. package/src/directives.mjs +0 -5
  96. package/src/enlaces.mjs +451 -0
  97. package/src/event-store.mjs +55 -10
  98. package/src/exam.mjs +5 -5
  99. package/src/extensions.mjs +0 -2
  100. package/src/file-ops.mjs +42 -0
  101. package/src/files.mjs +52 -2
  102. package/src/github.mjs +407 -0
  103. package/src/json-file.mjs +63 -0
  104. package/src/lease.mjs +2 -2
  105. package/src/lobby-work.mjs +103 -0
  106. package/src/looks.mjs +55 -0
  107. package/src/maturity.mjs +3 -3
  108. package/src/mcp/github-server.mjs +164 -0
  109. package/src/mcp/image-server.mjs +1 -1
  110. package/src/mcp/memory-server.mjs +11 -3
  111. package/src/memory.mjs +38 -12
  112. package/src/models.mjs +109 -1
  113. package/src/modules/ahp.mjs +4 -4
  114. package/src/modules/ash.mjs +1 -1
  115. package/src/modules/bishop-plan.mjs +207 -0
  116. package/src/modules/bishop.mjs +645 -0
  117. package/src/modules/choices.mjs +2 -2
  118. package/src/modules/correo.mjs +1 -1
  119. package/src/modules/enlaces.mjs +255 -0
  120. package/src/modules/git-pulse.mjs +2 -2
  121. package/src/modules/github.mjs +322 -0
  122. package/src/modules/image-studio.mjs +3 -3
  123. package/src/modules/index.mjs +19 -4
  124. package/src/modules/intents-calibration.mjs +338 -0
  125. package/src/modules/intents-desk.mjs +481 -0
  126. package/src/modules/intents-observe.mjs +266 -0
  127. package/src/modules/intents-policy.mjs +414 -0
  128. package/src/modules/intents-try.mjs +91 -0
  129. package/src/modules/intents.mjs +145 -0
  130. package/src/modules/ollama.mjs +9 -5
  131. package/src/modules/playwright.mjs +121 -11
  132. package/src/modules/ripley.mjs +1 -1
  133. package/src/modules/runs.mjs +34 -0
  134. package/src/modules/sdk.mjs +10 -4
  135. package/src/ollama.mjs +25 -1
  136. package/src/outbound.mjs +19 -17
  137. package/src/override.mjs +100 -0
  138. package/src/ports.mjs +23 -1
  139. package/src/prices.mjs +72 -0
  140. package/src/privacy.mjs +30 -11
  141. package/src/quota-sources.mjs +0 -8
  142. package/src/request-guard.mjs +1 -1
  143. package/src/review-ask.mjs +111 -0
  144. package/src/room/archivist.mjs +55 -37
  145. package/src/room/budget.mjs +17 -5
  146. package/src/room/control.mjs +88 -8
  147. package/src/room/economy.mjs +35 -7
  148. package/src/room/escalation.mjs +2 -0
  149. package/src/room/guard.mjs +26 -2
  150. package/src/room/prompt.mjs +32 -13
  151. package/src/room/runs.mjs +151 -0
  152. package/src/room/vectors.mjs +19 -4
  153. package/src/room.mjs +402 -54
  154. package/src/router.mjs +3 -1
  155. package/src/runs.mjs +137 -0
  156. package/src/salas.mjs +313 -0
  157. package/src/sentinel-errors.mjs +1 -1
  158. package/src/server-sentinel.mjs +124 -0
  159. package/src/server.mjs +1578 -167
  160. package/src/setup.mjs +1 -0
  161. package/src/tour.mjs +159 -0
  162. package/src/updates.mjs +48 -8
  163. package/src/usage-sentinel.mjs +1 -1
  164. package/src/verdict.mjs +7 -7
  165. package/src/whats-new.mjs +160 -0
package/README.md CHANGED
@@ -16,23 +16,24 @@ MU/TH/UR 6000 · INTERFACE 2037 · MADRE IS READY
16
16
 
17
17
  <br>
18
18
 
19
- # Los agentes que ya tienes.<br>Una sala. Una memoria.
19
+ # Todas tus IAs en un mismo chat.
20
20
 
21
- Codex, Claude Code, Gemini CLI y OpenCode trabajando sobre el mismo proyecto,
22
- en la misma conversación, recordando lo mismo.
21
+ Codex, Claude Code, Gemini CLI y OpenCode trabajando sobre tus proyectos,
22
+ en la misma conversación, recordando lo mismo. Todos tus proyectos en un lugar,
23
+ y un Coordinador que los ve desde arriba.
23
24
 
24
25
  ```
25
- npx @jossuealcala/madre start
26
+ npx @jossuealcala/madre
26
27
  ```
27
28
 
28
29
  Eso es todo. No hay cuenta que crear, ni nube que configurar, ni llave que pegar.
29
30
  MADRE usa las sesiones que esas CLIs ya tienen en tu máquina.
30
31
 
31
32
  <p align="center">
32
- <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/room.png" alt="La sala de MADRE: Codex y Claude respondiendo en el mismo hilo sobre el mismo proyecto" width="100%">
33
+ <a href="https://github.com/jossuealcacao-exe/madre/blob/main/docs/media/1.0/madre-1-0.mp4"><img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/madre-1-0-video.webp" alt="Ver MADRE 1.0 en 90 segundos" width="100%"></a>
33
34
  </p>
34
35
 
35
- <p align="center"><sub>Una pregunta. Dos agentes. El segundo leyó al primero.</sub></p>
36
+ <p align="center"><sub>MADRE 1.0 en 90 segundos: pantallas reales sobre proyectos de ejemplo. También en <a href="https://madre.run">madre.run</a>.</sub></p>
36
37
 
37
38
  <br>
38
39
 
@@ -40,36 +41,93 @@ MADRE usa las sesiones que esas CLIs ya tienen en tu máquina.
40
41
 
41
42
  <br>
42
43
 
44
+ ## Lo nuevo en 1.0
45
+
46
+ - **Inicio**: todos tus proyectos en un lugar, abiertos o dormidos, con lo que pasó en cada uno.
47
+ - **El Coordinador**: un agente que lee entre tus proyectos, firma conexiones y lleva órdenes de uno a otro.
48
+ - **Conexiones**: un proyecto consulta lo que otro ya aprendió, solo si tú lo firmas.
49
+ - **Permisos a tu manera**: de `#0` Incógnito a `#4` Acceso total, con la llave que tú eliges.
50
+ - **Ajustes y Diagnóstico**: todo lo que configuras en una ventana, y el remedio cuando algo falla.
51
+ - **Módulos como apps**, varias conversaciones a la vez y un editor de código en el visor.
52
+
53
+ Si vienes de 0.7.2, tus proyectos, conversaciones, memoria y ajustes se quedan. El detalle, en el [CHANGELOG](CHANGELOG.md).
54
+
55
+ <br>
56
+
43
57
  ## Una conversación, no cuatro terminales
44
58
 
45
- Escribes `@codex` y contesta Codex. Escribes `@claude` y contesta Claude, **leyendo lo que Codex acaba de decir**. Pides una mesa redonda y cada uno opina por turno sobre lo mismo.
59
+ <p align="center">
60
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-agentes.webp" alt="Todas tus IAs en un mismo chat: Claude contesta después de Codex, con la línea de traspaso que dice cuántos mensajes recibió" width="100%">
61
+ </p>
62
+
63
+ Escribes `@codex` y contesta Codex. Escribes `@claude` y contesta Claude, **leyendo lo que Codex acaba de decir**. Escribes «@madre, pregúntale al equipo…» y cada uno opina por turno sobre lo mismo; al final, @madre resume en qué coinciden y en qué no, citando cada respuesta.
64
+
65
+ <p align="center">
66
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/mesa-redonda.gif" alt="Una mesa redonda en MADRE 1.0: la pregunta, el plan de @madre y las respuestas de cada agente" width="100%">
67
+ </p>
46
68
 
47
69
  Hoy eso son cuatro ventanas, cuatro contextos y tú copiando y pegando entre ellas. MADRE lo vuelve un hilo.
48
70
 
71
+ ## Todos tus proyectos, en un lugar
72
+
73
+ <p align="center">
74
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-inicio.webp" alt="Inicio de MADRE 1.0: el Coordinador con su resumen reciente, quién te espera, las conexiones y una tarjeta por proyecto" width="100%">
75
+ </p>
76
+
77
+ `madre` abre **Inicio**. La primera vez te acompaña en tres pasos: conectar tus agentes (una vez para todos tus proyectos), agregar tus carpetas y abrir las que vas a usar. Cada tarjeta dice si un agente trabaja, si alguien te espera y qué se decidió mientras no estabas.
78
+
79
+ ## Un Coordinador que ve todos tus proyectos
80
+
81
+ <p align="center">
82
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-coordinador.webp" alt="El Coordinador responde qué se decidió en dos proyectos conectados, diciendo de cuál sacó cada dato" width="100%">
83
+ </p>
84
+
85
+ El **Coordinador** vive en Inicio. Lee lo que tus proyectos aprendieron —solo de los que conectas tú— y te contesta diciendo de qué proyecto sacó cada dato. Si lo permites, lleva tareas de un proyecto a otro, hasta `#2`; lo que pide más permiso llega como propuesta que tú desbloqueas. Desde cualquier proyecto le preguntas con `/bishop`.
86
+
87
+ Una **conexión** dice qué tipos de nota cruzan (decisiones, hechos, preferencias, preguntas) y hasta cuándo. Nunca tus archivos ni tus conversaciones, y se revoca cuando quieras.
88
+
49
89
  ## Una memoria que sobrevive a la sesión
50
90
 
51
- Todo lo que se dice queda indexado. Cuando la conversación pasa de la ventana de contexto, cada agente recibe de vuelta lo que hace falta, citado. Cada diez intercambios, la sala destila lo dicho en notas con tipo: una decisión, un hecho, una preferencia, una pregunta abierta.
91
+ <p align="center">
92
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-memoria.webp" alt="El Mapa de memoria: memorias de colores alrededor de un núcleo de magma, unidas por sus enlaces" width="100%">
93
+ </p>
52
94
 
53
- Preguntas *«¿por qué elegimos Postgres?»* tres semanas después y la sala contesta, aunque esa decisión la tomara otro agente en otra sesión.
95
+ Todo lo que se dice queda indexado. Cuando la conversación pasa de la ventana de contexto, cada agente recibe de vuelta lo que hace falta, citado. Cada diez intercambios, el proyecto destila lo dicho en notas con tipo: una decisión, un hecho, una preferencia, una pregunta abierta.
54
96
 
55
- Con [Ollama](https://ollama.com) corriendo, esa memoria además **habla**: `@madre` es un quinto agente, local, gratis, que responde desde todo el archivo con citas y no escribe nada.
97
+ Preguntas *«¿por qué elegimos Postgres?»* tres semanas después y el proyecto contesta, aunque esa decisión la tomara otro agente en otra sesión.
56
98
 
57
- Y la puedes **ver**. En NOSTROMO el archivo es un cerebro en tres dimensiones que giras con el ratón: cada memoria es una estrella cuyo brillo dice cuánto la usa la sala y cuya superficie cuenta si la confirmaste, si nadie la ha revisado o si se está enfriando. En MEMORIA, un tablero te dice qué tan bien está contestando el archivo y qué conviene hacer después.
99
+ Con [Ollama](https://ollama.com) corriendo, esa memoria además **habla**: `@madre` es un quinto agente, local, gratis, que responde desde todo el archivo con citas y no escribe nada. Y la puedes **ver**: el **Mapa de memoria** es un cerebro en tres dimensiones que giras con el ratón, donde cada memoria es una estrella del color de su tipo.
58
100
 
59
101
  ## Leen por defecto. Escriben cuando tú lo dices.
60
102
 
103
+ <p align="center">
104
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-permisos.webp" alt="El menú de modos de MADRE 1.0, de #0 Incógnito a #4 Acceso total" width="100%">
105
+ </p>
106
+
61
107
  Cada mensaje sale con un modo de permiso, y tu modo es el techo de todo lo que ese mensaje arranque.
62
108
 
63
109
  | | | |
64
110
  |---|---|---|
65
- | `#1` | **EXCHANGE** | Leer y coordinar. El predeterminado. |
66
- | `#2` | **CREATE** | Añadir archivos nuevos. Lo que ya existía se restaura al terminar. |
67
- | `#3` | **CONTROL** | Editar el proyecto. Checkpoint antes, lista de cambios y `UNDO` después. |
68
- | `#4` | **AIRLOCK** | Comandos, `git push`, deploys. Pide dos llaves. |
111
+ | `#1` | **SOLO CONVERSAR** | Leer y coordinar. El predeterminado. |
112
+ | `#2` | **CREAR** | Añadir archivos nuevos. Lo que ya existía se restaura al terminar. |
113
+ | `#3` | **EDITAR** | Editar el proyecto. Punto de restauración antes, lista de cambios y `DESHACER` después. |
114
+ | `#4` | **ACCESO TOTAL** | Comandos, `git push`, deploys. Pide la llave dos veces. |
115
+
116
+ También hay `#0 INCÓGNITO`, para lo que no debe quedar en ninguna parte.
117
+
118
+ Subir a `#3` o `#4` es deliberado: MADRE te pide tu llave —por defecto, el nombre de la carpeta del proyecto; en Ajustes › Permisos puedes elegir una frase tuya— y la comprueba el propio proyecto. Ningún agente puede concederse un permiso escribiéndolo en su respuesta.
69
119
 
70
- También hay `#0 GHOST`, para lo que no debe quedar en ninguna parte.
120
+ <p align="center">
121
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-deshacer.webp" alt="Claude cambió tres archivos en #3 Editar y el botón Deshacer regresa el proyecto al punto de restauración" width="100%">
122
+ </p>
71
123
 
72
- Subir a `#3` o `#4` es una ceremonia deliberada: MADRE te pide el nombre de la carpeta del proyecto, escrito por ti. Ningún agente puede concederse un permiso escribiéndolo en su respuesta.
124
+ ## Tu espacio, a tu medida
125
+
126
+ <p align="center">
127
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-espacio.webp" alt="La conversación a la izquierda y el editor de código al lado, en modo Editar" width="100%">
128
+ </p>
129
+
130
+ Cada panel se abre al lado o en una ventana que mueves. Varias conversaciones trabajan a la vez, el visor edita código, los servidores de tu proyecto se abren dentro de MADRE y la barra se arma con clic derecho. **Ajustes** (⌘ ,) reúne todo lo que configuras, con buscador, y **Diagnóstico** te da el remedio cuando algo falla.
73
131
 
74
132
  <br>
75
133
 
@@ -79,9 +137,9 @@ Subir a `#3` o `#4` es una ceremonia deliberada: MADRE te pide el nombre de la c
79
137
 
80
138
  ## Hazla tuya
81
139
 
82
- MADRE trae ocho módulos. El noveno lo escribes tú — o se lo pides a un agente.
140
+ MADRE trae doce módulos —Ahorro de tokens, Intenciones, IA local, GitHub, Continuidad y más—, en un tablero como de apps. El siguiente lo escribes tú, o se lo pides a un agente.
83
141
 
84
- **Un módulo es un archivo.** Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, pulsas RELOAD y aparece con su interruptor, sus ajustes y su ficha. Con uno puedes añadir un comando `/loquesea` que la sala entiende, darle a los agentes una herramienta que antes no tenían, cambiar cómo se comporta la sala, o conectarla con algo que ya usas.
142
+ **Un módulo es un archivo.** Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, recargas y aparece con su interruptor, sus ajustes y su ficha. Con uno puedes añadir un comando `/loquesea` que el proyecto entiende, darle a los agentes una herramienta que antes no tenían, cambiar cómo se comporta MADRE, o conectarla con algo que ya usas.
85
143
 
86
144
  **O no lo escribes tú.** En la caja de texto:
87
145
 
@@ -93,9 +151,9 @@ El agente lee el SDK, escribe el archivo, y MADRE te enseña una tarjeta para re
93
151
 
94
152
  **Conectarla con un servicio de fuera** es lo que más se pide, y la respuesta corta es *casi siempre sí*: el límite no es MADRE, es cómo ese servicio deja que entregues tu propia llave. Vale la pena cuando la consigues en menos de cinco minutos sin ser desarrollador y la puedes revocar sola — GitHub, Linear, Notion, Jira, Slack, Telegram, Stripe, Shopify, Odoo, cualquier base de datos. Donde hay muro es donde el proveedor exige revisar tu app antes de dejarte pasar: Gmail en lectura, Meta, banca.
95
153
 
96
- Tu módulo declara qué llave necesita y MADRE dibuja el campo; declara a dónde llega y el registro de salidas responde por él; declara qué herramientas suyas **mandan** algo, y la sala se las retira a los agentes salvo en el peldaño `#4`. Nada de eso lo programas: lo declaras.
154
+ Tu módulo declara qué llave necesita y MADRE dibuja el campo; declara a dónde llega y el registro de salidas responde por él; declara qué herramientas suyas **mandan** algo, y el proyecto se las retira a los agentes salvo en el peldaño `#4`. Nada de eso lo programas: lo declaras.
97
155
 
98
- **[Escribir un módulo →](docs/SDK.md)** · con dos ejemplos completos que funcionan tal cual: [el mínimo](docs/sdk/hello-module.mjs) y [un conector](docs/sdk/connector-module.mjs).
156
+ **[Escribir un módulo →](docs/SDK.md)** · con dos ejemplos completos que funcionan tal cual: [el mínimo](docs/sdk/hello-module.mjs) y [una integración](docs/sdk/connector-module.mjs).
99
157
 
100
158
  <br>
101
159
 
@@ -109,11 +167,11 @@ Esto importa más que cualquier función.
109
167
 
110
168
  **No hay nube.** MADRE no tiene servidor, ni cuenta, ni backend. Corre en `127.0.0.1` y se muere cuando cierras la terminal.
111
169
 
112
- **Tus llaves, donde hacen falta y en ningún otro lado.** Cuando das la llave de un agente, MADRE la escribe en el archivo donde ese CLI la busca, cerrada a tu usuario, y no conserva copia. Un conector no tiene CLI al que dársela, así que esa —y solo esa— la guarda MADRE, en su propia bodega de tu máquina, con permisos de solo tu usuario, aceptada únicamente desde esta computadora. Nunca en su config, ni en su registro, ni en sus logs, ni en lo que lee un agente: la ficha solo muestra que hay una guardada y cuántos caracteres tiene.
170
+ **Tus llaves, donde hacen falta y en ningún otro lado.** Cuando das la llave de un agente, MADRE la escribe en el archivo donde ese CLI la busca, cerrada a tu usuario, y no conserva copia. Una integración no tiene CLI al que dársela, así que esa —y solo esa— la guarda MADRE, en su propia bodega de tu máquina, con permisos de solo tu usuario, aceptada únicamente desde esta computadora. Nunca en su config, ni en su registro, ni en sus logs, ni en lo que lee un agente: la ficha solo muestra que hay una guardada y cuántos caracteres tiene.
113
171
 
114
- **Nada sale por su cuenta.** Lo que un agente lee viaja a *su* proveedor, con tu cuenta y tus límites — como si lo hubieras corrido en tu terminal, porque eso es exactamente lo que MADRE hace. Los dos únicos envíos propios están bajo tu interruptor: una consulta diaria a npm por si hay versión nueva, y los reportes de fallos, apagados por defecto.
172
+ **Nada sale por su cuenta.** Lo que un agente lee viaja a *su* proveedor, con tu cuenta y tus límites — como si lo hubieras corrido en tu terminal, porque eso es exactamente lo que MADRE hace. Lo que MADRE consulta por su cuenta está declarado, con lo que lo apaga: la consulta diaria de versiones nuevas (npm y GitHub), la cuota de tu plan de Claude, los embeddings e imágenes de Gemini si los activas, y los reportes de fallos, apagados por defecto.
115
173
 
116
- **Y te deja leerlo.** Dentro de la sala puedes abrir el documento exacto que MADRE escribe en tu nombre cada turno, el comando exacto con el que lo entrega, y el registro de cada llamada que salió de esta máquina. No es una promesa: es una pantalla.
174
+ **Y te deja leerlo.** Toca el núcleo del Mapa de memoria y se abre «Lo que se envía»: el documento exacto que MADRE escribe en tu nombre cada turno, el comando exacto con el que lo entrega, y el registro de cada llamada que salió de esta máquina. No es una promesa: es una pantalla.
117
175
 
118
176
  **Cero dependencias.** Node y nada más.
119
177
 
@@ -127,18 +185,24 @@ Esto importa más que cualquier función.
127
185
 
128
186
  Necesitas **Node 22.5** o superior y al menos una de estas CLIs con sesión iniciada: Codex, Claude Code, Gemini CLI u OpenCode.
129
187
 
188
+ ```
189
+ npx @jossuealcala/madre
190
+ ```
191
+
192
+ Desde cualquier carpeta, abre **Inicio** en `http://127.0.0.1:4317/salas`: todos tus proyectos en un lugar, con el Coordinador arriba. La primera vez te acompaña en tres pasos: **conectar tus agentes** (instalar y firmar cada CLI ahí mismo, una vez para todos tus proyectos), **agregar tus proyectos** (eliges las carpetas; agregarlas no las abre) y **abrir** los que vas a usar. Cada proyecto corre por su cuenta, con su propia memoria.
193
+
194
+ Si prefieres entrar directo a un proyecto, como antes:
195
+
130
196
  ```
131
197
  cd tu-proyecto
132
198
  npx @jossuealcala/madre start
133
199
  ```
134
200
 
135
- La sala abre en `http://127.0.0.1:4317`. **Si no tienes ninguna CLI, ábrela igual**: lo primero que ves es el puente, con un botón para instalar y firmar cada agente ahí mismo. MADRE enseña el comando antes de correrlo y transmite cada línea a la pantalla.
136
-
137
201
  ```
138
202
  npx @jossuealcala/madre doctor # qué hay instalado, quién tiene sesión
139
203
  ```
140
204
 
141
- La sala habla **español**. El botón `EN` la pasa a inglés.
205
+ MADRE habla **español**. En Ajustes › Apariencia la pasas a inglés.
142
206
 
143
207
  <br>
144
208
 
@@ -157,7 +221,7 @@ Beta pública. El núcleo está probado y bajo CI en macOS y Linux con Node 22 y
157
221
 
158
222
  Una versión se cierra cuando está en npm. El detalle de cada una en [CHANGELOG.md](CHANGELOG.md); lo que viene, en el [roadmap](https://github.com/jossuealcacao-exe/madre/blob/main/docs/ROADMAP.md).
159
223
 
160
- Problemas: desde MU/TH/UR (`✎ FEEDBACK`) o en [issues](https://github.com/jossuealcacao-exe/madre/issues).
224
+ Problemas: desde cada remedio de Diagnóstico («¿No se arregló?») o en [issues](https://github.com/jossuealcacao-exe/madre/issues).
161
225
  Seguridad: [SECURITY.md](SECURITY.md) · Contribuir: [CONTRIBUTING.md](CONTRIBUTING.md)
162
226
 
163
227
  MADRE es gratis y seguirá siéndolo. Si te ahorra tiempo y quieres que siga creciendo,
package/SECURITY.md CHANGED
@@ -15,6 +15,7 @@ Please include the MADRE version (`madre doctor --json`), the platform, which ag
15
15
 
16
16
  - In `#3 CONTROL`, `.env` files, `.pulse/`, `.madre/` and `.claude/settings.local.json` are made read-only for the length of the turn and restored from the checkpoint afterwards; `.git/` stays writable because the CLIs need it and is only restored after the turn. An agent that changes permissions on purpose is caught by that restoration, not prevented.
17
17
  - `#4 AIRLOCK` runs commands with the CLIs and sessions already on the machine: tests, builds, `git push`, deploys. Files come back with `UNDO`; **what leaves the machine does not**. Arming it asks for two keys — the project designation and the word `AIRLOCK` — and the agent's `MAX MODE` in CONNECTIONS must already reach it, which is a separate deliberate act. No agent can raise its own ceiling, and a permission an agent writes into its own answer is not a permission. Treat `#4` as handing that agent your shell.
18
+ - **Runs** (a module, off until you switch it on) lets an agent below `#4` ask you to run a command. Nothing runs until you press its button, and the server runs the line it recorded the agent asking for, never one sent by the page. Each line runs alone from the project root with no shell, so the line you read is the argv that runs; lines that would need a shell (`|`, `&&`, redirections, variables, globs) are shown and refused. A checkpoint is taken first and `UNDO` restores files; what the command sends off the machine does not come back. Read a command before you press it as you would before pasting it into a terminal.
18
19
  - Everything said outside `#0 GHOST` is kept in the room's memory and reaches every agent of that room. Use GHOST for what must not be remembered.
19
20
 
20
21
  NOBODY DELETES MOTHER'S MEMORY. EVERYTHING ELSE IS FAIR GAME.
package/bin/madre.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { resolve } from 'node:path';
3
+ import { join, resolve } from 'node:path';
4
+ import { homedir } from 'node:os';
4
5
  import { execFileSync } from 'node:child_process';
5
6
  import { readFile, stat } from 'node:fs/promises';
6
7
  import { openUrl, startPulse } from '../src/server.mjs';
@@ -10,6 +11,7 @@ import { probeAll } from '../src/auth-probe.mjs';
10
11
  import { applyConfigToEnv, loadConfig } from '../src/config.mjs';
11
12
  import { isOnline, runSetup } from '../src/setup.mjs';
12
13
  import { parseArgs } from '../src/cli-args.mjs';
14
+ import { ensureSalasProject, isSalasRoom, projectRootFor } from '../src/salas.mjs';
13
15
  import { createServer } from 'node:net';
14
16
 
15
17
  const cli = parseArgs(process.argv.slice(2));
@@ -77,7 +79,15 @@ async function openRoom(options) {
77
79
  process.exit(2);
78
80
  }
79
81
 
80
- const projectRoot = resolve(option('--project', process.cwd()));
82
+ const stateRoot = process.env.PULSE_HOME;
83
+ // Which project this run is about (src/salas.mjs, docs/MACROVERSO.md D-S09): the one named with
84
+ // --project; the room of Salas for `madre salas`, and for a bare `madre` from the home folder;
85
+ // anywhere else, the folder MADRE was run from. The notebook of Salas lives under MADRE's own
86
+ // state, `~/.pulse/salas` unless PULSE_HOME says where that state is.
87
+ const salasHome = stateRoot ?? join(homedir(), '.pulse');
88
+ const projectRoot = projectRootFor({ command, named: cli.named, project: option('--project', null), cwd: process.cwd(), home: homedir(), stateRoot: salasHome });
89
+ // The lobby opens on its list of projects; a project's room on its conversation.
90
+ const openPath = isSalasRoom(projectRoot, salasHome) ? '/salas' : '';
81
91
  const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(Number);
82
92
  if (nodeMajor < 22 || (nodeMajor === 22 && nodeMinor < 5)) {
83
93
  console.error(`\n MOTHER › MADRE needs Node 22.5 or newer (found ${process.version}): the room's memory runs on node:sqlite.\n`);
@@ -91,8 +101,10 @@ if (has('--version') || has('-v') || command === 'version') {
91
101
  console.log(`madre ${pkg.version}${commit ? ` · ${commit}` : ''} · node ${process.version}`);
92
102
  process.exit(0);
93
103
  }
94
- const stateRoot = process.env.PULSE_HOME;
95
104
  if (command !== 'help') {
105
+ // The notebook of Salas is MADRE's own folder: made here, empty, the first time it is opened
106
+ // (D-S08). If it cannot be made, the check below says so, as for any folder that is not there.
107
+ if (isSalasRoom(projectRoot, salasHome)) await ensureSalasProject(salasHome).catch((error) => console.error(` MOTHER › could not make the folder of Salas at ${projectRoot}: ${error.message}`));
96
108
  const stats = await stat(projectRoot).catch(() => null);
97
109
  if (!stats?.isDirectory()) {
98
110
  console.error(`\n MOTHER › project folder not found: ${projectRoot}\n Pass an existing directory with --project, or run MADRE from inside the project.\n`);
@@ -107,7 +119,7 @@ if (command === 'doctor' && (has('--catalog') || has('--conditions'))) {
107
119
  const query = option('--catalog', '') || option('--conditions', '') || '';
108
120
  const platform = PLATFORMS[process.platform] ? process.platform : 'linux';
109
121
  const list = query && !query.startsWith('--') ? searchConditions(query) : CONDITIONS;
110
- console.log(`\nMU/TH/UR · KNOWN CONDITIONS · ${list.length} OF ${CONDITIONS.length} · ${PLATFORMS[platform].label.toUpperCase()} / ${PLATFORMS[platform].shell.toUpperCase()}\n`);
122
+ console.log(`\nDIAGNOSTICS · KNOWN CONDITIONS · ${list.length} OF ${CONDITIONS.length} · ${PLATFORMS[platform].label.toUpperCase()} / ${PLATFORMS[platform].shell.toUpperCase()}\n`);
111
123
  for (const condition of list) {
112
124
  console.log(`▌ ${condition.title}`);
113
125
  console.log(` ${condition.id} · ${condition.severity}${condition.agent ? ` · @${condition.agent}` : ''}`);
@@ -178,11 +190,13 @@ if (command === 'doctor' && (has('--catalog') || has('--conditions'))) {
178
190
  } else if (command === 'setup') {
179
191
  const { action, online } = await runSetup({ projectRoot, stateRoot });
180
192
  if (action === 'start') {
181
- await openRoom({ port: Number(option('--port', '4317')), projectRoot, openBrowser: !has('--no-open') });
193
+ await openRoom({ port: Number(option('--port', '4317')), projectRoot, openBrowser: !has('--no-open'), openPath });
182
194
  } else {
183
195
  process.exitCode = action === 'report' && !online ? 1 : 0;
184
196
  }
185
- } else if (command === 'start') {
197
+ } else if (command === 'start' || command === 'salas' || command === 'lobby') {
198
+ // `madre salas` is `madre start` on the notebook of Salas (projectRoot, above): the same look
199
+ // for a room already open, the same walk up the ports, the same browser unless --no-open.
186
200
  const port = Number(option('--port', '4317'));
187
201
  const noOpen = has('--no-open');
188
202
  // First contact happens in the room, not here: MADRE opens even with nobody online and the
@@ -195,20 +209,26 @@ if (command === 'doctor' && (has('--catalog') || has('--conditions'))) {
195
209
  // A room for this project may already be open. Show that one instead of starting a second.
196
210
  const running = await roomAlreadyOpen(port, projectRoot);
197
211
  if (running) {
198
- console.log(`\nMADRE is already open for this project\n\n ${running.url}\n Project: ${projectRoot}\n Close that room first if you want a fresh one.\n`);
199
- if (!noOpen) openUrl(running.url);
212
+ console.log(`\nMADRE is already open for this project\n\n ${running.url}${openPath}\n Project: ${projectRoot}\n Close that room first if you want a fresh one.\n`);
213
+ if (!noOpen) openUrl(`${running.url}${openPath}`);
200
214
  process.exit(0);
201
215
  }
202
- await openRoom({ port, projectRoot, openBrowser: !noOpen });
216
+ await openRoom({ port, projectRoot, openBrowser: !noOpen, openPath });
203
217
  } else if (command === 'help') {
204
218
  console.log(`MADRE
205
219
 
220
+ madre [--port 4317] [--no-open]
221
+ Opens Home: every project on this computer, in one place.
206
222
  madre start [--project PATH] [--port 4317] [--no-open] [--setup]
223
+ Opens the project in this folder (or PATH) directly.
207
224
  Without --port, a busy 4317 falls through to the next free port.
225
+ madre lobby [--port 4317] [--no-open] (also: madre salas; opens Home)
208
226
  madre setup [--project PATH] [--port 4317] [--no-open]
209
227
  madre doctor [--project PATH] [--json]
210
228
 
211
- start Opens the project room. With nobody online, runs setup first.
229
+ (none) Opens Home. From there you add projects, connect the agents
230
+ and enter any project. The Coordinator lives there.
231
+ start Opens the project in this folder. From your home folder, Home.
212
232
  setup Detects the agents on this computer, shows who has a session,
213
233
  and runs each agent's own sign-in from here.
214
234
  doctor Prints the same diagnosis without the wizard.