@jossuealcala/madre 1.0.0 → 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.
@@ -11,10 +11,16 @@
11
11
  // `news` — that says what is new or different since 0.7.2, checked against the v0.7.2 tag (BISHOP,
12
12
  // Home, the second bar, Settings and the phone did not exist there; MU/TH/UR, NOSTROMO,
13
13
  // ⚙ CONNECTIONS, AIRLOCK, the ash key and the EN and theme keys did).
14
+ //
15
+ // A third person from 1.1 (2026-10-14): whoever already read the tour of 1.0 (path «since»). They
16
+ // are told only what changed after it, and each chapter they read opens with `since`, as `news`
17
+ // does for 0.7.2: the clearer names (Spanish only: the English did not change, `only`), Home as a
18
+ // board, its widgets, the local AI chosen project by project, the sky of connections and Settings.
14
19
 
15
20
  export const ORDER = {
16
- new: ['home', 'project', 'talk', 'modes', 'settings', 'modules', 'coordinator', 'links', 'maps', 'phone', 'gestures'],
17
- back: ['moved', 'home', 'coordinator', 'links', 'maps', 'project', 'settings', 'modules', 'talk', 'modes', 'phone', 'gestures'],
21
+ new: ['home', 'widgets', 'project', 'talk', 'modes', 'settings', 'modules', 'local', 'coordinator', 'links', 'maps', 'phone', 'gestures'],
22
+ back: ['moved', 'home', 'widgets', 'coordinator', 'links', 'maps', 'project', 'settings', 'modules', 'local', 'talk', 'modes', 'phone', 'gestures'],
23
+ since: ['renamed', 'board', 'widgets', 'local', 'links', 'settings', 'gestures'],
18
24
  };
19
25
 
20
26
  export const CHAPTERS = [
@@ -26,15 +32,15 @@ export const CHAPTERS = [
26
32
  ['MU/TH/UR', { es: 'Diagnóstico', en: 'Diagnostics' }],
27
33
  ['NOSTROMO', { es: 'Mapa de memoria, en la barra', en: 'Memory map, on the bar' }],
28
34
  [{ es: '⚙ CONEXIONES (sesión)', en: '⚙ CONNECTIONS (sign-in)' }, { es: 'Ajustes › Agentes', en: 'Settings › Agents' }],
29
- ['#4 AIRLOCK', { es: '#4 Acceso total: la llave dos veces', en: '#4 Full access: the key, twice' }],
35
+ ['#4 AIRLOCK', { es: '#4 Acceso total: confirmas dos veces', en: '#4 Full access: the key, twice' }],
30
36
  ['ash', { es: 'Ahorro de tokens, en Módulos', en: 'Token saver, in Modules' }],
31
37
  [{ es: 'EN · tema', en: 'EN · theme' }, { es: 'Ajustes › Apariencia', en: 'Settings › Appearance' }],
32
38
  ],
33
39
  points: {
34
40
  es: [
35
41
  '<code>madre</code> sin nada más abre Inicio; <code>madre start</code> sigue abriendo el proyecto de la carpeta.',
36
- '«Conexiones» ya no es iniciar sesión de los agentes: eso vive en Ajustes › Agentes. Ahora una conexión deja que un proyecto consulte lo que otro aprendió.',
37
- 'Ajustes (⌘ ,) reúne lo que estaba en MU/TH/UR, en ⚙ CONEXIONES y en las teclas EN y de tema; Diagnóstico es lo que era MU/TH/UR.',
42
+ '«Conexiones» ya no sirve para iniciar sesión en los agentes: eso ahora está en Ajustes › Agentes. Ahora una conexión deja que un proyecto consulte lo que otro aprendió.',
43
+ 'Ajustes (⌘ ,) reúne lo que estaba en MU/TH/UR, en ⚙ CONEXIONES y en las teclas EN y de tema. Diagnóstico es el nuevo nombre de MU/TH/UR.',
38
44
  ],
39
45
  en: [
40
46
  '<code>madre</code> on its own opens Home; <code>madre start</code> still opens the project in the folder.',
@@ -52,20 +58,97 @@ export const CHAPTERS = [
52
58
  news: { kind: 'new', es: 'En 0.7.2 cada proyecto se abría por su cuenta con <code>madre start</code>; Inicio los reúne a todos.', en: 'In 0.7.2 each project opened on its own with <code>madre start</code>; Home gathers them all.' },
53
59
  points: {
54
60
  es: [
55
- 'Agrega carpetas: no se abren hasta que tú quieras.',
56
- 'Clic derecho o ⋯ en una tarjeta: anclarla a la barra, ordenarla o quitarla de MADRE. Su carpeta no se toca.',
57
- 'Te esperan, Decisiones recientes y el Resumen reciente te dicen qué pasó mientras no estabas.',
61
+ 'Agrega las carpetas de tus proyectos; ninguna se abre hasta que tú lo decidas. Clic derecho o ⋯ en un proyecto para anclarlo a la barra o quitarlo de MADRE; su carpeta no se toca.',
62
+ 'Inicio es un tablero: clic derecho en cualquier tarjeta para moverla, cambiar su tamaño o quitarla, y en el fondo para agregar widgets. También puedes arrastrarlas.',
63
+ 'Te esperan, Decisiones recientes y Resumen reciente te cuentan qué pasó mientras no estabas.',
58
64
  ],
59
65
  en: [
60
- 'Add folders: they do not open until you want them to.',
61
- 'Right-click or ⋯ on a card: pin it to the bar, order it, or remove it from MADRE. Its folder is not touched.',
66
+ 'Add folders: they do not open until you want them to. Right-click or ⋯ on a project to pin it to the bar or remove it from MADRE; its folder is not touched.',
67
+ 'Home is a board: right-click any card to move it, resize it or take it off, and the background to add widgets. You can drag them too.',
62
68
  'Waiting for you, Recent decisions and the Recent summary tell you what happened while you were away.',
63
69
  ],
64
70
  },
65
71
  keys: [
66
72
  [{ es: 'Menú de un proyecto', en: 'A project\'s menu' }, { es: 'clic derecho · ⋯', en: 'right-click · ⋯' }],
67
- [{ es: 'Anclarlo a la barra', en: 'Pin it to the bar' }, { es: 'arrastrar la tarjeta', en: 'drag the card' }],
68
- [{ es: 'Los que no caben', en: 'Those that do not fit' }, '+n'],
73
+ [{ es: 'Acomodar una tarjeta', en: 'Arrange a card' }, { es: 'clic derecho · arrastrar', en: 'right-click · drag' }],
74
+ [{ es: 'Agregar widgets', en: 'Add widgets' }, { es: 'clic derecho en el fondo', en: 'right-click the background' }],
75
+ ],
76
+ where: ['home'],
77
+ },
78
+ {
79
+ id: 'renamed',
80
+ only: 'es',
81
+ title: { es: 'Nombres más claros', en: 'Clearer names' },
82
+ lead: { es: 'MADRE ahora dice las cosas como son. Lo que buscabas sigue ahí, con otro nombre.', en: 'MADRE now says things as they are.' },
83
+ moved: [
84
+ [{ es: 'Turnos', en: 'Turns' }, { es: 'Respuestas', en: 'Replies' }],
85
+ [{ es: 'Remedio · condición', en: 'Remedy · condition' }, { es: 'Solución · problema', en: 'Solution · problem' }],
86
+ [{ es: 'BODEGA · PUENTE · ENFERMERÍA · ESCLUSA', en: 'HOLD · BRIDGE · MED BAY · JETTISONED' }, { es: 'SIN CONFIRMAR · CONFIRMADA · EN CUARENTENA · DESCARTADA', en: 'UNCONFIRMED · CONFIRMED · QUARANTINED · DISCARDED' }],
87
+ [{ es: 'Archivista', en: 'Archivist' }, { es: 'Quien resume la memoria', en: 'Who sums up the memory' }],
88
+ [{ es: 'La llave de #3 y #4', en: 'The key of #3 and #4' }, { es: 'Confirmar', en: 'Confirm' }],
89
+ [{ es: 'Abordar · Papeles', en: 'Board · Roles' }, { es: 'Entrar · Funciones', en: 'Board · Roles' }],
90
+ ],
91
+ points: {
92
+ es: [
93
+ 'Solo cambiaron palabras: todo funciona igual y nada de lo que configuraste se movió.',
94
+ 'Cada texto se revisó para que se entienda aunque no sepas de IA ni de programación.',
95
+ 'Los guiños a Alien siguen ahí, y los comandos de la consola de Diagnóstico siguen en inglés.',
96
+ ],
97
+ en: [],
98
+ },
99
+ keys: [],
100
+ where: [],
101
+ },
102
+ {
103
+ id: 'board',
104
+ title: { es: 'Inicio, a tu manera', en: 'Home, your way' },
105
+ lead: { es: 'Inicio es un tablero: cada tarjeta se mueve, cambia de tamaño o se quita.', en: 'Home is a board: every card moves, changes size or comes off.' },
106
+ news: { kind: 'new', es: 'En 0.7.2 no había Inicio; ahora es un tablero que acomodas a tu gusto.', en: 'There was no Home in 0.7.2; now it is a board you arrange your way.' },
107
+ since: { kind: 'new', es: 'En 1.0 Inicio tenía un orden fijo; ahora lo acomodas tú.', en: 'In 1.0 Home had a fixed order; now you arrange it.' },
108
+ points: {
109
+ es: [
110
+ 'Clic derecho en una tarjeta para moverla, cambiar su ancho y su alto, o quitarla. Clic derecho en un espacio vacío para agregar tarjetas o volver al acomodo original.',
111
+ 'Arrastra una tarjeta para cambiarla de lugar; si la llevas al borde, la página se desplaza sola.',
112
+ 'El cajón de Proyectos muestra tres filas y +N abre los demás; ordénalos por Te necesita, nombre, reciente o en tu propio orden. Cada página tiene su propio fondo.',
113
+ ],
114
+ en: [
115
+ 'Right-click a card to move it, change its width and height, or take it off. Right-click an empty spot to add cards or go back to the default layout.',
116
+ 'Drag a card to move it; carried to the edge, the page scrolls on its own.',
117
+ 'The Projects drawer shows three rows and +N opens the rest; order them by Needs you, name, recent or your own order. Every page has its own wallpaper.',
118
+ ],
119
+ },
120
+ keys: [
121
+ [{ es: 'Menú de una tarjeta', en: 'A card\'s menu' }, { es: 'clic derecho', en: 'right-click' }],
122
+ [{ es: 'Moverla', en: 'Move it' }, { es: 'arrastrar', en: 'drag' }],
123
+ [{ es: 'Agregar tarjetas', en: 'Add cards' }, { es: 'clic derecho en el fondo', en: 'right-click the background' }],
124
+ ],
125
+ where: ['home'],
126
+ },
127
+ {
128
+ id: 'widgets',
129
+ title: { es: 'Widgets', en: 'Widgets' },
130
+ lead: { es: 'Tarjetas que muestran lo que pasa en tu Mac y en tus proyectos. Solo se ofrecen si hay algo que las alimente.', en: 'Cards that show what happens on your Mac and in your projects. Only offered when something feeds them.' },
131
+ news: { kind: 'new', es: 'Nuevos: tarjetas con lo que pasa en tu Mac y en tus proyectos. Se agregan con clic derecho en Inicio › Agregar a Inicio.', en: 'New: cards with what happens on your Mac and in your projects. Add them with right-click in Home › Add to Home.' },
132
+ since: { kind: 'new', es: 'Llegaron después de 1.0. Se agregan con clic derecho en Inicio › Agregar a Inicio.', en: 'They came after 1.0. Add them with right-click in Home › Add to Home.' },
133
+ points: {
134
+ es: [
135
+ '<b>Recursos del sistema</b>: qué tan ocupado está el procesador y cuánta memoria queda libre.',
136
+ '<b>Servidores</b>: los servidores que corren en tus proyectos abiertos y si responden. Necesita la Vista previa encendida en el proyecto.',
137
+ '<b>Calidad de la memoria</b>: qué tan madura está la memoria de cada proyecto abierto y cuál es su punto más débil.',
138
+ '<b>Entrenamiento del Coordinador</b>: cuánto le falta a la memoria del Coordinador para entrenar un modelo propio.',
139
+ '<b>Modelos locales</b>: Ollama, sus modelos y cuántos ejemplos lleva cada proyecto para entrenar el suyo (8/300 son 8 de 300). Desde ahí eliges qué proyectos usan la IA local.',
140
+ ],
141
+ en: [
142
+ '<b>System resources</b>: how busy the processor is and how much memory is free.',
143
+ '<b>Servers</b>: the servers running in your open projects and whether they answer. It needs Preview on in the project.',
144
+ '<b>Memory quality</b>: how grown each open project\'s memory is, and its weakest side.',
145
+ '<b>Coordinator training</b>: how far the Coordinator\'s memory is from training a model of its own.',
146
+ '<b>Local models</b>: Ollama, its models and how many examples each project has toward its own (8/300 is 8 of 300). From there you choose which projects use the local AI.',
147
+ ],
148
+ },
149
+ keys: [
150
+ [{ es: 'Agregar uno', en: 'Add one' }, { es: 'clic derecho › Agregar', en: 'right-click › Add' }],
151
+ [{ es: 'Cambiar su tamaño', en: 'Change its size' }, { es: 'clic derecho en él', en: 'right-click it' }],
69
152
  ],
70
153
  where: ['home'],
71
154
  },
@@ -73,12 +156,12 @@ export const CHAPTERS = [
73
156
  id: 'project',
74
157
  title: { es: 'Tu proyecto', en: 'Your project' },
75
158
  lead: { es: 'Cada proyecto tiene su conversación, sus archivos y su memoria.', en: 'Each project has its own conversation, files and memory.' },
76
- news: { kind: 'changed', es: 'Son nuevos la segunda barra y Cambiar de proyecto, y los paneles se abren al lado o en una ventana que mueves.', en: 'The second bar and Switch project are new, and panels open beside you or in a window you move.' },
159
+ news: { kind: 'changed', es: 'Hay una segunda barra y un panel para cambiar de proyecto. Además, los paneles se abren al lado o en una ventana que puedes mover.', en: 'The second bar and Switch project are new, and panels open beside you or in a window you move.' },
77
160
  points: {
78
161
  es: [
79
- 'La segunda barra lleva a Inicio, a otro proyecto abierto, a recargar y a Ajustes.',
80
- 'Cambiar de proyecto muestra los que tienes abiertos; su luz avisa si alguien te espera, si un agente trabaja o si algo terminó.',
81
- 'Abre otra conversación al lado o en una ventana, y acomoda los paneles como quieras.',
162
+ 'La segunda barra te lleva a Inicio, a otro proyecto abierto o a Ajustes, y te deja recargar.',
163
+ 'Cambiar de proyecto muestra los que tienes abiertos. Su luz te avisa si alguien te espera, si un agente está trabajando o si algo terminó.',
164
+ 'Abre otra conversación al lado o en una ventana aparte, y acomoda los paneles como quieras.',
82
165
  ],
83
166
  en: [
84
167
  'The second bar takes you to Home, to another open project, to reload and to Settings.',
@@ -87,8 +170,8 @@ export const CHAPTERS = [
87
170
  ],
88
171
  },
89
172
  keys: [
90
- [{ es: 'Recorrer Cambiar de proyecto', en: 'Move through Switch project' }, '← → ↑ ↓'],
91
- [{ es: 'Ir al elegido', en: 'Go to the one chosen' }, { es: 'clic o ↵', en: 'click or ↵' }],
173
+ [{ es: 'Moverte por la lista', en: 'Move through Switch project' }, '← → ↑ ↓'],
174
+ [{ es: 'Ir al proyecto elegido', en: 'Go to the one chosen' }, { es: 'clic o ↵', en: 'click or ↵' }],
92
175
  [{ es: 'Mover una ventana', en: 'Move a window' }, { es: 'arrastrar la cabecera', en: 'drag its header' }],
93
176
  ],
94
177
  where: ['room'],
@@ -97,11 +180,11 @@ export const CHAPTERS = [
97
180
  id: 'talk',
98
181
  title: { es: 'Hablar con los agentes', en: 'Talking to your agents' },
99
182
  lead: { es: 'Una conversación, todos tus agentes.', en: 'One conversation, every agent.' },
100
- news: { kind: 'changed', es: 'Se suman el módulo Intenciones, que sugiere bajo la caja cuánto debe pensar cada agente, y /gh, con el módulo GitHub.', en: 'New here: the Intenciones module, which suggests under the box how hard each agent should think, and /gh, with the GitHub module.' },
183
+ news: { kind: 'changed', es: 'Llegan dos módulos: Intenciones, que sugiere bajo la caja cuánto debe pensar cada agente, y GitHub, que agrega el comando /gh.', en: 'New here: the Intenciones module, which suggests under the box how hard each agent should think, and /gh, with the GitHub module.' },
101
184
  points: {
102
185
  es: [
103
- 'Elige el agente en el orbe; el modo, el modelo y el esfuerzo van en una fila bajo la caja.',
104
- 'Escribe @ para un agente, # para un modo, ! para un archivo y / para un comando.',
186
+ 'Elige el agente en el orbe. El modo, el modelo y el esfuerzo están en una fila bajo la caja de texto.',
187
+ 'Escribe @ para elegir un agente, # para un modo, ! para un archivo y / para un comando.',
105
188
  'Cada respuesta se puede calificar, copiar o responder.',
106
189
  ],
107
190
  en: [
@@ -121,13 +204,13 @@ export const CHAPTERS = [
121
204
  {
122
205
  id: 'modes',
123
206
  title: { es: 'Modos y permisos', en: 'Modes and permissions' },
124
- lead: { es: 'Cada mensaje dice hasta dónde puede llegar el agente.', en: 'Every message says how far the agent may go.' },
125
- news: { kind: 'changed', es: '#4 AIRLOCK ahora es #4 Acceso total. Tú eliges qué llave abre #3 y #4, y una llave aceptada puede valer unos minutos.', en: '#4 AIRLOCK is now #4 Full access. You choose which key opens #3 and #4, and an accepted key can last a few minutes.' },
207
+ lead: { es: 'Cada mensaje lleva un nivel de permiso: hasta dónde puede llegar el agente.', en: 'Every message says how far the agent may go.' },
208
+ news: { kind: 'changed', es: '#4 AIRLOCK ahora se llama #4 Acceso total. Tú eliges cómo confirmar #3 y #4, y una confirmación puede valer unos minutos.', en: '#4 AIRLOCK is now #4 Full access. You choose which key opens #3 and #4, and an accepted key can last a few minutes.' },
126
209
  points: {
127
210
  es: [
128
- '#0 Incógnito, #1 Solo conversar, #2 Crear, #3 Editar y #4 Acceso total.',
129
- '#3 y #4 piden tu llave, y #4 la pide dos veces. Qué llave usar lo eliges en Ajustes › Permisos.',
130
- 'Una llave aceptada puede valer unos minutos; mientras dura, lo ves junto a la caja.',
211
+ 'Los niveles, de menos a más: #0 Incógnito, #1 Solo conversar, #2 Crear, #3 Editar y #4 Acceso total.',
212
+ '#3 y #4 te piden confirmar, y #4 lo pide dos veces. Cómo confirmas lo eliges en Ajustes › Permisos.',
213
+ 'Una confirmación puede valer unos minutos; mientras dura, la ves junto a la caja.',
131
214
  ],
132
215
  en: [
133
216
  '#0 Incognito, #1 Chat only, #2 Create, #3 Edit and #4 Full access.',
@@ -145,9 +228,9 @@ export const CHAPTERS = [
145
228
  news: { kind: 'new', es: 'En 0.7.2 cada proyecto trabajaba por su cuenta; ahora un agente los ve todos.', en: 'In 0.7.2 each project worked on its own; now one agent sees them all.' },
146
229
  points: {
147
230
  es: [
148
- 'Lee entre tus proyectos, firma conexiones y lleva órdenes de uno a otro. Le hablas en su propio proyecto, desde Inicio.',
231
+ 'Consulta todos tus proyectos, firma conexiones y lleva órdenes de uno a otro. Le hablas en su propio proyecto, desde Inicio.',
149
232
  'Desde cualquier proyecto le preguntas con /bishop, y la respuesta es solo para ti.',
150
- 'Sus órdenes llegan hasta #2; #3 y #4 llegan como una propuesta que tú desbloqueas en ese proyecto.',
233
+ 'Sus órdenes llegan hasta #2. Para #3 y #4 te deja una propuesta, y tú la apruebas en ese proyecto.',
151
234
  ],
152
235
  en: [
153
236
  'It reads across your projects, signs connections and carries orders from one to another. You talk to it in its own project, from Home.',
@@ -165,9 +248,9 @@ export const CHAPTERS = [
165
248
  news: { kind: 'new', es: 'En 0.7.2, «Conexiones» era iniciar sesión de tus agentes; ahora une dos proyectos.', en: 'In 0.7.2, «Connections» was signing your agents in; now it joins two projects.' },
166
249
  points: {
167
250
  es: [
168
- 'Tú firmas cada conexión: qué consulta, por cuánto tiempo y si el Coordinador puede dar órdenes.',
169
- 'Solo cruzan notas que ya están en uso, limpias de datos privados; nunca tus archivos ni tus conversaciones.',
170
- 'Dos proyectos se conectan una vez; la revocas cuando quieras desde Conexiones, en Inicio.',
251
+ 'Tú firmas cada conexión: qué puede consultar, por cuánto tiempo y si el Coordinador puede dar órdenes.',
252
+ 'Solo se comparten notas que ya están en uso, sin datos privados. Nunca tus archivos ni tus conversaciones.',
253
+ 'Cada par de proyectos se conecta una sola vez, y puedes cancelar la conexión cuando quieras desde Conexiones, en Inicio.',
171
254
  ],
172
255
  en: [
173
256
  'You sign every connection: what it looks up, for how long, and whether the Coordinator may give orders.',
@@ -175,7 +258,8 @@ export const CHAPTERS = [
175
258
  'Two projects are connected once; you revoke it whenever you want from Connections, in Home.',
176
259
  ],
177
260
  },
178
- keys: [[{ es: 'Conectar en el Mapa de proyectos', en: 'Connect in the Project map' }, { es: 'llevar uno sobre otro', en: 'carry one onto another' }]],
261
+ since: { kind: 'changed', es: 'El mapa de Conexiones en Inicio ahora es un cielo: cada proyecto es una estrella y cada conexión, un flujo de luz. Ábrelo en una ventana para explorarlo.', en: 'The Connections map in Home is now a sky: every project is a star and every connection a flow of light. Open it in a window to explore it.' },
262
+ keys: [[{ es: 'Conectar en el Mapa de proyectos', en: 'Connect in the Project map' }, { es: 'arrastrar uno sobre otro', en: 'carry one onto another' }]],
179
263
  where: ['home'],
180
264
  },
181
265
  {
@@ -186,8 +270,8 @@ export const CHAPTERS = [
186
270
  points: {
187
271
  es: [
188
272
  'El Mapa de memoria tiene su tecla en la barra del proyecto: cada estrella es algo que MADRE recuerda de él.',
189
- 'El Mapa de proyectos, en Inicio, muestra tus proyectos y sus conexiones; pide una pantalla de 900 px o más.',
190
- 'En el Mapa de proyectos, lleva un proyecto sobre otro para conectarlos.',
273
+ 'El Mapa de proyectos, en Inicio, muestra tus proyectos y sus conexiones. Necesita una pantalla de 900 px o más.',
274
+ 'En el Mapa de proyectos, arrastra un proyecto sobre otro para conectarlos.',
191
275
  ],
192
276
  en: [
193
277
  'The Memory map has its key on the project\'s bar: every star is something MADRE remembers about it.',
@@ -199,20 +283,21 @@ export const CHAPTERS = [
199
283
  [{ es: 'Girar', en: 'Turn' }, { es: 'arrastrar', en: 'drag' }],
200
284
  [{ es: 'Mover', en: 'Move' }, { es: '⇧ arrastrar', en: '⇧ drag' }],
201
285
  [{ es: 'Acercar', en: 'Zoom' }, { es: 'rueda', en: 'wheel' }],
202
- [{ es: 'Volver', en: 'Back' }, { es: 'Esc, por capas', en: 'Esc, layer by layer' }],
286
+ [{ es: 'Volver', en: 'Back' }, { es: 'Esc, paso a paso', en: 'Esc, layer by layer' }],
203
287
  ],
204
288
  where: ['home', 'room'],
205
289
  },
206
290
  {
207
291
  id: 'settings',
208
292
  title: { es: 'Diagnóstico y Ajustes', en: 'Diagnostics and Settings' },
209
- lead: { es: 'Todo lo que configuras, en un lugar; y el remedio cuando algo falla.', en: 'Everything you set, in one place; and the remedy when something fails.' },
210
- news: { kind: 'new', es: 'Lo que estaba repartido entre MU/TH/UR, ⚙ CONEXIONES y la barra ahora vive en una ventana con buscador, y Diagnóstico te da el remedio.', en: 'What was spread across MU/TH/UR, ⚙ CONNECTIONS and the bar now lives in one window with a search, and Diagnostics gives you the remedy.' },
293
+ lead: { es: 'Todo lo que configuras, en un lugar; y la solución cuando algo falla.', en: 'Everything you set, in one place; and the remedy when something fails.' },
294
+ since: { kind: 'changed', es: 'Los Ajustes de Inicio suman IA local. En Ajustes › Agentes cada agente se pliega, y OpenCode agrupa sus modelos por proveedor.', en: 'Home\'s Settings gain Local AI. In Settings › Agents each agent folds, and OpenCode groups its models by provider.' },
295
+ news: { kind: 'new', es: 'Lo que estaba repartido entre MU/TH/UR, ⚙ CONEXIONES y la barra ahora está en una ventana con buscador, y Diagnóstico te da la solución.', en: 'What was spread across MU/TH/UR, ⚙ CONNECTIONS and the bar now lives in one window with a search, and Diagnostics gives you the remedy.' },
211
296
  points: {
212
297
  es: [
213
298
  'Ajustes se abre con ⌘ , y se busca con /. Los cambios se aplican al instante.',
214
- 'Apariencia tiene los acentos y los fondos para tema claro y oscuro, y también el idioma.',
215
- 'En Diagnóstico escribes lo que pasa con tus palabras y te dice qué hacer, con la tecla que lo resuelve.',
299
+ 'Apariencia tiene los colores de acento y los fondos para tema claro y oscuro, y también el idioma.',
300
+ 'En Diagnóstico describes con tus palabras lo que pasa, y te dice qué hacer y con qué tecla resolverlo.',
216
301
  ],
217
302
  en: [
218
303
  'Settings opens with ⌘ , and is searched with /. Changes apply at once.',
@@ -223,20 +308,20 @@ export const CHAPTERS = [
223
308
  keys: [
224
309
  [{ es: 'Ajustes', en: 'Settings' }, '⌘ ,'],
225
310
  [{ es: 'Buscar en Ajustes', en: 'Search Settings' }, '/'],
226
- [{ es: 'Atrás, por capas', en: 'Back, layer by layer' }, 'Esc'],
311
+ [{ es: 'Atrás, paso a paso', en: 'Back, layer by layer' }, 'Esc'],
227
312
  ],
228
313
  where: ['home', 'room'],
229
314
  },
230
315
  {
231
316
  id: 'modules',
232
317
  title: { es: 'Módulos', en: 'Modules' },
233
- lead: { es: 'Lo que le agregas a MADRE, como apps.', en: 'What you add to MADRE, like apps.' },
234
- news: { kind: 'changed', es: 'Ahora son un tablero de mosaicos, como apps; ash es Ahorro de tokens, y se suman Intenciones y GitHub.', en: 'They are now a board of tiles, like apps; ash is Token saver, and Intenciones and GitHub join them.' },
318
+ lead: { es: 'Funciones extra que le agregas a MADRE, como apps.', en: 'What you add to MADRE, like apps.' },
319
+ news: { kind: 'changed', es: 'Ahora son un tablero de mosaicos, como apps. ash ahora se llama Ahorro de tokens, y llegan Intenciones y GitHub.', en: 'They are now a board of tiles, like apps; ash is Token saver, and Intenciones and GitHub join them.' },
235
320
  points: {
236
321
  es: [
237
322
  'Un tablero de mosaicos, cada uno con su interruptor y su ficha.',
238
323
  'Ahorro de tokens, Intenciones e IA local se abren en su propia ventana.',
239
- 'Continuidad (AHP+), GitHub y los demás dicen qué escriben y qué necesitan antes de instalarse.',
324
+ 'Continuidad (AHP+), GitHub y los demás te dicen qué escriben y qué necesitan antes de instalarlos.',
240
325
  ],
241
326
  en: [
242
327
  'A board of tiles, each with its switch and its sheet.',
@@ -247,6 +332,27 @@ export const CHAPTERS = [
247
332
  keys: [],
248
333
  where: ['room'],
249
334
  },
335
+ {
336
+ id: 'local',
337
+ title: { es: 'IA local por proyecto', en: 'Local AI by project' },
338
+ lead: { es: 'Eliges qué proyectos usan Ollama, la IA que corre en tu Mac sin gastar tokens ni enviar nada.', en: 'You choose which projects use Ollama, the AI that runs on your Mac with no tokens spent and nothing sent.' },
339
+ news: { kind: 'changed', es: 'En 0.7.2 la IA local era todo o nada; ahora se elige proyecto por proyecto.', en: 'In 0.7.2 the local AI was all or nothing; now it is chosen project by project.' },
340
+ since: { kind: 'new', es: 'En 1.0 la IA local era todo o nada; ahora se elige proyecto por proyecto.', en: 'In 1.0 the local AI was all or nothing; now it is chosen project by project.' },
341
+ points: {
342
+ es: [
343
+ 'En Inicio › Ajustes › IA local hay tres modos: Automático (todos), Uno a uno (solo los que enciendes) y Manual (cada proyecto decide en sus Ajustes).',
344
+ 'Cambiar de modo no cambia a ningún proyecto que ya existe: solo decide cómo empiezan los nuevos.',
345
+ 'Un proyecto sin IA local sigue trabajando con sus agentes. Solo deja de usar la búsqueda por significado, el resumen de la memoria y @madre.',
346
+ ],
347
+ en: [
348
+ 'In Home › Settings › Local AI there are three modes: Automatic (all), One by one (only those you switch on) and Manual (each project decides in its Settings).',
349
+ 'Changing the mode changes no project that already exists: it only decides how new ones start.',
350
+ 'A project without the local AI keeps working with its agents; it only stops using search by meaning, the memory summary and @madre.',
351
+ ],
352
+ },
353
+ keys: [[{ es: 'Elegir proyectos', en: 'Choose projects' }, { es: 'Ajustes › IA local', en: 'Settings › Local AI' }]],
354
+ where: ['home'],
355
+ },
250
356
  {
251
357
  id: 'phone',
252
358
  title: { es: 'Tu teléfono', en: 'Your phone' },
@@ -271,8 +377,9 @@ export const CHAPTERS = [
271
377
  {
272
378
  id: 'gestures',
273
379
  title: { es: 'Gestos y atajos', en: 'Gestures and shortcuts' },
274
- lead: { es: 'Lo que se hace con las manos. Esta hoja se abre con ? en cualquier momento.', en: 'What is done with your hands. This sheet opens with ? at any moment.' },
380
+ lead: { es: 'Los gestos y atajos de MADRE. Abre esta hoja con ? cuando quieras.', en: 'What is done with your hands. This sheet opens with ? at any moment.' },
275
381
  news: { kind: 'new', es: 'Los gestos y atajos de todo MADRE, juntos en una hoja por primera vez.', en: 'The gestures and shortcuts of all of MADRE, together on one sheet for the first time.' },
382
+ since: { kind: 'changed', es: 'Suma los gestos del tablero de Inicio: acomodar, arrastrar y agregar tarjetas.', en: 'It adds the gestures of Home\'s board: arrange, drag and add cards.' },
276
383
  points: { es: [], en: [] },
277
384
  keys: [],
278
385
  where: ['home', 'room'],
@@ -283,9 +390,9 @@ export const CHAPTERS = [
283
390
  export const GESTURES = [
284
391
  [{ es: 'En todo MADRE', en: 'Everywhere in MADRE' }, [
285
392
  [{ es: 'Ajustes', en: 'Settings' }, '⌘ ,'],
286
- [{ es: 'Cerrar lo de arriba, por capas', en: 'Close what is on top, layer by layer' }, 'Esc'],
393
+ [{ es: 'Cerrar lo de encima, uno por uno', en: 'Close what is on top, layer by layer' }, 'Esc'],
287
394
  [{ es: 'Detener todo', en: 'Stop everything' }, '/stopall'],
288
- [{ es: 'Otra pestaña al ir a un proyecto', en: 'Another tab when going to a project' }, { es: '⌘ clic', en: '⌘ click' }],
395
+ [{ es: 'Abrir un proyecto en otra pestaña', en: 'Another tab when going to a project' }, { es: '⌘ clic', en: '⌘ click' }],
289
396
  [{ es: 'Esta hoja', en: 'This sheet' }, '?'],
290
397
  ]],
291
398
  [{ es: 'La barra', en: 'The bar' }, [
@@ -296,7 +403,7 @@ export const GESTURES = [
296
403
  ]],
297
404
  [{ es: 'Cambiar de proyecto', en: 'Switch project' }, [
298
405
  [{ es: 'Abrir el panel', en: 'Open the panel' }, { es: 'clic', en: 'click' }],
299
- [{ es: 'Recorrerlo', en: 'Move through it' }, '← → ↑ ↓'],
406
+ [{ es: 'Moverte por la lista', en: 'Move through it' }, '← → ↑ ↓'],
300
407
  [{ es: 'Ir', en: 'Go' }, { es: 'clic o ↵', en: 'click or ↵' }],
301
408
  [{ es: 'Cerrarlo', en: 'Close it' }, 'Esc'],
302
409
  ]],
@@ -304,7 +411,7 @@ export const GESTURES = [
304
411
  [{ es: 'Mover', en: 'Move' }, { es: 'arrastrar la cabecera', en: 'drag the header' }],
305
412
  [{ es: 'ACOMODAR', en: 'ARRANGE' }, { es: 'mantener el puntero 0,4 s', en: 'hold the pointer 0.4 s' }],
306
413
  [{ es: 'Apartar las ventanas', en: 'Set the windows aside' }, { es: 'clic en el escritorio', en: 'click the desktop' }],
307
- [{ es: 'Ancho del panel', en: 'Panel width' }, { es: '← → · ⇧ para 64 px', en: '← → · ⇧ for 64 px' }],
414
+ [{ es: 'Ancho del panel', en: 'Panel width' }, { es: '← → · con ⇧, de 64 px en 64 px', en: '← → · ⇧ for 64 px' }],
308
415
  ]],
309
416
  [{ es: 'La caja', en: 'The box' }, [
310
417
  [{ es: 'Enviar', en: 'Send' }, '↵'],
@@ -315,7 +422,7 @@ export const GESTURES = [
315
422
  [{ es: 'Ajustes', en: 'Settings' }, [
316
423
  [{ es: 'Buscar', en: 'Search' }, '/'],
317
424
  [{ es: 'Abrir el primero', en: 'Open the first' }, '↵'],
318
- [{ es: 'Atrás, por capas', en: 'Back, layer by layer' }, 'Esc'],
425
+ [{ es: 'Atrás, paso a paso', en: 'Back, layer by layer' }, 'Esc'],
319
426
  ]],
320
427
  [{ es: 'Mapa de memoria', en: 'Memory map' }, [
321
428
  [{ es: 'Girar', en: 'Turn' }, { es: 'arrastrar', en: 'drag' }],
@@ -324,12 +431,15 @@ export const GESTURES = [
324
431
  [{ es: 'Leer una memoria', en: 'Read a memory' }, { es: 'clic', en: 'click' }],
325
432
  ]],
326
433
  [{ es: 'Mapa de proyectos', en: 'Project map' }, [
327
- [{ es: 'Mover el espacio', en: 'Move the space' }, { es: 'arrastrar', en: 'drag' }],
434
+ [{ es: 'Mover la vista', en: 'Move the space' }, { es: 'arrastrar', en: 'drag' }],
328
435
  [{ es: 'Ir a uno', en: 'Go to one' }, { es: 'clic · ← →', en: 'click · ← →' }],
329
- [{ es: 'Conectar dos', en: 'Connect two' }, { es: 'llevar uno sobre otro', en: 'carry one onto another' }],
330
- [{ es: 'Volver', en: 'Back' }, { es: 'Esc, por capas', en: 'Esc, layer by layer' }],
436
+ [{ es: 'Conectar dos proyectos', en: 'Connect two' }, { es: 'arrastrar uno sobre otro', en: 'carry one onto another' }],
437
+ [{ es: 'Volver', en: 'Back' }, { es: 'Esc, paso a paso', en: 'Esc, layer by layer' }],
331
438
  ]],
332
439
  [{ es: 'Inicio', en: 'Home' }, [
440
+ [{ es: 'Menú de una tarjeta', en: 'A card\'s menu' }, { es: 'clic derecho', en: 'right-click' }],
441
+ [{ es: 'Mover una tarjeta', en: 'Move a card' }, { es: 'arrastrar', en: 'drag' }],
442
+ [{ es: 'Agregar tarjetas y widgets', en: 'Add cards and widgets' }, { es: 'clic derecho en el fondo', en: 'right-click the background' }],
333
443
  [{ es: 'Menú de un proyecto', en: 'A project\'s menu' }, { es: 'clic derecho · ⋯', en: 'right-click · ⋯' }],
334
444
  [{ es: 'Anclarlo', en: 'Pin it' }, { es: 'arrastrar a la barra', en: 'drag to the bar' }],
335
445
  [{ es: 'Los que no caben', en: 'Those that do not fit' }, '+n'],
package/public/tour.js CHANGED
@@ -69,6 +69,9 @@ const SCENES = {
69
69
  phone: () => `<span class="ts-mac"><i></i></span><svg class="ts-wires" viewBox="0 0 320 150" preserveAspectRatio="none" aria-hidden="true"><path id="ts-p1" class="ts-dash" d="M206 80C178 62 150 62 124 76"/>
70
70
  ${still() ? '' : '<path d="M0 0h0" class="ts-note"><animateMotion dur="2.4s" repeatCount="indefinite" keyPoints="0;1;0" keyTimes="0;.5;1" calcMode="linear"><mpath href="#ts-p1"/></animateMotion></path>'}</svg>
71
71
  <span class="ts-phone"><i class="ts-qr"></i></span>`,
72
+ board: () => SCENES.home(),
73
+ widgets: () => `<div class="ts-grid ts-widgets"><span class="ts-card"><i style="--w:.62"></i><i style="--w:.34"></i></span><span class="ts-card"><i style="--w:.8"></i><i style="--w:.5"></i></span><span class="ts-card"><i style="--w:.4"></i><i style="--w:.7"></i></span><span class="ts-card ts-dim"><i style="--w:.25"></i><i style="--w:.55"></i></span></div>`,
74
+ local: () => SCENES.modules(),
72
75
  gestures: () => `<div class="ts-caps"><span class="ts-cap c0">⌘ ,</span><span class="ts-cap c1">Esc</span><span class="ts-cap c2">?</span></div>`,
73
76
  };
74
77
 
@@ -97,8 +100,9 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
97
100
  onChange?.(state);
98
101
  return state;
99
102
  };
100
- const path = () => state?.path ?? (info?.returning ? 'back' : 'new');
101
- const chapters = () => (ORDER[path()] ?? ORDER.new).filter((id) => !hidden().includes(id)).map((id) => CHAPTERS.find((chapter) => chapter.id === id)).filter(Boolean);
103
+ // Three people (src/tour.mjs): new, back from 0.7.2, or back from 1.0 (`since`).
104
+ const path = () => state?.path ?? (info?.from === '1.0' ? 'since' : info?.returning ? 'back' : 'new');
105
+ const chapters = () => (ORDER[path()] ?? ORDER.new).filter((id) => !hidden().includes(id)).map((id) => CHAPTERS.find((chapter) => chapter.id === id)).filter((chapter) => chapter && (!chapter.only || chapter.only === language()));
102
106
  const busyWith = () => Boolean(windowNode?.open || sheetNode?.open || document.querySelector('dialog.tour-bonjour[open]'));
103
107
 
104
108
  // ---- One tab at a time. The tab that shows the bonjour or the chapters holds the tour and says
@@ -201,19 +205,23 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
201
205
  }
202
206
  function showBonjour() {
203
207
  hold();
208
+ const since = path() === 'since';
204
209
  const back = path() === 'back';
205
210
  const node = el('dialog', 'tour-bonjour');
206
211
  node.setAttribute('aria-labelledby', 'tour-bonjour-title');
207
212
  const stage = el('div', 'tour-bonjour-stage');
208
213
  const mark = el('span', 'madre-loader-mark tour-hello-mark');
209
214
  mark.innerHTML = LOADER_MARK; // trusted: our own SVG string
210
- const title = el('h1', 'tour-hello', back ? t('Hello again.') : t('Hello.'));
215
+ const title = el('h1', 'tour-hello', back || since ? t('Hello again.') : t('Hello.'));
211
216
  title.id = 'tour-bonjour-title';
212
- const body = el('p', 'tour-hello-says', back
213
- ? t('MADRE changed a lot since 0.7.2. First I bring your projects to Home; then I tell you what is new, at your own pace.')
214
- : t('This is MADRE: all your AI agents in one place, with your projects, their memory and your permissions.'));
217
+ const body = el('p', 'tour-hello-says', since
218
+ ? t('Since 1.0, Home became a board you arrange, with widgets; the local AI is chosen project by project, and MADRE speaks more plainly. I tell you what changed, at your own pace.')
219
+ : back
220
+ ? t('MADRE changed a lot since 0.7.2. First I bring your projects to Home; then I tell you what is new, at your own pace.')
221
+ : t('This is MADRE: all your AI agents in one place, with your projects, their memory and your permissions.'));
215
222
  const note = el('p', 'tour-hello-note');
216
- if (back) note.innerHTML = t('<code>madre</code> now opens Home; <code>madre start</code> still opens the project in the folder.'); // trusted: our own catalogue
223
+ if (since) note.textContent = t('Nothing you set up changed: your projects, agents and permissions are as you left them.');
224
+ else if (back) note.innerHTML = t('<code>madre</code> now opens Home; <code>madre start</code> still opens the project in the folder.'); // trusted: our own catalogue
217
225
  else note.textContent = page === 'home' && welcome?.needed?.() ? t('First we get an agent and a project ready; then I tell you the essentials, at your own pace.') : t('I tell you the essentials in a few short chapters, at your own pace.');
218
226
  const acts = el('div', 'tour-hello-acts');
219
227
  const later = key('tour-btn quiet', t('Later'), async () => {
@@ -223,12 +231,13 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
223
231
  // 0.7.2 found Home empty and nothing offered to bring them again. They come quietly.
224
232
  if (back) void recoverProjects().then(({ found }) => { if (found.length) onProjects?.(); });
225
233
  });
226
- const onward = key('tour-btn primary', back ? t('Continue') : t('Start'), async () => {
234
+ const onward = key('tour-btn primary', back || since ? t('Continue') : t('Start'), async () => {
227
235
  later.disabled = true; onward.disabled = true;
228
236
  await keep({ path: path(), bonjour: true });
229
237
  void fetch('/api/whats-new/seen', { method: 'POST' }).catch(() => null); // the chapters replace What's new 1.0
230
238
  if (back) { await bringProjects(stage); return; }
231
239
  node.close();
240
+ if (since) { openChapters(chapters()[0]?.id ?? null); return; }
232
241
  if (page === 'home' && welcome?.needed?.()) welcome.open(() => openChapters('home'));
233
242
  else openChapters(page === 'home' ? 'home' : 'project');
234
243
  });
@@ -328,8 +337,9 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
328
337
  const chapter = shown;
329
338
  current = shown;
330
339
  const back = path() === 'back';
331
- windowNode.querySelector('.tour-head .wn-eyebrow').textContent = back ? t('The tour of MADRE 1.0') : t('Getting to know MADRE');
332
- windowNode.querySelector('#tour-window-title').textContent = back ? t('Everything new, at your pace') : t('The essentials, at your pace');
340
+ const since = path() === 'since';
341
+ windowNode.querySelector('.tour-head .wn-eyebrow').textContent = since ? t('What is new since 1.0') : back ? t('The tour of MADRE 1.0') : t('Getting to know MADRE');
342
+ windowNode.querySelector('#tour-window-title').textContent = since ? t('What changed, at your pace') : back ? t('Everything new, at your pace') : t('The essentials, at your pace');
333
343
  void keep({ chapter: chapter.id, at: chapter.id });
334
344
  if (!state.done.includes(chapter.id)) state.done = [...state.done, chapter.id];
335
345
  const list = chapters();
@@ -345,9 +355,9 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
345
355
  }));
346
356
  const main = windowNode.querySelector('.tour-main');
347
357
  const page2 = el('article', `tour-chapter c-${chapter.id}`);
348
- const scene = el('div', `tour-scene s-${chapter.id}`);
358
+ const scene = el('div', `tour-scene s-${chapter.id}${chapter.moved ? ' s-table' : ''}`);
349
359
  scene.setAttribute('aria-hidden', 'true');
350
- if (chapter.id === 'moved') {
360
+ if (chapter.moved) {
351
361
  const table = el('div', 'ts-moved');
352
362
  for (const [was, now] of chapter.moved) {
353
363
  const line = el('div', 'ts-moved-row');
@@ -366,6 +376,14 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
366
376
  news.append(el('b', 'tour-news-tag', chapter.news.kind === 'new' ? t('New in 1.0') : t('Changed in 1.0')), said);
367
377
  words.append(news);
368
378
  }
379
+ // Whoever came from 1.0 reads first what is new or different since.
380
+ if (since && chapter.since) {
381
+ const news = el('p', `tour-news ${chapter.since.kind}`);
382
+ const said = el('span');
383
+ said.innerHTML = say(chapter.since); // trusted: our own copy
384
+ news.append(el('b', 'tour-news-tag', chapter.since.kind === 'new' ? t('New since 1.0') : t('Changed since 1.0')), said);
385
+ words.append(news);
386
+ }
369
387
  words.append(el('p', 'tour-lead', say(chapter.lead)));
370
388
  const points = chapter.points?.[language()] ?? chapter.points?.es ?? [];
371
389
  if (points.length) {
@@ -495,8 +513,26 @@ export function startTour({ page, go = {}, ready = () => true, phone = false, de
495
513
  return true;
496
514
  }
497
515
 
516
+ // ---- What a key opens, said the first time it opens (1.1): one line beside what opened — inside
517
+ // it when it is a modal window, where a card floating over the page could not be pressed. `opened`
518
+ // finds what the click opened; nothing found, the line goes beside the key itself.
519
+ function firstOpen(id, node, { opened = () => null, inside = null, title, text, after = 450 }) {
520
+ if (!node || node.dataset.firstOpen === id) return;
521
+ node.dataset.firstOpen = id;
522
+ node.addEventListener('click', () => {
523
+ if (state?.hints?.[id]) return;
524
+ setTimeout(() => {
525
+ const box = opened();
526
+ const modal = Boolean(box?.closest?.('dialog')?.matches?.(':modal'));
527
+ const into = modal ? (inside?.(box) ?? box) : null;
528
+ void hint(id, into ?? box ?? node, { title: title(), text: text(), inside: modal });
529
+ }, after);
530
+ });
531
+ }
532
+
498
533
  return {
499
534
  loaded,
535
+ firstOpen,
500
536
  // The page changed its language after it drew the pill: the pill says it again in the new one.
501
537
  repaint: () => paintPill(),
502
538
  maybeBonjour,
@@ -53,8 +53,8 @@ export const CONDITIONS = [
53
53
  severity: 'common',
54
54
  title: 'ANTHROPIC_API_KEY takes precedence over the claude.ai plan',
55
55
  match: /connectors are disabled because ANTHROPIC_API_KEY|another auth source is set and takes precedence|takes precedence over your claude\.ai login/i,
56
- diagnosis: 'Claude Code found an API key in the environment as well as the claude.ai login, and the key wins. MADRE hands the CLI the environment exactly as this machine has it, so whatever is exported in your shell profile reaches it. The turn is billed to the API account, not to the plan, and your organisation connectors do not load.',
57
- remedy: 'Decide which one you mean. To work on the plan, unset the key where your shell exports it and open the project again; to work on the API, this message is only a notice and can be ignored.',
56
+ diagnosis: 'Claude Code found an API key as well as the claude.ai login, and the key wins. It may come from your shell profile — MADRE hands the CLI the environment exactly as this machine has it — or from the `env` block of ~/.claude/settings.json, which is where a key pasted into Settings › Agents is written. The turn is billed to the API account, not to the plan, and your organisation connectors do not load.',
57
+ remedy: 'Decide which one you mean. To work on the API, this message is only a notice and can be ignored. To work on the plan, take the key out of wherever it is set: your shell profile, or the `env` block of ~/.claude/settings.json if you pasted it into MADRE — then open the project again.',
58
58
  fixes: {
59
59
  darwin: ['grep -rn ANTHROPIC_API_KEY ~/.zshrc ~/.zprofile ~/.zshenv 2>/dev/null', '# remove or comment the line it finds, then:', 'unset ANTHROPIC_API_KEY', '# and start MADRE from a new terminal'],
60
60
  linux: ['grep -rn ANTHROPIC_API_KEY ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null', 'unset ANTHROPIC_API_KEY', '# and start MADRE from a new terminal'],