agents-city 0.3.0-beta.21 → 0.3.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 (57) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.es.md +310 -70
  3. package/README.md +297 -69
  4. package/bin/agents-city.js +3 -0
  5. package/bin/doctor +3 -0
  6. package/bin/hall.html +164 -24
  7. package/bin/navegador.mjs +415 -0
  8. package/bin/serve.py +383 -127
  9. package/bin/shortcut +3 -0
  10. package/bin/test +5 -2
  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 +12 -5
  18. package/bin/test-doctor.py +33 -0
  19. package/bin/test-navegador.py +164 -0
  20. package/bin/test-seat.py +245 -25
  21. package/bin/test-serve.py +214 -9
  22. package/bin/test-workspace.py +63 -0
  23. package/bin/testlib.py +23 -0
  24. package/bin/update +3 -0
  25. package/city/web/dist/city.js +47 -47
  26. package/city/web/dist/index.html +1 -1
  27. package/city/web/dist-hall/hall.js +2193 -174
  28. package/city/web/src/bienvenida.ts +686 -0
  29. package/city/web/src/es.ts +180 -0
  30. package/city/web/src/hall.ts +520 -168
  31. package/city/web/src/idioma.ts +86 -0
  32. package/city/web/src/main.ts +27 -0
  33. package/city/web/src/motores.ts +54 -0
  34. package/docs/agents-first.md +8 -1
  35. package/docs/security.md +46 -12
  36. package/docs/testing.md +1 -1
  37. package/package.json +1 -1
  38. package/plugin/.claude-plugin/plugin.json +1 -1
  39. package/plugin/channel/bus.js +1 -1
  40. package/plugin/channel/bus.ts +1 -1
  41. package/plugin/channel/runtime/codex.ts +1 -1
  42. package/plugin/channel/runtime-gateway.js +1 -1
  43. package/plugin/scripts/actualiza.py +198 -0
  44. package/plugin/scripts/atajos.py +506 -0
  45. package/plugin/scripts/busca.py +436 -0
  46. package/plugin/scripts/cage.py +266 -26
  47. package/plugin/scripts/capabilities.py +17 -10
  48. package/plugin/scripts/card.py +10 -0
  49. package/plugin/scripts/cities.py +34 -0
  50. package/plugin/scripts/city-session.sh +33 -7
  51. package/plugin/scripts/doctor.py +122 -0
  52. package/plugin/scripts/find-repos.sh +12 -105
  53. package/plugin/scripts/read-card.py +6 -2
  54. package/plugin/scripts/report.py +5 -6
  55. package/plugin/scripts/reset.py +50 -14
  56. package/plugin/scripts/seat.py +445 -103
  57. 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.21",
12
+ "version": "0.3.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
@@ -5,6 +5,14 @@
5
5
  **Ejecuta varias ciudades autónomas de agentes en una máquina y conecta sólo
6
6
  las que deban hablar.**
7
7
 
8
+ ```bash
9
+ npm install -g agents-city
10
+ agents-city
11
+ ```
12
+
13
+ Esa es toda la instalación. El segundo comando abre el ayuntamiento en tu
14
+ navegador y te acompaña a crear tu primera ciudad.
15
+
8
16
  Agents City es un orquestador local y multimodelo para trabajo con repositorios.
9
17
  Cada ciudad tiene una identidad, un dominio, un asiento principal, un objetivo,
10
18
  agentes de apoyo por repo, conocimiento editable, skills reconocidas en vivo y
@@ -87,53 +95,66 @@ Las fronteras importantes son:
87
95
 
88
96
  ## Inicio rápido
89
97
 
90
- ### Ahora mismo: experiencia npm real sin publicar
91
-
92
- Empaquetar primero es importante: prueba exactamente la lista de ficheros que
93
- recibiría una persona desde npm, no el checkout completo.
98
+ ### Instalar desde npm
94
99
 
95
100
  ```bash
96
- cd /ruta/al/checkout/agents-city
97
- npm pack
98
- npm install -g ./agents-city-0.3.0-beta.21.tgz
101
+ npm install -g agents-city
99
102
  agents-city --version
100
- agents-city seat
101
103
  ```
102
104
 
103
- No hace falta ejecutar `npm publish`. La instalación anterior es global sólo en
104
- tu versión activa de Node.
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.
105
108
 
106
- ### Instalación desde el registro cuando esté disponible
109
+ Necesitas Node.js 22 o superior, Python 3 y tmux; los detalles están en la
110
+ [tabla de requisitos](#requisitos-base), y `agents-city seat` se ofrece a
111
+ instalar tmux si falta. No se instala nada en el sistema más allá de la carpeta
112
+ global de npm de tu Node activo.
107
113
 
108
- Comprueba primero la disponibilidad y los dist-tags:
114
+ ### Probarlo sin instalar nada
109
115
 
110
116
  ```bash
111
- npm view agents-city dist-tags --json
117
+ npx agents-city
112
118
  ```
113
119
 
114
- Si devuelve `E404`, usa el tarball local de la sección anterior. Cuando el
115
- registro muestre un dist-tag `beta`, la instalación será:
120
+ `npx` descarga el paquete en su caché, lo ejecuta y deja intacta tu carpeta
121
+ global de npm la forma más rápida de ver si esto es para ti.
122
+
123
+ ### Después: el Hall, o el terminal
116
124
 
117
125
  ```bash
118
- npm install -g agents-city@beta
119
- agents-city --version
120
- agents-city seat
126
+ agents-city # el ayuntamiento en el navegador (igual que: agents-city hall)
127
+ agents-city seat # el asistente en terminal, si prefieres no salir de la shell
121
128
  ```
122
129
 
123
- Usa `@beta` mientras sea prerelease. `npm install -g agents-city` sin tag debe
124
- reservarse para el futuro release estable marcado como `latest`.
130
+ El Hall se sirve en `127.0.0.1`, elige un puerto libre y abre el navegador. Allí
131
+ puedes crear o seleccionar una ciudad, editar su configuración, ajustar el motor
132
+ de cada agente y ver el mapa en vivo. El Hall y el CLI usan los mismos módulos
133
+ por debajo, así que ninguno de los dos es el camino "menor".
125
134
 
126
- ### Abrir el Hall en vez del terminal
135
+ ### Actualizar o quitar
127
136
 
128
137
  ```bash
129
- agents-city
130
- # equivalente a:
131
- agents-city hall
138
+ npm install -g agents-city # actualizar a la última versión
139
+ npm uninstall -g agents-city # quitar el programa
132
140
  ```
133
141
 
134
- El Hall se sirve en `127.0.0.1`, usa un puerto libre y abre el navegador. Desde
135
- allí puedes crear o seleccionar una ciudad y editar su configuración usando los
136
- mismos módulos que usa el CLI.
142
+ Desinstalar deja `~/.agents-city`, tus ciudades y tus repos exactamente donde
143
+ están: el programa no son tus datos.
144
+
145
+ ### Instalar desde el código fuente
146
+
147
+ Para quien contribuye, y para quien quiera leer el código antes de ejecutarlo.
148
+ Empaquetar primero es la prueba honesta: ejercita exactamente la lista de
149
+ ficheros que recibe una persona desde npm, no tu copia de trabajo entera.
150
+
151
+ ```bash
152
+ git clone https://github.com/jlcases/agents-city.git
153
+ cd agents-city
154
+ npm pack
155
+ npm install -g ./agents-city-*.tgz
156
+ agents-city --version
157
+ ```
137
158
 
138
159
  ## Requisitos e instalación
139
160
 
@@ -174,15 +195,19 @@ Agents City usa el CLI independiente `gh`:
174
195
 
175
196
  `gh` no va dentro del paquete npm de Agents City.
176
197
 
177
- ### Actualizar una instalación local
198
+ ### Actualizar una instalación
178
199
 
179
200
  ```bash
180
- cd /ruta/al/checkout/agents-city
181
- npm pack
182
- npm install -g ./agents-city-0.3.0-beta.21.tgz
201
+ npm install -g agents-city # desde el registro
183
202
  agents-city --version
184
203
  ```
185
204
 
205
+ Desde un checkout del código, empaqueta e instala el tarball:
206
+
207
+ ```bash
208
+ cd /ruta/al/checkout/agents-city && npm pack && npm install -g ./agents-city-*.tgz
209
+ ```
210
+
186
211
  Las sesiones ya abiertas conservan el código cargado en memoria. Para aplicar la
187
212
  nueva versión a una ciudad:
188
213
 
@@ -207,7 +232,7 @@ una ciudad concreta.
207
232
 
208
233
  ## Primer arranque, paso a paso
209
234
 
210
- `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.
211
236
 
212
237
  ### 1. Dominio de trabajo
213
238
 
@@ -231,22 +256,39 @@ opciones incorporadas son:
231
256
  Es la responsabilidad del jefe de esa ciudad, no el nombre de la ciudad ni el
232
257
  motor. El asiento sigue siendo presidente aunque elijas `blank`.
233
258
 
234
- ### 3. Repos y rol de cada agente
235
-
236
- Puedes leer repos del disco, de tu cuenta GitHub o de una organización. Cada repo
237
- seleccionado recibe:
238
-
239
- - una ventana tmux;
240
- - un actor privado del bus;
241
- - un directorio de trabajo dentro del repo;
242
- - un rol operativo explícito;
243
- - las skills que su runtime ya sea capaz de descubrir allí.
244
-
245
- El rol del repo puede pertenecer a otro dominio. Ejemplo: una ciudad de software
246
- puede asignar `po` a un repo de producto, `seo` al portfolio y `data-engineer` a
247
- un pipeline. Ninguno se convierte en presidente.
248
-
249
- 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`.
250
292
 
251
293
  ### 4. Objetivo
252
294
 
@@ -262,19 +304,52 @@ Un objetivo puede ser cuantitativo o cualitativo. Guarda:
262
304
 
263
305
  Puedes omitirlo y configurarlo después con `agents-city seat --goal`.
264
306
 
265
- ### 5. Motor de cada ventana
266
-
267
- Enter conserva Claude en todas. También puedes elegir por ventana:
307
+ ### 5. Motor de tu propia silla
268
308
 
269
- - Claude y, opcionalmente, modelo/esfuerzo;
270
- - Codex;
271
- - OpenCode;
272
- - Kimi;
273
- - 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.
274
314
 
275
315
  La configuración persistente queda en la ficha del propietario. Los flags
276
316
  `--model` y `--effort` de `seat` son overrides sólo para ese arranque.
277
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
+
278
353
  ### Qué se crea
279
354
 
280
355
  ```text
@@ -418,8 +493,10 @@ agents-city cities
418
493
  agents-city road
419
494
  agents-city bus
420
495
  agents-city committee
496
+ agents-city agents
421
497
  agents-city skills
422
498
  agents-city city
499
+ agents-city shortcut
423
500
  agents-city demo
424
501
  agents-city report
425
502
  agents-city tokens
@@ -427,6 +504,8 @@ agents-city logs
427
504
  agents-city benchmark
428
505
  agents-city reset
429
506
  agents-city exit
507
+ agents-city doctor
508
+ agents-city update
430
509
  agents-city test
431
510
  ```
432
511
 
@@ -477,6 +556,12 @@ se escriben en el registro de actividad. El token de observador rota con el hub,
477
556
  sólo acepta un origen de este ordenador y es de sólo lectura: el navegador no
478
557
  puede dirigir el comité. `Ctrl-c` detiene el Hall.
479
558
 
559
+ Bajo la marca hay dos botones: **día/noche** e **ES/EN**. El Hall habla español e
560
+ inglés, arranca en el idioma del navegador y recuerda la elección explícita. Las
561
+ traducciones se indexan por la frase en inglés, así que lo que aún no esté
562
+ traducido cae en un inglés legible y no en un identificador — un texto nuevo
563
+ nunca se queda bloqueado esperando a la traducción.
564
+
480
565
  ### `agents-city setup`
481
566
 
482
567
  Crea o selecciona una ciudad y abre el Hall; con `--tui` entrega el flujo a
@@ -718,6 +803,31 @@ La capacidad real de invocar una skill depende del runtime. Agents City la
718
803
  anuncia como capacidad del miembro y deja al proveedor aplicar sus propias reglas
719
804
  de descubrimiento y uso.
720
805
 
806
+ ### `agents-city agents`
807
+
808
+ Lista los agentes de esta ciudad y gestiona sobre qué trabaja cada uno. Los
809
+ montajes de un agente son symlinks dentro de su workspace, así que esto es el
810
+ equivalente en terminal de la fila **works on** del Hall y de la pregunta 3 del
811
+ asistente.
812
+
813
+ ```bash
814
+ agents-city agents list --card ~/.agents-city/alice/home/alice.md --data ~/.agents-city/alice/home
815
+ agents-city agents mounts --agent urgencias --data ~/.agents-city/alice/home
816
+ agents-city agents mount --agent urgencias --src ~/documentos/manual --data …
817
+ agents-city agents unmount --agent urgencias --name manual --data …
818
+ ```
819
+
820
+ | Comando | Efecto |
821
+ |---|---|
822
+ | `list` | cada agente: nombre, slug, rol, runtime, tipo, directorio de trabajo |
823
+ | `mounts` | los montajes de un agente, como etiqueta y destino real |
824
+ | `mount --src RUTA` | monta un repo, un worktree o una carpeta de documentos |
825
+ | `unmount --name ETIQUETA` | quita ese montaje; la carpeta en sí no se toca |
826
+ | `sync` / `sync-all` | reconstruye los workspaces desde la ficha, como hace el lanzador |
827
+
828
+ Desmontar quita un symlink y una clave de la ficha. Nunca borra aquello a lo que
829
+ apuntaba el enlace.
830
+
721
831
  ### `agents-city city`
722
832
 
723
833
  Abre el mapa local de una ciudad, sin arrancar una sesión de agentes.
@@ -745,6 +855,46 @@ clicables, `P` (o el control ⛶) alterna pantalla completa, y el rail en vivo
745
855
  del Hall se redimensiona arrastrando su borde. El contrato completo está en
746
856
  [docs/map-live-layers.md](docs/map-live-layers.md).
747
857
 
858
+ ### `agents-city shortcut`
859
+
860
+ Pone una ciudad en tu escritorio: su nombre, un icono coloreado a partir de su
861
+ propia identidad, y un doble clic que la abre.
862
+
863
+ ```bash
864
+ agents-city shortcut # la ciudad seleccionada
865
+ agents-city shortcut product # una concreta
866
+ agents-city shortcut --hall # una puerta que abre el mapa en vez del asiento
867
+ agents-city shortcut --remove # quitarlo del escritorio
868
+ agents-city shortcut --to ~/bin # escribirlo en otro sitio
869
+ ```
870
+
871
+ | Opción | Efecto |
872
+ |---|---|
873
+ | `--hall` | el acceso directo abre el mapa en el navegador en vez de la ciudad tmux |
874
+ | `--remove` | quita el acceso directo de esta ciudad |
875
+ | `--to DIR` | lo escribe en otra carpeta que no sea el escritorio |
876
+
877
+ Lo que se escribe depende del escritorio, y en cada uno es de verdad, no un
878
+ script disfrazado:
879
+
880
+ | Plataforma | Acceso directo | Icono |
881
+ |---|---|---|
882
+ | macOS | bundle `.app` que abre la ciudad en Terminal | `.icns`, construido con el `iconutil` del sistema |
883
+ | Linux | entrada `.desktop`, marcada como confiable donde hay `gio` | `.png` bajo `XDG_DATA_HOME` |
884
+ | Windows (WSL) | `.lnk` en el escritorio **de Windows**, que lanza `wsl.exe` | `.ico`, cuando hay interoperabilidad con PowerShell |
885
+
886
+ Todos ejecutan la misma línea que escribirías tú, así que el acceso directo es un
887
+ botón etiquetado sobre la puerta que ya existe, no una segunda forma de entrar. El
888
+ icono se genera sin ninguna librería de imagen: un PNG escrito a mano, envuelto
889
+ como `.ico` para Windows y convertido con `iconutil` en macOS.
890
+
891
+ En Windows la ciudad vive dentro de WSL, y un `~/Desktop` de ahí es el escritorio
892
+ del home de Linux que nadie mira: por eso el escritorio de Windows se le pregunta
893
+ a Windows, nunca se arma a partir del nombre de usuario, porque un escritorio
894
+ redirigido a OneDrive o a un perfil de dominio no está bajo
895
+ `C:\Users\<nombre>\Desktop`. Sin interoperabilidad se escribe un `.cmd` que
896
+ también se abre con doble clic: la misma puerta, con icono genérico.
897
+
748
898
  ### `agents-city demo`
749
899
 
750
900
  Abre una ciudad ficticia y desechable en el Hall completo. El centro contiene
@@ -914,13 +1064,22 @@ demuestra por sí solo mayor calidad de respuesta ni una afirmación SOTA.
914
1064
 
915
1065
  ### `agents-city reset`
916
1066
 
917
- Reinicia **una** ciudad gestionada conservando su identidad estable y sus repos.
1067
+ Reinicia ciudades gestionadas conservando su identidad estable y sus repos.
918
1068
 
919
1069
  ```bash
920
- agents-city reset producto --dry-run
921
- agents-city reset producto
1070
+ agents-city reset product --dry-run # muestra cada efecto, no cambia nada
1071
+ agents-city reset product
1072
+ agents-city reset product cliente-a # varias, separadas por espacios
1073
+ agents-city reset all # todas las de este propietario
922
1074
  ```
923
1075
 
1076
+ Un nombre desconocido aborta la ejecución **entera** antes de tocar nada:
1077
+ reiniciar tres ciudades y pararse en una errata es el peor final posible para un
1078
+ comando destructivo. El Hall tiene lo mismo como botón, en **Cities** — primero
1079
+ enseña qué desaparece, qué sobrevive y dónde queda la copia, y te pide escribir
1080
+ el nombre de la ciudad.
1081
+
1082
+
924
1083
  El plan de reset:
925
1084
 
926
1085
  1. valida que el destino sea una ciudad gestionada, no una ruta arbitraria;
@@ -951,6 +1110,44 @@ seguir activo. Sin ciudad, muestra o cierra todo lo gestionado por Agents City.
951
1110
  Una sesión tmux puede contener trabajo sin guardar, por lo que el dry-run es la
952
1111
  forma segura de comprobar el alcance.
953
1112
 
1113
+ ### `agents-city doctor`
1114
+
1115
+ Revisa esta máquina y dice qué parte falta, en una pantalla.
1116
+
1117
+ ```bash
1118
+ agents-city doctor
1119
+ ```
1120
+
1121
+ Informa de las herramientas que necesita (python3, tmux, bash, git, node, y `gh`
1122
+ como opcional), qué runtimes de agente hay instalados, **qué jaula te da este
1123
+ kernel** —seatbelt, bubblewrap, o ninguna y por qué—, la ciudad seleccionada y su
1124
+ ficha, si el bundle del Hall está construido, y si hay una versión más nueva
1125
+ publicada. Sale con código distinto de cero cuando algo está roto, así que
1126
+ también sirve dentro de un script.
1127
+
1128
+ Si le pasas un fichero de configuración, conserva su trabajo anterior: detectar
1129
+ una forma antigua, explicarla y migrarla con `--fix` (dejando copia de
1130
+ seguridad).
1131
+
1132
+ ### `agents-city update`
1133
+
1134
+ ```bash
1135
+ agents-city update # instala la versión publicada más nueva
1136
+ agents-city update --check # sólo pregunta: instalada frente a publicada
1137
+ agents-city update --tag beta # sigue una dist-tag
1138
+ ```
1139
+
1140
+ La comprobación es **un GET al registro público de npm**, cacheado un día bajo
1141
+ `~/.agents-city/.runtime/`. No se envía nada de tu máquina —ni identificador, ni
1142
+ contador, ni telemetría— y `CITY_UPDATE_CHECK=0` lo desactiva por completo. Sólo
1143
+ ocurre donde has abierto algo deliberadamente: `doctor`, `update` y el Hall (que
1144
+ muestra una línea cuando hay versión nueva). Un `agents-city cities` normal no
1145
+ toca la red.
1146
+
1147
+ Si lo instalaste desde un checkout de git, `update` se niega y te dice el comando
1148
+ que encaja con tu instalación, en vez de ejecutar `npm install -g` sobre tu copia
1149
+ de trabajo.
1150
+
954
1151
  ### `agents-city test`
955
1152
 
956
1153
  Ejecuta la suite del checkout. Sin argumentos ejecuta todas las suites; con
@@ -1205,7 +1402,7 @@ asiento; nunca adquiere autoridad para ordenar directamente a un repo local.
1205
1402
  ```bash
1206
1403
  cd /ruta/al/checkout/agents-city
1207
1404
  npm pack
1208
- npm install -g ./agents-city-0.3.0-beta.21.tgz
1405
+ npm install -g ./agents-city-*.tgz
1209
1406
  agents-city seat
1210
1407
  ```
1211
1408
 
@@ -1479,7 +1676,7 @@ de razonamiento»; una autenticación fallida tampoco se cuenta como muestra rá
1479
1676
  ```bash
1480
1677
  cd /ruta/al/checkout/agents-city
1481
1678
  npm pack
1482
- npm install -g ./agents-city-0.3.0-beta.21.tgz
1679
+ npm install -g ./agents-city-*.tgz
1483
1680
  agents-city --version
1484
1681
  agents-city exit producto --dry-run
1485
1682
  agents-city exit producto
@@ -1600,7 +1797,7 @@ de vida por mensaje. `bus inbox` consume `road-inbox`, no el historial append-on
1600
1797
  | `AGENTS_CITY_USER` | identidad local resuelta | fuerza el propietario para pruebas/migraciones |
1601
1798
  | `AGENTS_CITY_DATA` | ciudad seleccionada | fuerza una carpeta de ciudad en una terminal externa |
1602
1799
  | `CITY_CODE_DIR` | `~/codigo` | destino de clones aceptados desde GitHub |
1603
- | `CITY_SEARCH_IN` | raíces habituales del home | lista separada por `:` donde buscar repos locales |
1800
+ | `CITY_SEARCH_IN` | raíces habituales del home | lista separada por `:` donde buscar (también `;`, para Windows) |
1604
1801
  | `CITY_SEARCH_DEPTH` | `4` | profundidad máxima de esa búsqueda |
1605
1802
  | `AGENTS_CITY_ORG` | vacía | filtra repos por organización; vacía significa todos |
1606
1803
  | `CITY_SETTLE` | `8` | espera inicial, en segundos, para arrancar Claude |
@@ -1610,6 +1807,12 @@ de vida por mensaje. `bus inbox` consume `road-inbox`, no el historial append-on
1610
1807
  | `AGENTS_CITY_URL` | `CITY_BUS_URL` | endpoint de reporting/mapa si está separado |
1611
1808
  | `CITY_DIR` | `~/.claude/channels/city-bus` | carpeta de compatibilidad para `.env` y hooks |
1612
1809
  | `CITY_HOOKS` | `city` | `everywhere` ejecuta los hooks de conciencia en todas las sesiones de Claude, no solo en runtimes de ciudad |
1810
+ | `CITY_DESKTOP` | `~/Desktop`, o el escritorio de Windows bajo WSL | dónde escribe `agents-city shortcut` |
1811
+ | `CITY_CAGE` | `1` | `0` arranca todas las ventanas sin jaula |
1812
+ | `CITY_CAGE_DENY` | vacío | rutas extra que sellar, separadas por `:` |
1813
+ | `CITY_CAGE_ALLOW_WRITE` | vacío | rutas extra que mantener escribibles, separadas por `:` |
1814
+ | `CITY_UPDATE_CHECK` | `1` | `0` no pregunta nunca a npm si hay versión más nueva |
1815
+ | `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 |
1613
1816
 
1614
1817
  Ejemplos:
1615
1818
 
@@ -1625,10 +1828,30 @@ agents-city cities create laboratorio
1625
1828
  CITY_SETTLE=0 CITY_STAGGER=0 agents-city seat --city producto
1626
1829
  ```
1627
1830
 
1628
- El índice de repos locales se cachea un día en
1629
- `$XDG_CACHE_HOME/agents-city/repos.tsv` o `~/.cache/agents-city/repos.tsv`. El Hall
1630
- ofrece refrescarlo. Desde terminal, si cambias `CITY_SEARCH_IN` y la caché aún es
1631
- válida, elimina **sólo ese fichero de índice** y repite `seat --repos`.
1831
+ ### Qué se le puede dar a una casa para trabajar
1832
+
1833
+ `plugin/scripts/busca.py` recorre tu disco una vez e indexa tres clases de sitio:
1834
+
1835
+ * **repositorios** — con el nombre de su remoto `origin`, no el de la carpeta en
1836
+ la que están, para que un clon se encuentre por el nombre que dirías en voz
1837
+ alta;
1838
+ * **worktrees** — un worktree enlazado es la carpeta en la que de verdad trabaja
1839
+ un agente aislado, y aparece como `repo@rama`, una cosa distinta que elegir;
1840
+ * **carpetas de documentos** — un directorio con escritura dentro y sin git por
1841
+ ninguna parte, que es lo que monta un agente `knowledge`.
1842
+
1843
+ Lee `.git/config` y `HEAD` directamente en vez de lanzar `git` una vez por
1844
+ repositorio, así que un escaneo completo termina mientras alguien mira la
1845
+ pantalla, y funciona allí donde funcione Python: macOS, Linux y Windows por
1846
+ igual. La guía y el Hall buscan sobre este índice; `plugin/scripts/find-repos.sh`
1847
+ es un envoltorio fino para quien lo llama desde shell, y sólo imprime la mitad
1848
+ git.
1849
+
1850
+ El índice se cachea un día en `$XDG_CACHE_HOME/agents-city/lugares.tsv` o
1851
+ `~/.cache/agents-city/lugares.tsv`. Tanto el formulario de casas del Hall como el
1852
+ asiento ofrecen refrescarlo; desde terminal, `busca.py --refresh` lo reconstruye,
1853
+ que es justo lo que quieres tras cambiar `CITY_SEARCH_IN` con la caché aún
1854
+ válida.
1632
1855
 
1633
1856
  Para ajustes de transporte, el orden es:
1634
1857
 
@@ -1672,7 +1895,8 @@ y sólo el primero es yolo. En macOS las ventanas de repo de Claude, OpenCode y
1672
1895
  Kimi arrancan dentro de un perfil seatbelt generado: las escrituras caen sólo en su propio repo y su
1673
1896
  estado de runtime, y los ficheros que convierten una inyección de prompt en un
1674
1897
  robo de credenciales (`~/.ssh`, `~/.git-credentials`, `~/.aws`, configs de gh
1675
- y de nube, tokens de carretera remota) quedan sellados en el kernel — lecturas
1898
+ y de nube, tokens de carretera remota, y el propio
1899
+ `~/.claude/.credentials.json` de Claude Code) quedan sellados en el kernel — lecturas
1676
1900
  y escrituras, hijos y nietos incluidos. Al agente no se le pregunta nada: las
1677
1901
  rutas prohibidas sencillamente no existen para él. Codex usa en cambio su
1678
1902
  sandbox nativa `workspace-write` y no se envuelve en seatbelt: workers MCP como
@@ -1680,6 +1904,22 @@ sandbox nativa `workspace-write` y no se envuelve en seatbelt: workers MCP como
1680
1904
  proceso ya enjaulado. `CITY_CAGE=0` desactiva de forma deliberada la capa de
1681
1905
  confinamiento aplicable.
1682
1906
 
1907
+ **En Linux la jaula es bubblewrap.** El sello se construye como se construye en
1908
+ Linux: un espacio de nombres de montaje donde las rutas selladas sencillamente
1909
+ no están montadas, así que dentro de la jaula `~/.ssh` es un directorio vacío y
1910
+ `~/.git-credentials` se lee como nada. La misma promesa que el seatbelt, con
1911
+ otro mecanismo, y `bin/test-cage.py` lo demuestra contra un espacio de nombres
1912
+ real en cada ejecución de CI en Linux: la clave plantada no se puede leer, el
1913
+ repo sigue siendo escribible, una escritura en un directorio sellado nunca llega
1914
+ al disco y un proceso nieto no se escapa.
1915
+
1916
+ Necesita `bubblewrap` instalado (`apt install bubblewrap`) y espacios de nombres
1917
+ de usuario sin privilegios habilitados — Agents City comprueba que bwrap puede
1918
+ crear uno de verdad en vez de fiarse de que exista el binario, y una máquina
1919
+ donde no pueda lo dice y arranca sin jaula, exactamente como antes. En otras
1920
+ plataformas no hay confinamiento: sin jaula, pon agentes sobre trabajo sobre el
1921
+ que te sentirías cómodo ejecutando un script.
1922
+
1683
1923
  Como una ventana enjaulada no puede leer el token de `gh`, los PRs y pushes
1684
1924
  pasan por un broker de credenciales opcional (`CITY_BROKER=1`): un proceso
1685
1925
  pequeño del lado del dueño que guarda las credenciales, acepta tokens por
@@ -1859,8 +2099,8 @@ agents-city seat --repos
1859
2099
  ```
1860
2100
 
1861
2101
  La detección exige `.git` (directorio o fichero de worktree) y un remote `origin`.
1862
- Si acabas de cambiar las raíces, refresca desde el Hall o elimina exclusivamente
1863
- `~/.cache/agents-city/repos.tsv`. `AGENTS_CITY_ORG` puede estar filtrando el repo;
2102
+ Si acabas de cambiar las raíces, usa **Buscar otra vez** en el formulario de
2103
+ casas, o ejecuta `plugin/scripts/busca.py --refresh`. `AGENTS_CITY_ORG` puede estar filtrando el repo;
1864
2104
  déjala vacía para indexar todos los remotes.
1865
2105
 
1866
2106
  ### GitHub no muestra repos privados u organizaciones
@@ -1986,7 +2226,7 @@ npm pack --dry-run
1986
2226
  npm pack
1987
2227
 
1988
2228
  CITY_TEST_PREFIX="$(mktemp -d)"
1989
- npm install -g --prefix "$CITY_TEST_PREFIX" ./agents-city-0.3.0-beta.21.tgz
2229
+ npm install -g --prefix "$CITY_TEST_PREFIX" ./agents-city-*.tgz
1990
2230
  "$CITY_TEST_PREFIX/bin/agents-city" --version
1991
2231
  "$CITY_TEST_PREFIX/bin/agents-city" --help
1992
2232
  ```