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.
- package/.claude-plugin/marketplace.json +1 -1
- package/README.es.md +310 -70
- package/README.md +297 -69
- package/bin/agents-city.js +3 -0
- package/bin/doctor +3 -0
- package/bin/hall.html +164 -24
- package/bin/navegador.mjs +415 -0
- package/bin/serve.py +383 -127
- package/bin/shortcut +3 -0
- package/bin/test +5 -2
- package/bin/test-actualiza.py +130 -0
- package/bin/test-atajos.py +301 -0
- package/bin/test-busca.py +216 -0
- package/bin/test-cage.py +170 -2
- package/bin/test-card.py +2 -2
- package/bin/test-cities.py +45 -0
- package/bin/test-contracts.py +12 -5
- package/bin/test-doctor.py +33 -0
- package/bin/test-navegador.py +164 -0
- package/bin/test-seat.py +245 -25
- package/bin/test-serve.py +214 -9
- package/bin/test-workspace.py +63 -0
- package/bin/testlib.py +23 -0
- package/bin/update +3 -0
- package/city/web/dist/city.js +47 -47
- package/city/web/dist/index.html +1 -1
- package/city/web/dist-hall/hall.js +2193 -174
- package/city/web/src/bienvenida.ts +686 -0
- package/city/web/src/es.ts +180 -0
- package/city/web/src/hall.ts +520 -168
- package/city/web/src/idioma.ts +86 -0
- package/city/web/src/main.ts +27 -0
- package/city/web/src/motores.ts +54 -0
- package/docs/agents-first.md +8 -1
- package/docs/security.md +46 -12
- package/docs/testing.md +1 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/channel/bus.js +1 -1
- package/plugin/channel/bus.ts +1 -1
- package/plugin/channel/runtime/codex.ts +1 -1
- package/plugin/channel/runtime-gateway.js +1 -1
- package/plugin/scripts/actualiza.py +198 -0
- package/plugin/scripts/atajos.py +506 -0
- package/plugin/scripts/busca.py +436 -0
- package/plugin/scripts/cage.py +266 -26
- package/plugin/scripts/capabilities.py +17 -10
- package/plugin/scripts/card.py +10 -0
- package/plugin/scripts/cities.py +34 -0
- package/plugin/scripts/city-session.sh +33 -7
- package/plugin/scripts/doctor.py +122 -0
- package/plugin/scripts/find-repos.sh +12 -105
- package/plugin/scripts/read-card.py +6 -2
- package/plugin/scripts/report.py +5 -6
- package/plugin/scripts/reset.py +50 -14
- package/plugin/scripts/seat.py +445 -103
- 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
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
105
108
|
|
|
106
|
-
|
|
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
|
-
|
|
114
|
+
### Probarlo sin instalar nada
|
|
109
115
|
|
|
110
116
|
```bash
|
|
111
|
-
|
|
117
|
+
npx agents-city
|
|
112
118
|
```
|
|
113
119
|
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
119
|
-
agents-city
|
|
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
|
-
|
|
124
|
-
|
|
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
|
-
###
|
|
135
|
+
### Actualizar o quitar
|
|
127
136
|
|
|
128
137
|
```bash
|
|
129
|
-
agents-city
|
|
130
|
-
#
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
198
|
+
### Actualizar una instalación
|
|
178
199
|
|
|
179
200
|
```bash
|
|
180
|
-
|
|
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
|
|
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.
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
|
266
|
-
|
|
267
|
-
Enter conserva Claude en todas. También puedes elegir por ventana:
|
|
307
|
+
### 5. Motor de tu propia silla
|
|
268
308
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
|
1067
|
+
Reinicia ciudades gestionadas conservando su identidad estable y sus repos.
|
|
918
1068
|
|
|
919
1069
|
```bash
|
|
920
|
-
agents-city reset
|
|
921
|
-
agents-city reset
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
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
|
|
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,
|
|
1863
|
-
|
|
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
|
|
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
|
```
|