agents-city 0.3.0-beta.22 → 0.4.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 (70) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.es.md +309 -44
  3. package/README.md +295 -43
  4. package/bin/agents-city.js +7 -0
  5. package/bin/doctor +3 -0
  6. package/bin/hall.html +252 -25
  7. package/bin/navegador.mjs +544 -0
  8. package/bin/serve.py +442 -130
  9. package/bin/shortcut +3 -0
  10. package/bin/test +10 -4
  11. package/bin/test-actualiza.py +130 -0
  12. package/bin/test-atajos.py +301 -0
  13. package/bin/test-busca.py +216 -0
  14. package/bin/test-cage.py +170 -2
  15. package/bin/test-card.py +2 -2
  16. package/bin/test-cities.py +45 -0
  17. package/bin/test-contracts.py +2 -2
  18. package/bin/test-demo.py +67 -0
  19. package/bin/test-desinstala.py +170 -0
  20. package/bin/test-doctor.py +33 -0
  21. package/bin/test-navegador.py +166 -0
  22. package/bin/test-seat.py +245 -25
  23. package/bin/test-serve.py +336 -11
  24. package/bin/test-workspace.py +63 -0
  25. package/bin/testlib.py +23 -0
  26. package/bin/uninstall +5 -0
  27. package/bin/update +3 -0
  28. package/city/web/dist/city.js +65 -65
  29. package/city/web/dist/index.html +18 -5
  30. package/city/web/dist-hall/hall.js +2749 -174
  31. package/city/web/index.html +17 -4
  32. package/city/web/src/bienvenida.ts +392 -0
  33. package/city/web/src/casa.ts +282 -0
  34. package/city/web/src/demo.ts +247 -0
  35. package/city/web/src/dialogo.ts +178 -0
  36. package/city/web/src/es.ts +276 -0
  37. package/city/web/src/explorador.ts +189 -0
  38. package/city/web/src/hall.ts +626 -171
  39. package/city/web/src/idioma.ts +86 -0
  40. package/city/web/src/main.ts +53 -3
  41. package/city/web/src/motores.ts +54 -0
  42. package/demo/graba.py +132 -0
  43. package/demo/grabaciones/legal.jsonl +22 -0
  44. package/demo/grabaciones/medicina.jsonl +22 -0
  45. package/demo/grabaciones/software.jsonl +22 -0
  46. package/docs/agents-first.md +8 -1
  47. package/docs/security.md +46 -12
  48. package/package.json +1 -1
  49. package/plugin/.claude-plugin/plugin.json +1 -1
  50. package/plugin/channel/bus.js +1 -1
  51. package/plugin/channel/bus.ts +1 -1
  52. package/plugin/channel/runtime/codex.ts +1 -1
  53. package/plugin/channel/runtime-gateway.js +1 -1
  54. package/plugin/scripts/actualiza.py +198 -0
  55. package/plugin/scripts/atajos.py +506 -0
  56. package/plugin/scripts/busca.py +436 -0
  57. package/plugin/scripts/cage.py +266 -26
  58. package/plugin/scripts/capabilities.py +17 -10
  59. package/plugin/scripts/card.py +10 -0
  60. package/plugin/scripts/cities.py +34 -0
  61. package/plugin/scripts/city-session.sh +33 -7
  62. package/plugin/scripts/demos.py +107 -0
  63. package/plugin/scripts/desinstala.py +222 -0
  64. package/plugin/scripts/doctor.py +122 -0
  65. package/plugin/scripts/find-repos.sh +12 -105
  66. package/plugin/scripts/read-card.py +6 -2
  67. package/plugin/scripts/report.py +5 -6
  68. package/plugin/scripts/reset.py +50 -14
  69. package/plugin/scripts/seat.py +445 -103
  70. package/plugin/scripts/workspace.py +197 -0
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "city",
11
11
  "source": "./plugin",
12
- "version": "0.3.0-beta.22",
12
+ "version": "0.4.0",
13
13
  "description": "Operate one autonomous city seat, its domain, role, repo support agents, goal, recognised skills and explicit roads to other cities."
14
14
  }
15
15
  ]
package/README.es.md CHANGED
@@ -6,7 +6,7 @@
6
6
  las que deban hablar.**
7
7
 
8
8
  ```bash
9
- npm install -g agents-city@beta
9
+ npm install -g agents-city
10
10
  agents-city
11
11
  ```
12
12
 
@@ -98,22 +98,23 @@ Las fronteras importantes son:
98
98
  ### Instalar desde npm
99
99
 
100
100
  ```bash
101
- npm install -g agents-city@beta
101
+ npm install -g agents-city
102
102
  agents-city --version
103
103
  ```
104
104
 
105
+ Esto es `0.x` a propósito: los comandos ya se usan hoy, pero los formatos de
106
+ fichero y las APIs todavía pueden cambiar entre versiones menores. Aquí nada
107
+ pretende estar congelado.
108
+
105
109
  Necesitas Node.js 22 o superior, Python 3 y tmux; los detalles están en la
106
110
  [tabla de requisitos](#requisitos-base), y `agents-city seat` se ofrece a
107
111
  instalar tmux si falta. No se instala nada en el sistema más allá de la carpeta
108
112
  global de npm de tu Node activo.
109
113
 
110
- El `@beta` es deliberado: esto es una prerelease, y fijarla significa que una
111
- futura versión estable no puede cambiarte la máquina sin que tú lo pidas.
112
-
113
114
  ### Probarlo sin instalar nada
114
115
 
115
116
  ```bash
116
- npx agents-city@beta
117
+ npx agents-city
117
118
  ```
118
119
 
119
120
  `npx` descarga el paquete en su caché, lo ejecuta y deja intacta tu carpeta
@@ -134,7 +135,7 @@ por debajo, así que ninguno de los dos es el camino "menor".
134
135
  ### Actualizar o quitar
135
136
 
136
137
  ```bash
137
- npm install -g agents-city@beta # actualizar a la última beta
138
+ npm install -g agents-city # actualizar a la última versión
138
139
  npm uninstall -g agents-city # quitar el programa
139
140
  ```
140
141
 
@@ -197,7 +198,7 @@ Agents City usa el CLI independiente `gh`:
197
198
  ### Actualizar una instalación
198
199
 
199
200
  ```bash
200
- npm install -g agents-city@beta # desde el registro
201
+ npm install -g agents-city # desde el registro
201
202
  agents-city --version
202
203
  ```
203
204
 
@@ -231,7 +232,7 @@ una ciudad concreta.
231
232
 
232
233
  ## Primer arranque, paso a paso
233
234
 
234
- `agents-city seat` crea `home` si todavía no existe y hace cinco decisiones.
235
+ `agents-city seat` crea `home` si todavía no existe y hace siete preguntas.
235
236
 
236
237
  ### 1. Dominio de trabajo
237
238
 
@@ -255,22 +256,39 @@ opciones incorporadas son:
255
256
  Es la responsabilidad del jefe de esa ciudad, no el nombre de la ciudad ni el
256
257
  motor. El asiento sigue siendo presidente aunque elijas `blank`.
257
258
 
258
- ### 3. Repos y rol de cada agente
259
-
260
- Puedes leer repos del disco, de tu cuenta GitHub o de una organización. Cada repo
261
- seleccionado recibe:
262
-
263
- - una ventana tmux;
264
- - un actor privado del bus;
265
- - un directorio de trabajo dentro del repo;
266
- - un rol operativo explícito;
267
- - las skills que su runtime ya sea capaz de descubrir allí.
268
-
269
- El rol del repo puede pertenecer a otro dominio. Ejemplo: una ciudad de software
270
- puede asignar `po` a un repo de producto, `seo` al portfolio y `data-engineer` a
271
- un pipeline. Ninguno se convierte en presidente.
272
-
273
- Elegir cero repos también es válido: abre una ciudad con sólo su asiento.
259
+ ### 3. Los agentes, de uno en uno
260
+
261
+ Esta es la ciudad en sí, y es un bucle, no una lista de carpetas que marcar. Cada
262
+ agente se pregunta entero, y después se te ofrece otro, hasta que digas que la
263
+ ciudad está completa:
264
+
265
+ 1. **Su nombre** cómo lo llamas en su ventana, en el mapa y en el bus.
266
+ 2. **Qué tipo de trabajo hace** `code`, `knowledge` o `coordinator`. No es un
267
+ permiso: decide cómo crece su casa en el mapa, para que a quien trabaja con
268
+ documentos no se le mida en pull requests.
269
+ 3. **Su rol** — su especialidad, del dominio de esta ciudad o de otro. Una ciudad
270
+ de software puede dar `po` a un agente de producto, `seo` al del portfolio y
271
+ `data-engineer` al del pipeline. Ninguno se convierte en presidente.
272
+ 4. **Todo aquello sobre lo que trabaja** — cuantos repos quiera (leídos del
273
+ disco, de tu cuenta GitHub o de una organización) **más** cuantas carpetas de
274
+ documentos quiera. Un agente puede responder por tres servicios y un manual a
275
+ la vez, y un agente sin git en ninguna parte es un agente de primera. Todo se
276
+ monta dentro de su workspace, no se convierte en agentes distintos.
277
+ 5. **Qué lo ejecuta** — Claude con su propio modelo y esfuerzo, o Codex,
278
+ OpenCode, Kimi, o un fallback explícito de terminal.
279
+ 6. **Las skills con las que empieza** — una carpeta de skill o un `.zip`
280
+ instalado en la casa de ese agente. Sólo se ofrece para motores que leen
281
+ skills: a un agente en Codex se le dice que su motor las ignora, en vez de
282
+ venderle algo que no hace nada.
283
+
284
+ Cada agente recibe entonces una ventana tmux, un actor privado del bus, su
285
+ workspace como directorio de trabajo y las skills que su runtime ya sea capaz de
286
+ descubrir en lo que monta.
287
+
288
+ Decir que la ciudad no tiene agentes también es válido: abre con sólo su asiento,
289
+ y las carreteras la conectan con otras ciudades.
290
+
291
+ Cambia el reparto cuando quieras con `agents-city seat --agents`.
274
292
 
275
293
  ### 4. Objetivo
276
294
 
@@ -286,19 +304,52 @@ Un objetivo puede ser cuantitativo o cualitativo. Guarda:
286
304
 
287
305
  Puedes omitirlo y configurarlo después con `agents-city seat --goal`.
288
306
 
289
- ### 5. Motor de cada ventana
290
-
291
- Enter conserva Claude en todas. También puedes elegir por ventana:
307
+ ### 5. Motor de tu propia silla
292
308
 
293
- - Claude y, opcionalmente, modelo/esfuerzo;
294
- - Codex;
295
- - OpenCode;
296
- - Kimi;
297
- - un comando desconocido mediante el fallback explícito de terminal.
309
+ El motor de cada agente ya se decidió sobre el agente, en la pregunta 3. Queda tu
310
+ ventana: la que sostiene el rol de presidente, los comandos `/city:` y el plugin.
311
+ Enter la deja en tu Claude; también puedes elegir Claude con modelo y esfuerzo,
312
+ Codex, OpenCode, Kimi, o un comando desconocido mediante el fallback explícito de
313
+ terminal.
298
314
 
299
315
  La configuración persistente queda en la ficha del propietario. Los flags
300
316
  `--model` y `--effort` de `seat` son overrides sólo para ese arranque.
301
317
 
318
+ ### 6. Si tu silla pide permiso
319
+
320
+ Por ciudad, en `city.yml` como `seat_yolo`. En local el asiento son tus propias
321
+ manos en tu propia máquina, así que pedirte permiso en tu propia silla es una
322
+ elección, no una ley. Las ventanas de los agentes conservan su jaula igualmente,
323
+ y arrancar con `--no-yolo` sigue frenando toda la sesión, asiento incluido.
324
+
325
+ ### 7. La ciudad en tu escritorio
326
+
327
+ Se ofrece una vez, cuando la ciudad es nueva: un acceso directo de verdad con el
328
+ nombre de la ciudad y un icono coloreado a partir de su propia identidad — un
329
+ `.app` en macOS o una entrada `.desktop` en Linux. Doble clic y la ciudad se
330
+ abre.
331
+
332
+ Ejecuta la misma línea que escribirías tú, así que es un botón etiquetado sobre
333
+ la puerta que ya existe, no una segunda forma de entrar. Añádelo o quítalo cuando
334
+ quieras:
335
+
336
+ ```bash
337
+ agents-city shortcut # esta ciudad, en tu escritorio
338
+ agents-city shortcut home --hall # una puerta que abre el mapa en su lugar
339
+ agents-city shortcut --remove # quitarlo otra vez
340
+ agents-city shortcut --to ~/bin # en otro sitio que no sea el escritorio
341
+ ```
342
+
343
+ **En Windows** la ciudad vive dentro de WSL, y un `~/Desktop` de WSL es el
344
+ escritorio del home de Linux: uno que nadie mira nunca. Por eso el acceso directo
345
+ se escribe en el escritorio **de Windows**, preguntándoselo a Windows en vez de
346
+ adivinarlo a partir del nombre de usuario (un escritorio redirigido a OneDrive o
347
+ a un perfil de dominio no está bajo `C:\Users\<nombre>\Desktop`). Es un `.lnk` de
348
+ verdad, construido con la propia PowerShell de Windows para que pueda llevar un
349
+ `.ico`, y arranca `wsl.exe` ejecutando el mismo comando en una shell de login. Si
350
+ no hay interoperabilidad, se escribe un `.cmd` que también se abre con doble
351
+ clic: la misma puerta, con icono genérico.
352
+
302
353
  ### Qué se crea
303
354
 
304
355
  ```text
@@ -442,8 +493,10 @@ agents-city cities
442
493
  agents-city road
443
494
  agents-city bus
444
495
  agents-city committee
496
+ agents-city agents
445
497
  agents-city skills
446
498
  agents-city city
499
+ agents-city shortcut
447
500
  agents-city demo
448
501
  agents-city report
449
502
  agents-city tokens
@@ -451,6 +504,8 @@ agents-city logs
451
504
  agents-city benchmark
452
505
  agents-city reset
453
506
  agents-city exit
507
+ agents-city doctor
508
+ agents-city update
454
509
  agents-city test
455
510
  ```
456
511
 
@@ -501,6 +556,33 @@ se escriben en el registro de actividad. El token de observador rota con el hub,
501
556
  sólo acepta un origen de este ordenador y es de sólo lectura: el navegador no
502
557
  puede dirigir el comité. `Ctrl-c` detiene el Hall.
503
558
 
559
+ **Demos**, en el rail, reproduce un comité entero sin montar nada: una historia
560
+ por dominio de trabajo — un estudio, una clínica, un despacho — con play, pausa,
561
+ repetir y velocidad. Lo que reproduce son *grabaciones*: `demo/graba.py` ejecuta
562
+ cada historia sobre el bus local real, a través de la máquina de estados real del
563
+ comité, y guarda el flujo exacto de eventos que vio un espectador; el Hall los
564
+ reproduce con el mismo renderizador que usa el rail en vivo. Lo dice en pantalla,
565
+ porque una demo que finge estar en vivo es justo la que este producto no debe
566
+ publicar. Para lanzar una en vivo desde terminal: `agents-city demo --domain
567
+ software`.
568
+
569
+ Regenera las grabaciones tras editar `demo/stories.py`:
570
+
571
+ ```bash
572
+ demo/graba.py # todas las historias
573
+ demo/graba.py medicina # sólo una
574
+ ```
575
+
576
+ La suite de demo falla cuando una grabación deja de corresponderse con la
577
+ historia que dice ser, así que una obsoleta es un build en rojo y no un navegador
578
+ reproduciendo en silencio el comité del mes pasado.
579
+
580
+ Bajo la marca hay dos botones: **día/noche** e **ES/EN**. El Hall habla español e
581
+ inglés, arranca en el idioma del navegador y recuerda la elección explícita. Las
582
+ traducciones se indexan por la frase en inglés, así que lo que aún no esté
583
+ traducido cae en un inglés legible y no en un identificador — un texto nuevo
584
+ nunca se queda bloqueado esperando a la traducción.
585
+
504
586
  ### `agents-city setup`
505
587
 
506
588
  Crea o selecciona una ciudad y abre el Hall; con `--tui` entrega el flujo a
@@ -742,6 +824,31 @@ La capacidad real de invocar una skill depende del runtime. Agents City la
742
824
  anuncia como capacidad del miembro y deja al proveedor aplicar sus propias reglas
743
825
  de descubrimiento y uso.
744
826
 
827
+ ### `agents-city agents`
828
+
829
+ Lista los agentes de esta ciudad y gestiona sobre qué trabaja cada uno. Los
830
+ montajes de un agente son symlinks dentro de su workspace, así que esto es el
831
+ equivalente en terminal de la fila **works on** del Hall y de la pregunta 3 del
832
+ asistente.
833
+
834
+ ```bash
835
+ agents-city agents list --card ~/.agents-city/alice/home/alice.md --data ~/.agents-city/alice/home
836
+ agents-city agents mounts --agent urgencias --data ~/.agents-city/alice/home
837
+ agents-city agents mount --agent urgencias --src ~/documentos/manual --data …
838
+ agents-city agents unmount --agent urgencias --name manual --data …
839
+ ```
840
+
841
+ | Comando | Efecto |
842
+ |---|---|
843
+ | `list` | cada agente: nombre, slug, rol, runtime, tipo, directorio de trabajo |
844
+ | `mounts` | los montajes de un agente, como etiqueta y destino real |
845
+ | `mount --src RUTA` | monta un repo, un worktree o una carpeta de documentos |
846
+ | `unmount --name ETIQUETA` | quita ese montaje; la carpeta en sí no se toca |
847
+ | `sync` / `sync-all` | reconstruye los workspaces desde la ficha, como hace el lanzador |
848
+
849
+ Desmontar quita un symlink y una clave de la ficha. Nunca borra aquello a lo que
850
+ apuntaba el enlace.
851
+
745
852
  ### `agents-city city`
746
853
 
747
854
  Abre el mapa local de una ciudad, sin arrancar una sesión de agentes.
@@ -769,6 +876,46 @@ clicables, `P` (o el control ⛶) alterna pantalla completa, y el rail en vivo
769
876
  del Hall se redimensiona arrastrando su borde. El contrato completo está en
770
877
  [docs/map-live-layers.md](docs/map-live-layers.md).
771
878
 
879
+ ### `agents-city shortcut`
880
+
881
+ Pone una ciudad en tu escritorio: su nombre, un icono coloreado a partir de su
882
+ propia identidad, y un doble clic que la abre.
883
+
884
+ ```bash
885
+ agents-city shortcut # la ciudad seleccionada
886
+ agents-city shortcut product # una concreta
887
+ agents-city shortcut --hall # una puerta que abre el mapa en vez del asiento
888
+ agents-city shortcut --remove # quitarlo del escritorio
889
+ agents-city shortcut --to ~/bin # escribirlo en otro sitio
890
+ ```
891
+
892
+ | Opción | Efecto |
893
+ |---|---|
894
+ | `--hall` | el acceso directo abre el mapa en el navegador en vez de la ciudad tmux |
895
+ | `--remove` | quita el acceso directo de esta ciudad |
896
+ | `--to DIR` | lo escribe en otra carpeta que no sea el escritorio |
897
+
898
+ Lo que se escribe depende del escritorio, y en cada uno es de verdad, no un
899
+ script disfrazado:
900
+
901
+ | Plataforma | Acceso directo | Icono |
902
+ |---|---|---|
903
+ | macOS | bundle `.app` que abre la ciudad en Terminal | `.icns`, construido con el `iconutil` del sistema |
904
+ | Linux | entrada `.desktop`, marcada como confiable donde hay `gio` | `.png` bajo `XDG_DATA_HOME` |
905
+ | Windows (WSL) | `.lnk` en el escritorio **de Windows**, que lanza `wsl.exe` | `.ico`, cuando hay interoperabilidad con PowerShell |
906
+
907
+ Todos ejecutan la misma línea que escribirías tú, así que el acceso directo es un
908
+ botón etiquetado sobre la puerta que ya existe, no una segunda forma de entrar. El
909
+ icono se genera sin ninguna librería de imagen: un PNG escrito a mano, envuelto
910
+ como `.ico` para Windows y convertido con `iconutil` en macOS.
911
+
912
+ En Windows la ciudad vive dentro de WSL, y un `~/Desktop` de ahí es el escritorio
913
+ del home de Linux que nadie mira: por eso el escritorio de Windows se le pregunta
914
+ a Windows, nunca se arma a partir del nombre de usuario, porque un escritorio
915
+ redirigido a OneDrive o a un perfil de dominio no está bajo
916
+ `C:\Users\<nombre>\Desktop`. Sin interoperabilidad se escribe un `.cmd` que
917
+ también se abre con doble clic: la misma puerta, con icono genérico.
918
+
772
919
  ### `agents-city demo`
773
920
 
774
921
  Abre una ciudad ficticia y desechable en el Hall completo. El centro contiene
@@ -938,13 +1085,22 @@ demuestra por sí solo mayor calidad de respuesta ni una afirmación SOTA.
938
1085
 
939
1086
  ### `agents-city reset`
940
1087
 
941
- Reinicia **una** ciudad gestionada conservando su identidad estable y sus repos.
1088
+ Reinicia ciudades gestionadas conservando su identidad estable y sus repos.
942
1089
 
943
1090
  ```bash
944
- agents-city reset producto --dry-run
945
- agents-city reset producto
1091
+ agents-city reset product --dry-run # muestra cada efecto, no cambia nada
1092
+ agents-city reset product
1093
+ agents-city reset product cliente-a # varias, separadas por espacios
1094
+ agents-city reset all # todas las de este propietario
946
1095
  ```
947
1096
 
1097
+ Un nombre desconocido aborta la ejecución **entera** antes de tocar nada:
1098
+ reiniciar tres ciudades y pararse en una errata es el peor final posible para un
1099
+ comando destructivo. El Hall tiene lo mismo como botón, en **Cities** — primero
1100
+ enseña qué desaparece, qué sobrevive y dónde queda la copia, y te pide escribir
1101
+ el nombre de la ciudad.
1102
+
1103
+
948
1104
  El plan de reset:
949
1105
 
950
1106
  1. valida que el destino sea una ciudad gestionada, no una ruta arbitraria;
@@ -975,6 +1131,44 @@ seguir activo. Sin ciudad, muestra o cierra todo lo gestionado por Agents City.
975
1131
  Una sesión tmux puede contener trabajo sin guardar, por lo que el dry-run es la
976
1132
  forma segura de comprobar el alcance.
977
1133
 
1134
+ ### `agents-city doctor`
1135
+
1136
+ Revisa esta máquina y dice qué parte falta, en una pantalla.
1137
+
1138
+ ```bash
1139
+ agents-city doctor
1140
+ ```
1141
+
1142
+ Informa de las herramientas que necesita (python3, tmux, bash, git, node, y `gh`
1143
+ como opcional), qué runtimes de agente hay instalados, **qué jaula te da este
1144
+ kernel** —seatbelt, bubblewrap, o ninguna y por qué—, la ciudad seleccionada y su
1145
+ ficha, si el bundle del Hall está construido, y si hay una versión más nueva
1146
+ publicada. Sale con código distinto de cero cuando algo está roto, así que
1147
+ también sirve dentro de un script.
1148
+
1149
+ Si le pasas un fichero de configuración, conserva su trabajo anterior: detectar
1150
+ una forma antigua, explicarla y migrarla con `--fix` (dejando copia de
1151
+ seguridad).
1152
+
1153
+ ### `agents-city update`
1154
+
1155
+ ```bash
1156
+ agents-city update # instala la versión publicada más nueva
1157
+ agents-city update --check # sólo pregunta: instalada frente a publicada
1158
+ agents-city update --tag beta # sigue una dist-tag
1159
+ ```
1160
+
1161
+ La comprobación es **un GET al registro público de npm**, cacheado un día bajo
1162
+ `~/.agents-city/.runtime/`. No se envía nada de tu máquina —ni identificador, ni
1163
+ contador, ni telemetría— y `CITY_UPDATE_CHECK=0` lo desactiva por completo. Sólo
1164
+ ocurre donde has abierto algo deliberadamente: `doctor`, `update` y el Hall (que
1165
+ muestra una línea cuando hay versión nueva). Un `agents-city cities` normal no
1166
+ toca la red.
1167
+
1168
+ Si lo instalaste desde un checkout de git, `update` se niega y te dice el comando
1169
+ que encaja con tu instalación, en vez de ejecutar `npm install -g` sobre tu copia
1170
+ de trabajo.
1171
+
978
1172
  ### `agents-city test`
979
1173
 
980
1174
  Ejecuta la suite del checkout. Sin argumentos ejecuta todas las suites; con
@@ -1624,7 +1818,7 @@ de vida por mensaje. `bus inbox` consume `road-inbox`, no el historial append-on
1624
1818
  | `AGENTS_CITY_USER` | identidad local resuelta | fuerza el propietario para pruebas/migraciones |
1625
1819
  | `AGENTS_CITY_DATA` | ciudad seleccionada | fuerza una carpeta de ciudad en una terminal externa |
1626
1820
  | `CITY_CODE_DIR` | `~/codigo` | destino de clones aceptados desde GitHub |
1627
- | `CITY_SEARCH_IN` | raíces habituales del home | lista separada por `:` donde buscar repos locales |
1821
+ | `CITY_SEARCH_IN` | raíces habituales del home | lista separada por `:` donde buscar (también `;`, para Windows) |
1628
1822
  | `CITY_SEARCH_DEPTH` | `4` | profundidad máxima de esa búsqueda |
1629
1823
  | `AGENTS_CITY_ORG` | vacía | filtra repos por organización; vacía significa todos |
1630
1824
  | `CITY_SETTLE` | `8` | espera inicial, en segundos, para arrancar Claude |
@@ -1634,6 +1828,12 @@ de vida por mensaje. `bus inbox` consume `road-inbox`, no el historial append-on
1634
1828
  | `AGENTS_CITY_URL` | `CITY_BUS_URL` | endpoint de reporting/mapa si está separado |
1635
1829
  | `CITY_DIR` | `~/.claude/channels/city-bus` | carpeta de compatibilidad para `.env` y hooks |
1636
1830
  | `CITY_HOOKS` | `city` | `everywhere` ejecuta los hooks de conciencia en todas las sesiones de Claude, no solo en runtimes de ciudad |
1831
+ | `CITY_DESKTOP` | `~/Desktop`, o el escritorio de Windows bajo WSL | dónde escribe `agents-city shortcut` |
1832
+ | `CITY_CAGE` | `1` | `0` arranca todas las ventanas sin jaula |
1833
+ | `CITY_CAGE_DENY` | vacío | rutas extra que sellar, separadas por `:` |
1834
+ | `CITY_CAGE_ALLOW_WRITE` | vacío | rutas extra que mantener escribibles, separadas por `:` |
1835
+ | `CITY_UPDATE_CHECK` | `1` | `0` no pregunta nunca a npm si hay versión más nueva |
1836
+ | `CITY_CAGE_BWRAP` | se sondea | `1`/`0` responde «¿puede este Linux crear un espacio de nombres?» sin sondear; el lanzador lo fija una vez por ciudad |
1637
1837
 
1638
1838
  Ejemplos:
1639
1839
 
@@ -1649,10 +1849,38 @@ agents-city cities create laboratorio
1649
1849
  CITY_SETTLE=0 CITY_STAGGER=0 agents-city seat --city producto
1650
1850
  ```
1651
1851
 
1652
- El índice de repos locales se cachea un día en
1653
- `$XDG_CACHE_HOME/agents-city/repos.tsv` o `~/.cache/agents-city/repos.tsv`. El Hall
1654
- ofrece refrescarlo. Desde terminal, si cambias `CITY_SEARCH_IN` y la caché aún es
1655
- válida, elimina **sólo ese fichero de índice** y repite `seat --repos`.
1852
+ ### Qué se le puede dar a una casa para trabajar
1853
+
1854
+ `plugin/scripts/busca.py` recorre tu disco una vez e indexa tres clases de sitio:
1855
+
1856
+ * **repositorios** — con el nombre de su remoto `origin`, no el de la carpeta en
1857
+ la que están, para que un clon se encuentre por el nombre que dirías en voz
1858
+ alta;
1859
+ * **worktrees** — un worktree enlazado es la carpeta en la que de verdad trabaja
1860
+ un agente aislado, y aparece como `repo@rama`, una cosa distinta que elegir;
1861
+ * **carpetas de documentos** — un directorio con escritura dentro y sin git por
1862
+ ninguna parte, que es lo que monta un agente `knowledge`.
1863
+
1864
+ Lee `.git/config` y `HEAD` directamente en vez de lanzar `git` una vez por
1865
+ repositorio, así que un escaneo completo termina mientras alguien mira la
1866
+ pantalla, y funciona allí donde funcione Python: macOS, Linux y Windows por
1867
+ igual. Este índice es el que usa la **terminal**: `seat --repos`, y el lanzador
1868
+ resolviendo el `repo@rama` de una ficha a una ruta de esta máquina.
1869
+ `plugin/scripts/find-repos.sh` es un envoltorio fino para quien lo llama desde
1870
+ shell, y sólo imprime la mitad git.
1871
+
1872
+ El **Hall** no lo usa, y a propósito: allí, elegir sobre qué trabaja un agente es
1873
+ un explorador de carpetas. Recorres tu disco y coges lo que quieras — un
1874
+ repositorio, un worktree, una carpeta de documentos, un fichero exacto — y no se
1875
+ te adelanta nada ni se filtra nada. Una lista adivinada sólo puede ofrecerte lo
1876
+ que sabía buscar, y es una lista más que leer antes de hacer aquello a lo que
1877
+ venías.
1878
+
1879
+ El índice se cachea un día en `$XDG_CACHE_HOME/agents-city/lugares.tsv` o
1880
+ `~/.cache/agents-city/lugares.tsv`. Tanto el formulario de casas del Hall como el
1881
+ asiento ofrecen refrescarlo; desde terminal, `busca.py --refresh` lo reconstruye,
1882
+ que es justo lo que quieres tras cambiar `CITY_SEARCH_IN` con la caché aún
1883
+ válida.
1656
1884
 
1657
1885
  Para ajustes de transporte, el orden es:
1658
1886
 
@@ -1696,7 +1924,8 @@ y sólo el primero es yolo. En macOS las ventanas de repo de Claude, OpenCode y
1696
1924
  Kimi arrancan dentro de un perfil seatbelt generado: las escrituras caen sólo en su propio repo y su
1697
1925
  estado de runtime, y los ficheros que convierten una inyección de prompt en un
1698
1926
  robo de credenciales (`~/.ssh`, `~/.git-credentials`, `~/.aws`, configs de gh
1699
- y de nube, tokens de carretera remota) quedan sellados en el kernel — lecturas
1927
+ y de nube, tokens de carretera remota, y el propio
1928
+ `~/.claude/.credentials.json` de Claude Code) quedan sellados en el kernel — lecturas
1700
1929
  y escrituras, hijos y nietos incluidos. Al agente no se le pregunta nada: las
1701
1930
  rutas prohibidas sencillamente no existen para él. Codex usa en cambio su
1702
1931
  sandbox nativa `workspace-write` y no se envuelve en seatbelt: workers MCP como
@@ -1704,6 +1933,22 @@ sandbox nativa `workspace-write` y no se envuelve en seatbelt: workers MCP como
1704
1933
  proceso ya enjaulado. `CITY_CAGE=0` desactiva de forma deliberada la capa de
1705
1934
  confinamiento aplicable.
1706
1935
 
1936
+ **En Linux la jaula es bubblewrap.** El sello se construye como se construye en
1937
+ Linux: un espacio de nombres de montaje donde las rutas selladas sencillamente
1938
+ no están montadas, así que dentro de la jaula `~/.ssh` es un directorio vacío y
1939
+ `~/.git-credentials` se lee como nada. La misma promesa que el seatbelt, con
1940
+ otro mecanismo, y `bin/test-cage.py` lo demuestra contra un espacio de nombres
1941
+ real en cada ejecución de CI en Linux: la clave plantada no se puede leer, el
1942
+ repo sigue siendo escribible, una escritura en un directorio sellado nunca llega
1943
+ al disco y un proceso nieto no se escapa.
1944
+
1945
+ Necesita `bubblewrap` instalado (`apt install bubblewrap`) y espacios de nombres
1946
+ de usuario sin privilegios habilitados — Agents City comprueba que bwrap puede
1947
+ crear uno de verdad en vez de fiarse de que exista el binario, y una máquina
1948
+ donde no pueda lo dice y arranca sin jaula, exactamente como antes. En otras
1949
+ plataformas no hay confinamiento: sin jaula, pon agentes sobre trabajo sobre el
1950
+ que te sentirías cómodo ejecutando un script.
1951
+
1707
1952
  Como una ventana enjaulada no puede leer el token de `gh`, los PRs y pushes
1708
1953
  pasan por un broker de credenciales opcional (`CITY_BROKER=1`): un proceso
1709
1954
  pequeño del lado del dueño que guarda las credenciales, acepta tokens por
@@ -1883,10 +2128,30 @@ agents-city seat --repos
1883
2128
  ```
1884
2129
 
1885
2130
  La detección exige `.git` (directorio o fichero de worktree) y un remote `origin`.
1886
- Si acabas de cambiar las raíces, refresca desde el Hall o elimina exclusivamente
1887
- `~/.cache/agents-city/repos.tsv`. `AGENTS_CITY_ORG` puede estar filtrando el repo;
2131
+ Si acabas de cambiar las raíces, ejecuta `plugin/scripts/busca.py --refresh`. `AGENTS_CITY_ORG` puede estar filtrando el repo;
1888
2132
  déjala vacía para indexar todos los remotes.
1889
2133
 
2134
+ ### Desinstalarlo del todo
2135
+
2136
+ ```bash
2137
+ agents-city uninstall # dice exactamente qué se iría; no borra nada
2138
+ agents-city uninstall --yes # lo hace
2139
+ agents-city uninstall --keep-cities --yes # desconecta la máquina, conserva las ciudades
2140
+ agents-city uninstall --npm --yes # y quita también el paquete global
2141
+ ```
2142
+
2143
+ Cierra todas las sesiones, halls y mapas que el producto arrancó, quita los
2144
+ accesos directos del escritorio y el registro del plugin de Claude, y borra
2145
+ `~/.agents-city` (tus ciudades, su estado y sus copias), `~/.config/agents-city`,
2146
+ `~/.cache/agents-city` y `~/.claude/channels/city-bus` — más el token del bus en
2147
+ el Keychain de macOS.
2148
+
2149
+ Nunca toca tus repositorios, tus worktrees ni tus carpetas de documentos. La casa
2150
+ de un agente guarda *enlaces* a eso, y lo único que se va es el enlace.
2151
+
2152
+ `reset` responde a la otra pregunta: vacía una ciudad, deja una copia y conserva
2153
+ la instalación, para cuando piensas seguir usándolo.
2154
+
1890
2155
  ### GitHub no muestra repos privados u organizaciones
1891
2156
 
1892
2157
  ```bash