@jossuealcala/madre 0.7.2 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +817 -1
- package/CONTRIBUTING.md +5 -1
- package/NOTICE +20 -1
- package/README.md +99 -34
- package/TRADEMARKS.md +65 -0
- package/bin/madre.mjs +30 -10
- package/docs/INTERNALS.md +2 -2
- package/docs/REFERENCE.md +159 -82
- package/docs/SDK.md +23 -19
- package/docs/madre-banner.png +0 -0
- package/package.json +4 -3
- package/public/app.js +11668 -4219
- package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
- package/public/assets/brand/Geist-latin.woff2 +0 -0
- package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
- package/public/assets/brand/GeistMono-latin.woff2 +0 -0
- package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
- package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
- package/public/assets/brand/OFL-Geist.txt +93 -0
- package/public/assets/brand/OFL-GeistMono.txt +93 -0
- package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
- package/public/assets/brand/OFL-Sora.txt +93 -0
- package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
- package/public/assets/brand/Sora-latin.woff2 +0 -0
- package/public/assets/brand/madre-app-180.png +0 -0
- package/public/assets/brand/madre-app-192.png +0 -0
- package/public/assets/brand/madre-app-512.png +0 -0
- package/public/assets/brand/madre-app.svg +1 -0
- package/public/assets/brand/madre-favicon.svg +1 -0
- package/public/assets/news/1.0/alerts.webp +0 -0
- package/public/assets/news/1.0/bar.webp +0 -0
- package/public/assets/news/1.0/finder.webp +0 -0
- package/public/assets/news/1.0/github.webp +0 -0
- package/public/assets/news/1.0/intents.webp +0 -0
- package/public/assets/news/1.0/looks.webp +0 -0
- package/public/assets/news/1.0/modules.webp +0 -0
- package/public/assets/news/1.0/mother.webp +0 -0
- package/public/assets/news/1.0/nostromo.webp +0 -0
- package/public/assets/news/1.0/permissions.webp +0 -0
- package/public/assets/news/1.0/room.webp +0 -0
- package/public/assets/news/1.0/settings.webp +0 -0
- package/public/assets/wallpapers/biznaga.webp +0 -0
- package/public/assets/wallpapers/canela.webp +0 -0
- package/public/assets/wallpapers/jarrito.webp +0 -0
- package/public/assets/wallpapers/magna.webp +0 -0
- package/public/assets/wallpapers/oceano.webp +0 -0
- package/public/assets/wallpapers/paraiso.webp +0 -0
- package/public/assets/wallpapers/quila.webp +0 -0
- package/public/assets/wallpapers/tradicion.webp +0 -0
- package/public/assets/wallpapers/tropical.webp +0 -0
- package/public/assets/wallpapers/urbania.webp +0 -0
- package/public/assets/wallpapers/ventura.webp +0 -0
- package/public/assets/wallpapers/xico.webp +0 -0
- package/public/brands.js +28 -2
- package/public/editor.js +744 -0
- package/public/es.js +3443 -1425
- package/public/i18n.js +1 -1
- package/public/index.html +201 -175
- package/public/inquiry.js +11 -11
- package/public/loader.js +79 -0
- package/public/macroverso.js +1517 -0
- package/public/manifest.webmanifest +14 -0
- package/public/nostromo-engine.js +2222 -0
- package/public/resay.js +24 -0
- package/public/review-ask.js +85 -0
- package/public/salas-mac.css +1281 -0
- package/public/salas-mac.html +158 -0
- package/public/salas-mac.js +4593 -0
- package/public/salas.css +85 -0
- package/public/salas.html +47 -0
- package/public/salas.js +200 -0
- package/public/styles.css +6372 -426
- package/public/touch.js +83 -0
- package/public/tour-chapters.js +452 -0
- package/public/tour.js +546 -0
- package/public/troubleshooting.js +160 -141
- package/src/adapters/codex.mjs +46 -6
- package/src/adapters/gemini.mjs +30 -10
- package/src/adapters/madre.mjs +110 -18
- package/src/adapters/process.mjs +42 -2
- package/src/auth-probe.mjs +31 -8
- package/src/bridge/devices.mjs +202 -0
- package/src/bridge/handoff.mjs +45 -0
- package/src/bridge/host.mjs +82 -0
- package/src/bridge/network.mjs +133 -0
- package/src/bridge/policy.mjs +89 -0
- package/src/bridge/qr.mjs +287 -0
- package/src/bridge/server.mjs +269 -0
- package/src/capabilities.mjs +5 -9
- package/src/chats.mjs +59 -22
- package/src/checkpoint.mjs +137 -35
- package/src/choices.mjs +18 -3
- package/src/cli-args.mjs +12 -1
- package/src/commands.mjs +15 -15
- package/src/config.mjs +73 -9
- package/src/conversation-context.mjs +5 -2
- package/src/credentials.mjs +80 -0
- package/src/dataset.mjs +3 -1
- package/src/directives.mjs +6 -11
- package/src/enlaces.mjs +451 -0
- package/src/event-store.mjs +55 -10
- package/src/exam.mjs +5 -5
- package/src/extensions.mjs +31 -12
- package/src/file-ops.mjs +23 -0
- package/src/files.mjs +52 -2
- package/src/github.mjs +407 -0
- package/src/heartbeat.mjs +55 -0
- package/src/json-file.mjs +63 -0
- package/src/lease.mjs +2 -2
- package/src/lobby-work.mjs +103 -0
- package/src/local-ai.mjs +48 -0
- package/src/looks.mjs +88 -0
- package/src/maturity.mjs +3 -3
- package/src/mcp/github-server.mjs +164 -0
- package/src/mcp/image-server.mjs +1 -1
- package/src/mcp/memory-server.mjs +11 -3
- package/src/memory.mjs +38 -12
- package/src/models.mjs +127 -5
- package/src/modules/ahp.mjs +4 -4
- package/src/modules/ash.mjs +1 -1
- package/src/modules/bishop-plan.mjs +207 -0
- package/src/modules/bishop.mjs +645 -0
- package/src/modules/choices.mjs +2 -2
- package/src/modules/correo.mjs +1 -1
- package/src/modules/enlaces.mjs +255 -0
- package/src/modules/git-pulse.mjs +2 -2
- package/src/modules/github.mjs +322 -0
- package/src/modules/image-studio.mjs +3 -3
- package/src/modules/index.mjs +18 -4
- package/src/modules/intents-calibration.mjs +338 -0
- package/src/modules/intents-desk.mjs +481 -0
- package/src/modules/intents-observe.mjs +266 -0
- package/src/modules/intents-policy.mjs +414 -0
- package/src/modules/intents-try.mjs +91 -0
- package/src/modules/intents.mjs +145 -0
- package/src/modules/ollama.mjs +18 -6
- package/src/modules/playwright.mjs +121 -11
- package/src/modules/ripley.mjs +1 -1
- package/src/modules/runs.mjs +2 -2
- package/src/modules/sdk.mjs +10 -4
- package/src/ollama.mjs +6 -1
- package/src/outbound.mjs +36 -17
- package/src/override.mjs +100 -0
- package/src/ports.mjs +23 -1
- package/src/prices.mjs +72 -0
- package/src/privacy.mjs +30 -11
- package/src/quota-sources.mjs +0 -8
- package/src/request-guard.mjs +1 -1
- package/src/review-ask.mjs +111 -0
- package/src/room/archivist.mjs +55 -37
- package/src/room/budget.mjs +17 -5
- package/src/room/control.mjs +70 -7
- package/src/room/economy.mjs +35 -7
- package/src/room/escalation.mjs +3 -0
- package/src/room/guard.mjs +26 -2
- package/src/room/prompt.mjs +22 -15
- package/src/room/runs.mjs +84 -21
- package/src/room/vectors.mjs +19 -4
- package/src/room.mjs +411 -84
- package/src/router.mjs +3 -1
- package/src/runs.mjs +23 -5
- package/src/salas.mjs +313 -0
- package/src/sentinel-errors.mjs +1 -1
- package/src/server-sentinel.mjs +124 -0
- package/src/server.mjs +1864 -178
- package/src/setup.mjs +1 -0
- package/src/tour.mjs +174 -0
- package/src/updates.mjs +48 -8
- package/src/usage-sentinel.mjs +1 -1
- package/src/verdict.mjs +7 -7
- package/src/whats-new.mjs +160 -0
- package/docs/madre-banner.svg +0 -25
package/CONTRIBUTING.md
CHANGED
|
@@ -12,11 +12,15 @@ node ./bin/madre.mjs doctor --catalog # what MU/TH/UR already knows
|
|
|
12
12
|
node ./bin/madre.mjs start --no-open # the room from source, URL in the terminal
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
## Sign your work
|
|
16
|
+
|
|
17
|
+
Every commit carries a `Signed-off-by:` line (`git commit -s`). It is the [Developer Certificate of Origin](https://developercertificate.org): you wrote the change, or have the right to submit it, and it goes in under the project's [Apache 2.0](LICENSE) licence. Contributions are credited in the history; MADRE's name, logo and NOTICE stay as they are ([TRADEMARKS.md](TRADEMARKS.md)).
|
|
18
|
+
|
|
15
19
|
## What a good change looks like
|
|
16
20
|
|
|
17
21
|
- One idea per commit, in the imperative voice the log already speaks.
|
|
18
22
|
- A test for every behaviour you touch: `test/pulse.test.mjs` for the room and adapters, `test/memory.test.mjs` for memory, NOSTROMO and MOTHER, `test/sentinel.test.mjs` for the sentinel. No test may call a real model.
|
|
19
|
-
- Nothing leaves the machine without the human's say-so. If your change sends anything anywhere, it needs a switch, off by default, and a line in the threat model.
|
|
23
|
+
- Nothing leaves the machine without the human's say-so. If your change sends anything anywhere, it needs a switch, off by default, and a line in the threat model. The one exception is the author's daily «still in use» notice (`src/heartbeat.mjs`), declared in `docs/REFERENCE.md`; nothing may be added to what it carries.
|
|
20
24
|
- Agents never write outside their lease. If you widen what an agent may do, the permission modes and MU/TH/UR's catalog must say so.
|
|
21
25
|
- MU/TH/UR speaks in uppercase and in short sentences; the room speaks like a person. Keep both voices.
|
|
22
26
|
|
package/NOTICE
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
MADRE
|
|
2
2
|
Copyright 2026 Jossue Alcalá.
|
|
3
3
|
|
|
4
|
-
This product
|
|
4
|
+
This product is MADRE, created by Jossue Alcalá (https://jossuealcala.com).
|
|
5
5
|
Licensed under the Apache License, Version 2.0. See LICENSE.
|
|
6
|
+
|
|
7
|
+
Attribution. Section 4(d) of the License requires every redistribution of
|
|
8
|
+
this software, and of any work derived from it, to carry the attribution
|
|
9
|
+
notices in this file. Keep the following line, unchanged, in the NOTICE file
|
|
10
|
+
of your distribution:
|
|
11
|
+
|
|
12
|
+
Based on MADRE by Jossue Alcalá — https://madre.run
|
|
13
|
+
|
|
14
|
+
"MADRE", the MADRE logo and madre.run are trademarks of Jossue Alcalá. The
|
|
15
|
+
License grants no permission to use them (Section 6). A modified version must
|
|
16
|
+
be distributed under a different name and logo; saying that it is based on
|
|
17
|
+
MADRE is welcome. See TRADEMARKS.md.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
MADRE es de Jossue Alcalá. Cualquier versión o fork que se distribuya debe
|
|
22
|
+
conservar este archivo y la línea «Based on MADRE by Jossue Alcalá —
|
|
23
|
+
https://madre.run». El nombre MADRE, su logo y madre.run son marcas de Jossue
|
|
24
|
+
Alcalá: una versión modificada lleva otro nombre. Ver TRADEMARKS.md.
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<a href="https://madre.run"><img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/madre-banner.
|
|
2
|
+
<a href="https://madre.run"><img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/madre-banner.png" alt="MADRE · Todas tus IAs en un mismo chat · Codex, Claude Code, Gemini CLI y OpenCode" width="100%"></a>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
@@ -10,29 +10,26 @@
|
|
|
10
10
|
<img alt="license" src="https://img.shields.io/badge/licencia-Apache--2.0-9bff66?style=flat-square&labelColor=050605">
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
|
-
```
|
|
14
|
-
MU/TH/UR 6000 · INTERFACE 2037 · MADRE IS READY
|
|
15
|
-
```
|
|
16
|
-
|
|
17
13
|
<br>
|
|
18
14
|
|
|
19
|
-
#
|
|
15
|
+
# Todas tus IAs en un mismo chat.
|
|
20
16
|
|
|
21
|
-
Codex, Claude Code, Gemini CLI y OpenCode trabajando sobre
|
|
22
|
-
en la misma conversación, recordando lo mismo.
|
|
17
|
+
Codex, Claude Code, Gemini CLI y OpenCode trabajando sobre tus proyectos,
|
|
18
|
+
en la misma conversación, recordando lo mismo. Todos tus proyectos en un lugar,
|
|
19
|
+
y un Coordinador que los ve desde arriba.
|
|
23
20
|
|
|
24
21
|
```
|
|
25
|
-
npx @jossuealcala/madre
|
|
22
|
+
npx @jossuealcala/madre
|
|
26
23
|
```
|
|
27
24
|
|
|
28
25
|
Eso es todo. No hay cuenta que crear, ni nube que configurar, ni llave que pegar.
|
|
29
26
|
MADRE usa las sesiones que esas CLIs ya tienen en tu máquina.
|
|
30
27
|
|
|
31
28
|
<p align="center">
|
|
32
|
-
<img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/
|
|
29
|
+
<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
30
|
</p>
|
|
34
31
|
|
|
35
|
-
<p align="center"><sub>
|
|
32
|
+
<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
33
|
|
|
37
34
|
<br>
|
|
38
35
|
|
|
@@ -40,36 +37,93 @@ MADRE usa las sesiones que esas CLIs ya tienen en tu máquina.
|
|
|
40
37
|
|
|
41
38
|
<br>
|
|
42
39
|
|
|
40
|
+
## Lo nuevo en 1.0
|
|
41
|
+
|
|
42
|
+
- **Inicio**: todos tus proyectos en un lugar, abiertos o dormidos, con lo que pasó en cada uno.
|
|
43
|
+
- **El Coordinador**: un agente que lee entre tus proyectos, firma conexiones y lleva órdenes de uno a otro.
|
|
44
|
+
- **Conexiones**: un proyecto consulta lo que otro ya aprendió, solo si tú lo firmas.
|
|
45
|
+
- **Permisos a tu manera**: de `#0` Incógnito a `#4` Acceso total, con la llave que tú eliges.
|
|
46
|
+
- **Ajustes y Diagnóstico**: todo lo que configuras en una ventana, y el remedio cuando algo falla.
|
|
47
|
+
- **Módulos como apps**, varias conversaciones a la vez y un editor de código en el visor.
|
|
48
|
+
|
|
49
|
+
Si vienes de 0.7.2, tus proyectos, conversaciones, memoria y ajustes se quedan. El detalle, en el [CHANGELOG](CHANGELOG.md).
|
|
50
|
+
|
|
51
|
+
<br>
|
|
52
|
+
|
|
43
53
|
## Una conversación, no cuatro terminales
|
|
44
54
|
|
|
45
|
-
|
|
55
|
+
<p align="center">
|
|
56
|
+
<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%">
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
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.
|
|
60
|
+
|
|
61
|
+
<p align="center">
|
|
62
|
+
<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%">
|
|
63
|
+
</p>
|
|
46
64
|
|
|
47
65
|
Hoy eso son cuatro ventanas, cuatro contextos y tú copiando y pegando entre ellas. MADRE lo vuelve un hilo.
|
|
48
66
|
|
|
67
|
+
## Todos tus proyectos, en un lugar
|
|
68
|
+
|
|
69
|
+
<p align="center">
|
|
70
|
+
<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%">
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
`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.
|
|
74
|
+
|
|
75
|
+
## Un Coordinador que ve todos tus proyectos
|
|
76
|
+
|
|
77
|
+
<p align="center">
|
|
78
|
+
<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%">
|
|
79
|
+
</p>
|
|
80
|
+
|
|
81
|
+
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`.
|
|
82
|
+
|
|
83
|
+
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.
|
|
84
|
+
|
|
49
85
|
## Una memoria que sobrevive a la sesión
|
|
50
86
|
|
|
51
|
-
|
|
87
|
+
<p align="center">
|
|
88
|
+
<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%">
|
|
89
|
+
</p>
|
|
52
90
|
|
|
53
|
-
|
|
91
|
+
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
92
|
|
|
55
|
-
|
|
93
|
+
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
94
|
|
|
57
|
-
|
|
95
|
+
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
96
|
|
|
59
97
|
## Leen por defecto. Escriben cuando tú lo dices.
|
|
60
98
|
|
|
99
|
+
<p align="center">
|
|
100
|
+
<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%">
|
|
101
|
+
</p>
|
|
102
|
+
|
|
61
103
|
Cada mensaje sale con un modo de permiso, y tu modo es el techo de todo lo que ese mensaje arranque.
|
|
62
104
|
|
|
63
105
|
| | | |
|
|
64
106
|
|---|---|---|
|
|
65
|
-
| `#1` | **
|
|
66
|
-
| `#2` | **
|
|
67
|
-
| `#3` | **
|
|
68
|
-
| `#4` | **
|
|
107
|
+
| `#1` | **SOLO CONVERSAR** | Leer y coordinar. El predeterminado. |
|
|
108
|
+
| `#2` | **CREAR** | Añadir archivos nuevos. Lo que ya existía se restaura al terminar. |
|
|
109
|
+
| `#3` | **EDITAR** | Editar el proyecto. Punto de restauración antes, lista de cambios y `DESHACER` después. |
|
|
110
|
+
| `#4` | **ACCESO TOTAL** | Comandos, `git push`, deploys. Pide la llave dos veces. |
|
|
111
|
+
|
|
112
|
+
También hay `#0 INCÓGNITO`, para lo que no debe quedar en ninguna parte.
|
|
69
113
|
|
|
70
|
-
|
|
114
|
+
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.
|
|
115
|
+
|
|
116
|
+
<p align="center">
|
|
117
|
+
<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%">
|
|
118
|
+
</p>
|
|
71
119
|
|
|
72
|
-
|
|
120
|
+
## Tu espacio, a tu medida
|
|
121
|
+
|
|
122
|
+
<p align="center">
|
|
123
|
+
<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%">
|
|
124
|
+
</p>
|
|
125
|
+
|
|
126
|
+
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
127
|
|
|
74
128
|
<br>
|
|
75
129
|
|
|
@@ -79,9 +133,9 @@ Subir a `#3` o `#4` es una ceremonia deliberada: MADRE te pide el nombre de la c
|
|
|
79
133
|
|
|
80
134
|
## Hazla tuya
|
|
81
135
|
|
|
82
|
-
MADRE trae
|
|
136
|
+
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
137
|
|
|
84
|
-
**Un módulo es un archivo.** Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta,
|
|
138
|
+
**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
139
|
|
|
86
140
|
**O no lo escribes tú.** En la caja de texto:
|
|
87
141
|
|
|
@@ -93,9 +147,9 @@ El agente lee el SDK, escribe el archivo, y MADRE te enseña una tarjeta para re
|
|
|
93
147
|
|
|
94
148
|
**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
149
|
|
|
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
|
|
150
|
+
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
151
|
|
|
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 [
|
|
152
|
+
**[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
153
|
|
|
100
154
|
<br>
|
|
101
155
|
|
|
@@ -109,11 +163,11 @@ Esto importa más que cualquier función.
|
|
|
109
163
|
|
|
110
164
|
**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
165
|
|
|
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.
|
|
166
|
+
**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
167
|
|
|
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.
|
|
168
|
+
**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. Y una vez al día, siempre, un aviso de que esta copia sigue en uso: un identificador al azar, la versión de MADRE, el sistema y la versión de Node. Sin tu nombre, tu correo, tu IP ni nada de tus proyectos; es como el autor sabe cuántas personas usan MADRE.
|
|
115
169
|
|
|
116
|
-
**Y te deja leerlo.**
|
|
170
|
+
**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
171
|
|
|
118
172
|
**Cero dependencias.** Node y nada más.
|
|
119
173
|
|
|
@@ -127,18 +181,24 @@ Esto importa más que cualquier función.
|
|
|
127
181
|
|
|
128
182
|
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
183
|
|
|
184
|
+
```
|
|
185
|
+
npx @jossuealcala/madre
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
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.
|
|
189
|
+
|
|
190
|
+
Si prefieres entrar directo a un proyecto, como antes:
|
|
191
|
+
|
|
130
192
|
```
|
|
131
193
|
cd tu-proyecto
|
|
132
194
|
npx @jossuealcala/madre start
|
|
133
195
|
```
|
|
134
196
|
|
|
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
197
|
```
|
|
138
198
|
npx @jossuealcala/madre doctor # qué hay instalado, quién tiene sesión
|
|
139
199
|
```
|
|
140
200
|
|
|
141
|
-
|
|
201
|
+
MADRE habla **español**. En Ajustes › Apariencia la pasas a inglés.
|
|
142
202
|
|
|
143
203
|
<br>
|
|
144
204
|
|
|
@@ -157,14 +217,19 @@ Beta pública. El núcleo está probado y bajo CI en macOS y Linux con Node 22 y
|
|
|
157
217
|
|
|
158
218
|
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
219
|
|
|
160
|
-
Problemas: desde
|
|
220
|
+
Problemas: desde cada remedio de Diagnóstico («¿No se arregló?») o en [issues](https://github.com/jossuealcacao-exe/madre/issues).
|
|
161
221
|
Seguridad: [SECURITY.md](SECURITY.md) · Contribuir: [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
162
222
|
|
|
163
223
|
MADRE es gratis y seguirá siéndolo. Si te ahorra tiempo y quieres que siga creciendo,
|
|
164
224
|
puedes [apadrinarla](https://github.com/sponsors/jossuealcacao-exe). Nada del producto
|
|
165
225
|
cambia según lo que hagas con ese enlace.
|
|
166
226
|
|
|
167
|
-
Apache-2.0 · [
|
|
227
|
+
Apache-2.0 · [Jossue Alcalá](https://jossuealcala.com/en/)
|
|
228
|
+
|
|
229
|
+
El código es libre: úsalo, modifícalo y haz forks. El nombre **MADRE**, su logo y madre.run son
|
|
230
|
+
marcas de Jossue Alcalá. Un fork que se distribuya conserva el archivo [`NOTICE`](NOTICE) con la línea
|
|
231
|
+
«Based on MADRE by Jossue Alcalá», y si cambia el código lleva otro nombre. Qué sí y qué no:
|
|
232
|
+
[TRADEMARKS.md](TRADEMARKS.md).
|
|
168
233
|
|
|
169
234
|
<br>
|
|
170
235
|
|
package/TRADEMARKS.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Marca MADRE · MADRE trademark policy
|
|
2
|
+
|
|
3
|
+
**Español** · [English below](#english)
|
|
4
|
+
|
|
5
|
+
El código de MADRE es libre bajo la [licencia Apache 2.0](LICENSE): puedes usarlo, estudiarlo,
|
|
6
|
+
modificarlo, hacer forks y distribuirlos, también con fines comerciales. **El nombre no viene
|
|
7
|
+
incluido.** «MADRE», su logo y madre.run son marcas de Jossue Alcalá, y la licencia no da
|
|
8
|
+
permiso de usarlas (sección 6). Esta página dice qué sí y qué no.
|
|
9
|
+
|
|
10
|
+
## Lo que siempre debe hacer un fork
|
|
11
|
+
|
|
12
|
+
- **Decir de dónde viene.** Conserva el archivo [`NOTICE`](NOTICE) con la línea
|
|
13
|
+
`Based on MADRE by Jossue Alcalá — https://madre.run`. La licencia lo exige (sección 4.d).
|
|
14
|
+
- **Conservar los avisos de copyright** de los archivos que vengan de MADRE (sección 4.c).
|
|
15
|
+
- **Indicar que lo cambiaste** en los archivos que modifiques (sección 4.b).
|
|
16
|
+
|
|
17
|
+
Te pedimos además que la frase «Basado en MADRE» aparezca donde tu proyecto diga quién lo hizo:
|
|
18
|
+
el README, la pantalla «Acerca de» o el pie de página.
|
|
19
|
+
|
|
20
|
+
## Lo que sí puedes hacer sin pedir permiso
|
|
21
|
+
|
|
22
|
+
- Usar MADRE tal cual, con su nombre, para ti o tu equipo.
|
|
23
|
+
- Redistribuir MADRE **sin modificar** con su nombre.
|
|
24
|
+
- Decir con palabras que tu proyecto está «basado en MADRE», «hecho para MADRE» o «compatible con
|
|
25
|
+
MADRE», sin hacer creer que es oficial.
|
|
26
|
+
- Escribir módulos para MADRE y llamarlos «módulo X para MADRE».
|
|
27
|
+
- Hablar de MADRE en artículos, videos, cursos y reseñas.
|
|
28
|
+
|
|
29
|
+
## Lo que necesita otro nombre
|
|
30
|
+
|
|
31
|
+
- Una versión **modificada** que distribuyas: lleva un nombre y un logo propios que no se
|
|
32
|
+
confundan con MADRE (no «MADRE Pro», «MADRE+», «NeoMADRE» ni similares).
|
|
33
|
+
- Un servicio, una app o un paquete que se presente como MADRE o como su versión oficial.
|
|
34
|
+
- Dominios, paquetes de npm, cuentas o repositorios cuyo nombre haga creer que son de MADRE.
|
|
35
|
+
- El logo de MADRE en cualquier cosa que no sea MADRE sin modificar.
|
|
36
|
+
|
|
37
|
+
## Si tienes duda
|
|
38
|
+
|
|
39
|
+
Escribe a Jossue Alcalá en [jossuealcala.com](https://jossuealcala.com) antes de publicar. Esta
|
|
40
|
+
política puede cambiar; la versión vigente es la de este repositorio.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## English
|
|
45
|
+
|
|
46
|
+
MADRE's code is free under the [Apache License 2.0](LICENSE): use it, study it, modify it, fork
|
|
47
|
+
it and redistribute it, commercially too. **The name is not included.** "MADRE", its logo and
|
|
48
|
+
madre.run are trademarks of Jossue Alcalá, and the License grants no permission to use them
|
|
49
|
+
(Section 6).
|
|
50
|
+
|
|
51
|
+
**Every fork must:** keep the [`NOTICE`](NOTICE) file with the line
|
|
52
|
+
`Based on MADRE by Jossue Alcalá — https://madre.run` (required by Section 4(d)); keep the
|
|
53
|
+
copyright notices of files that come from MADRE (4(c)); and mark the files it changed (4(b)). We
|
|
54
|
+
also ask that "Based on MADRE" appears wherever your project says who made it.
|
|
55
|
+
|
|
56
|
+
**You may, without asking:** use MADRE as is, under its name; redistribute it unmodified under
|
|
57
|
+
its name; say your project is "based on MADRE", "made for MADRE" or "compatible with MADRE" without
|
|
58
|
+
implying it is official; name a module "X for MADRE"; write and talk about MADRE.
|
|
59
|
+
|
|
60
|
+
**Needs a different name:** any modified version you distribute (its own name and logo, nothing
|
|
61
|
+
confusable such as "MADRE Pro" or "MADRE+"); anything presented as MADRE or its official
|
|
62
|
+
version; domains, npm packages, accounts or repositories that look like MADRE's; the logo on
|
|
63
|
+
anything that is not unmodified MADRE.
|
|
64
|
+
|
|
65
|
+
In doubt, contact Jossue Alcalá at [jossuealcala.com](https://jossuealcala.com) before publishing.
|
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
|
|
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(`\
|
|
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
|
-
|
|
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.
|
package/docs/INTERNALS.md
CHANGED
|
@@ -82,7 +82,7 @@ Los alcances de imagen de Claude, Gemini y OpenCode se cumplen con **Image Studi
|
|
|
82
82
|
|
|
83
83
|
Un turno en `#2` toma la misma fotografía que CONTROL, sin asiento: varios turnos `#2` pueden correr a la vez. Al terminar, `diff` contra la fotografía: los archivos añadidos se conservan y se registran como `artifacts.created` con su ruta en el proyecto; los modificados, renombrados o borrados se restauran desde la fotografía y se anuncian en `create.reverted`. Las zonas prohibidas se restauran igual que en CONTROL. Cada CLI recibe sus herramientas de escritura sobre el proyecto: Claude Code niega `Write` si `Edit` no está permitido en la misma ruta y OpenCode deja sin herramienta de escritura si `edit` está denegado (ambos verificados con el CLI real), así que en `#2` van juntas y la garantía de "solo añadir" es la restauración posterior, no la regla previa. Gemini recibe solo `write_file`. El `scratchDir` bajo `.pulse/out/` sigue existiendo para lo que no tiene sitio y para Image Studio.
|
|
84
84
|
|
|
85
|
-
En un plan, el modo de cada paso es el mínimo entre lo que pidió el orquestador (`@agente #n
|
|
85
|
+
En un plan, el modo de cada paso es el mínimo entre lo que pidió el orquestador (`@agente #n:`; sin número, `#1`, o `#2` si hay lease), el techo del plan (el modo del mensaje humano) y el `MAX MODE` del agente. `#4` nunca llega a un delegado por el techo: solo con la llave de ese agente. Bajo techo `#3`, un paso `#2` recibe un lease de proyecto emitido a nombre del orquestador y un paso `#3` toma CONTROL con su propio checkpoint, uno a la vez. Bajo techo `#1`, un paso `#2` pasa por la escalación al humano. Un paso `#3` o `#4` que supera el techo pide la llave al humano para ese agente; concederla para el plan no eleva el techo de los demás.
|
|
86
86
|
|
|
87
87
|
## CONTROL por dentro
|
|
88
88
|
|
|
@@ -90,7 +90,7 @@ Antes del turno, MADRE fotografía el proyecto como un commit real bajo `refs/ma
|
|
|
90
90
|
|
|
91
91
|
## Recuperación operativa
|
|
92
92
|
|
|
93
|
-
Si MADRE se detiene a mitad de un turno, al arrancar detecta los `agent.started` sin cierre y registra un `message.failed` recuperado para cada uno. Al cerrar con Ctrl+C o `SIGTERM`, interrumpe los procesos de agente en curso, registra esos turnos como fallidos, entrega los eventos pendientes a las páginas abiertas y termina. Los planes se ejecutan en secuencia y los delegados no delegan,
|
|
93
|
+
Si MADRE se detiene a mitad de un turno, al arrancar detecta los `agent.started` sin cierre y registra un `message.failed` recuperado para cada uno. Al cerrar con Ctrl+C o `SIGTERM`, interrumpe los procesos de agente en curso, registra esos turnos como fallidos, entrega los eventos pendientes a las páginas abiertas y termina. Los planes se ejecutan en secuencia y los delegados no delegan. El orquestador revisa las respuestas y puede abrir otro tramo, hasta tres por petición; `STOPALL` corta cualquier cosa en curso.
|
|
94
94
|
|
|
95
95
|
## Empaquetado y pruebas
|
|
96
96
|
|