agents-city 0.1.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 (449) hide show
  1. package/.claude-plugin/marketplace.json +16 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.es.md +2226 -0
  5. package/README.md +2196 -0
  6. package/benchmarks/committee/README.md +39 -0
  7. package/benchmarks/committee/metrics.py +51 -0
  8. package/benchmarks/committee/run.py +64 -0
  9. package/benchmarks/committee/traces/01-single.json +8 -0
  10. package/benchmarks/committee/traces/02-mesh.json +16 -0
  11. package/benchmarks/committee/traces/03-chair.json +15 -0
  12. package/benchmarks/latency/README.md +35 -0
  13. package/benchmarks/latency/fake-claude-cli.mjs +119 -0
  14. package/benchmarks/latency/fake-native-server.mjs +340 -0
  15. package/benchmarks/latency/fake-tui.py +91 -0
  16. package/benchmarks/latency/live.py +380 -0
  17. package/benchmarks/stress/README.md +20 -0
  18. package/benchmarks/stress/run.py +487 -0
  19. package/bin/agents +4 -0
  20. package/bin/agents-city.js +119 -0
  21. package/bin/benchmark +17 -0
  22. package/bin/bus +6 -0
  23. package/bin/cities +3 -0
  24. package/bin/city +86 -0
  25. package/bin/committee +6 -0
  26. package/bin/demo +200 -0
  27. package/bin/doctor +3 -0
  28. package/bin/exit +5 -0
  29. package/bin/hall +73 -0
  30. package/bin/hall.html +498 -0
  31. package/bin/logs +3 -0
  32. package/bin/navegador.mjs +243 -0
  33. package/bin/report.py +14 -0
  34. package/bin/reset +3 -0
  35. package/bin/road +3 -0
  36. package/bin/seat +10 -0
  37. package/bin/serve.py +1579 -0
  38. package/bin/setup.py +753 -0
  39. package/bin/shortcut +3 -0
  40. package/bin/skills +3 -0
  41. package/bin/test +133 -0
  42. package/bin/test-actualiza.py +130 -0
  43. package/bin/test-adapter.py +183 -0
  44. package/bin/test-admision.py +99 -0
  45. package/bin/test-atajos.py +301 -0
  46. package/bin/test-avatar.py +58 -0
  47. package/bin/test-benchmark.py +40 -0
  48. package/bin/test-broker.py +334 -0
  49. package/bin/test-cage.py +374 -0
  50. package/bin/test-card.py +402 -0
  51. package/bin/test-channel.py +379 -0
  52. package/bin/test-cities.py +453 -0
  53. package/bin/test-claude-runtime.py +252 -0
  54. package/bin/test-committee.py +340 -0
  55. package/bin/test-contracts.py +551 -0
  56. package/bin/test-crecimiento.py +164 -0
  57. package/bin/test-demo.py +308 -0
  58. package/bin/test-doctor.py +139 -0
  59. package/bin/test-domains.py +151 -0
  60. package/bin/test-evidencia.py +50 -0
  61. package/bin/test-exit.py +128 -0
  62. package/bin/test-hall-protocol.py +93 -0
  63. package/bin/test-launch.py +169 -0
  64. package/bin/test-live-feed.py +508 -0
  65. package/bin/test-navegador.py +140 -0
  66. package/bin/test-pairing.py +99 -0
  67. package/bin/test-parcels.py +283 -0
  68. package/bin/test-runtime-failures.py +252 -0
  69. package/bin/test-runtime-ui.py +488 -0
  70. package/bin/test-runtime.py +268 -0
  71. package/bin/test-rutas.py +80 -0
  72. package/bin/test-seat.py +1598 -0
  73. package/bin/test-security.py +150 -0
  74. package/bin/test-serve.py +1251 -0
  75. package/bin/test-stress.py +64 -0
  76. package/bin/test-widgets.py +143 -0
  77. package/bin/test-workspace.py +251 -0
  78. package/bin/testlib.py +118 -0
  79. package/bin/tokens.py +14 -0
  80. package/bin/update +3 -0
  81. package/bus/scripts/deploy.sh +60 -0
  82. package/bus/scripts/mint-token.sh +68 -0
  83. package/bus/scripts/setup-dev.sh +79 -0
  84. package/bus/scripts/test-channel.ts +8 -0
  85. package/bus/scripts/test-hub.ts +266 -0
  86. package/bus/scripts/test-local.sh +40 -0
  87. package/bus/scripts/test-queue.ts +132 -0
  88. package/bus/worker/package-lock.json +1971 -0
  89. package/bus/worker/package.json +17 -0
  90. package/bus/worker/src/index.ts +485 -0
  91. package/bus/worker/tsconfig.json +13 -0
  92. package/bus/worker/wrangler.toml +32 -0
  93. package/city/oven/README.md +59 -0
  94. package/city/oven/collect.py +43 -0
  95. package/city/oven/oven.html +4 -0
  96. package/city/scripts/history.py +120 -0
  97. package/city/scripts/seed.py +442 -0
  98. package/city/web/assets/modelos/License.txt +28 -0
  99. package/city/web/assets/modelos/PROCEDENCIA.txt +3 -0
  100. package/city/web/assets/modelos/building-a.glb +0 -0
  101. package/city/web/assets/modelos/building-b.glb +0 -0
  102. package/city/web/assets/modelos/building-c.glb +0 -0
  103. package/city/web/assets/modelos/building-d.glb +0 -0
  104. package/city/web/assets/modelos/building-e.glb +0 -0
  105. package/city/web/assets/modelos/building-f.glb +0 -0
  106. package/city/web/assets/modelos/building-g.glb +0 -0
  107. package/city/web/assets/modelos/building-h.glb +0 -0
  108. package/city/web/assets/sprites/building-a.png +0 -0
  109. package/city/web/assets/sprites/building-b.png +0 -0
  110. package/city/web/assets/sprites/building-c.png +0 -0
  111. package/city/web/assets/sprites/building-d.png +0 -0
  112. package/city/web/assets/sprites/building-e.png +0 -0
  113. package/city/web/assets/sprites/building-f.png +0 -0
  114. package/city/web/assets/sprites/building-g.png +0 -0
  115. package/city/web/assets/sprites/building-h.png +0 -0
  116. package/city/web/assets/sprites/building-i.png +0 -0
  117. package/city/web/assets/sprites/building-j.png +0 -0
  118. package/city/web/assets/sprites/building-k.png +0 -0
  119. package/city/web/assets/sprites/building-l.png +0 -0
  120. package/city/web/assets/sprites/building-m.png +0 -0
  121. package/city/web/assets/sprites/building-n.png +0 -0
  122. package/city/web/assets/sprites/building-skyscraper-a.png +0 -0
  123. package/city/web/assets/sprites/building-skyscraper-b.png +0 -0
  124. package/city/web/assets/sprites/building-skyscraper-c.png +0 -0
  125. package/city/web/assets/sprites/building-skyscraper-d.png +0 -0
  126. package/city/web/assets/sprites/building-skyscraper-e.png +0 -0
  127. package/city/web/assets/sprites/catalogo.json +47 -0
  128. package/city/web/assets/sprites/detail-awning-wide.png +0 -0
  129. package/city/web/assets/sprites/detail-awning.png +0 -0
  130. package/city/web/assets/sprites/detail-overhang-wide.png +0 -0
  131. package/city/web/assets/sprites/detail-overhang.png +0 -0
  132. package/city/web/assets/sprites/detail-parasol-a.png +0 -0
  133. package/city/web/assets/sprites/detail-parasol-b.png +0 -0
  134. package/city/web/assets/sprites/low-detail-building-a.png +0 -0
  135. package/city/web/assets/sprites/low-detail-building-b.png +0 -0
  136. package/city/web/assets/sprites/low-detail-building-c.png +0 -0
  137. package/city/web/assets/sprites/low-detail-building-d.png +0 -0
  138. package/city/web/assets/sprites/low-detail-building-e.png +0 -0
  139. package/city/web/assets/sprites/low-detail-building-f.png +0 -0
  140. package/city/web/assets/sprites/low-detail-building-g.png +0 -0
  141. package/city/web/assets/sprites/low-detail-building-h.png +0 -0
  142. package/city/web/assets/sprites/low-detail-building-i.png +0 -0
  143. package/city/web/assets/sprites/low-detail-building-j.png +0 -0
  144. package/city/web/assets/sprites/low-detail-building-k.png +0 -0
  145. package/city/web/assets/sprites/low-detail-building-l.png +0 -0
  146. package/city/web/assets/sprites/low-detail-building-m.png +0 -0
  147. package/city/web/assets/sprites/low-detail-building-n.png +0 -0
  148. package/city/web/assets/sprites/low-detail-building-wide-a.png +0 -0
  149. package/city/web/assets/sprites/low-detail-building-wide-b.png +0 -0
  150. package/city/web/assets/sprites/medidas.json +248 -0
  151. package/city/web/dist/city.js +939 -0
  152. package/city/web/dist/index.html +294 -0
  153. package/city/web/dist/modelos/License.txt +28 -0
  154. package/city/web/dist/modelos/PROCEDENCIA.txt +3 -0
  155. package/city/web/dist/modelos/building-a.glb +0 -0
  156. package/city/web/dist/modelos/building-b.glb +0 -0
  157. package/city/web/dist/modelos/building-c.glb +0 -0
  158. package/city/web/dist/modelos/building-d.glb +0 -0
  159. package/city/web/dist/modelos/building-e.glb +0 -0
  160. package/city/web/dist/modelos/building-f.glb +0 -0
  161. package/city/web/dist/modelos/building-g.glb +0 -0
  162. package/city/web/dist/modelos/building-h.glb +0 -0
  163. package/city/web/dist/sprites/building-a.png +0 -0
  164. package/city/web/dist/sprites/building-b.png +0 -0
  165. package/city/web/dist/sprites/building-c.png +0 -0
  166. package/city/web/dist/sprites/building-d.png +0 -0
  167. package/city/web/dist/sprites/building-e.png +0 -0
  168. package/city/web/dist/sprites/building-f.png +0 -0
  169. package/city/web/dist/sprites/building-g.png +0 -0
  170. package/city/web/dist/sprites/building-h.png +0 -0
  171. package/city/web/dist/sprites/building-i.png +0 -0
  172. package/city/web/dist/sprites/building-j.png +0 -0
  173. package/city/web/dist/sprites/building-k.png +0 -0
  174. package/city/web/dist/sprites/building-l.png +0 -0
  175. package/city/web/dist/sprites/building-m.png +0 -0
  176. package/city/web/dist/sprites/building-n.png +0 -0
  177. package/city/web/dist/sprites/building-skyscraper-a.png +0 -0
  178. package/city/web/dist/sprites/building-skyscraper-b.png +0 -0
  179. package/city/web/dist/sprites/building-skyscraper-c.png +0 -0
  180. package/city/web/dist/sprites/building-skyscraper-d.png +0 -0
  181. package/city/web/dist/sprites/building-skyscraper-e.png +0 -0
  182. package/city/web/dist/sprites/catalogo.json +47 -0
  183. package/city/web/dist/sprites/detail-awning-wide.png +0 -0
  184. package/city/web/dist/sprites/detail-awning.png +0 -0
  185. package/city/web/dist/sprites/detail-overhang-wide.png +0 -0
  186. package/city/web/dist/sprites/detail-overhang.png +0 -0
  187. package/city/web/dist/sprites/detail-parasol-a.png +0 -0
  188. package/city/web/dist/sprites/detail-parasol-b.png +0 -0
  189. package/city/web/dist/sprites/low-detail-building-a.png +0 -0
  190. package/city/web/dist/sprites/low-detail-building-b.png +0 -0
  191. package/city/web/dist/sprites/low-detail-building-c.png +0 -0
  192. package/city/web/dist/sprites/low-detail-building-d.png +0 -0
  193. package/city/web/dist/sprites/low-detail-building-e.png +0 -0
  194. package/city/web/dist/sprites/low-detail-building-f.png +0 -0
  195. package/city/web/dist/sprites/low-detail-building-g.png +0 -0
  196. package/city/web/dist/sprites/low-detail-building-h.png +0 -0
  197. package/city/web/dist/sprites/low-detail-building-i.png +0 -0
  198. package/city/web/dist/sprites/low-detail-building-j.png +0 -0
  199. package/city/web/dist/sprites/low-detail-building-k.png +0 -0
  200. package/city/web/dist/sprites/low-detail-building-l.png +0 -0
  201. package/city/web/dist/sprites/low-detail-building-m.png +0 -0
  202. package/city/web/dist/sprites/low-detail-building-n.png +0 -0
  203. package/city/web/dist/sprites/low-detail-building-wide-a.png +0 -0
  204. package/city/web/dist/sprites/low-detail-building-wide-b.png +0 -0
  205. package/city/web/dist/sprites/medidas.json +248 -0
  206. package/city/web/dist-hall/hall.js +1363 -0
  207. package/city/web/index.html +294 -0
  208. package/city/web/package.json +18 -0
  209. package/city/web/sella.py +21 -0
  210. package/city/web/src/activity-actors.ts +47 -0
  211. package/city/web/src/activity.ts +172 -0
  212. package/city/web/src/ayuntamiento.ts +580 -0
  213. package/city/web/src/draw.ts +640 -0
  214. package/city/web/src/game-speech.ts +79 -0
  215. package/city/web/src/hall.ts +1959 -0
  216. package/city/web/src/main.ts +2252 -0
  217. package/city/web/src/oven.ts +124 -0
  218. package/city/web/src/people.ts +244 -0
  219. package/city/web/src/presencia.ts +193 -0
  220. package/city/web/src/puertas.ts +180 -0
  221. package/city/web/src/repo-roles.ts +59 -0
  222. package/city/worker/package.json +16 -0
  223. package/city/worker/schema.sql +117 -0
  224. package/city/worker/src/index.ts +702 -0
  225. package/city/worker/src/square.ts +218 -0
  226. package/city/worker/wrangler.toml +58 -0
  227. package/demo/ada.md +50 -0
  228. package/demo/bruno.md +62 -0
  229. package/demo/camila.md +56 -0
  230. package/demo/city/ada.md +40 -0
  231. package/demo/city/city.yml +8 -0
  232. package/demo/city/parcels.yml +15 -0
  233. package/demo/city/roads.json +4 -0
  234. package/demo/city/units.yml +10 -0
  235. package/demo/clinica/city.yml +8 -0
  236. package/demo/clinica/parcels.yml +15 -0
  237. package/demo/clinica/roads.json +4 -0
  238. package/demo/clinica/units.yml +9 -0
  239. package/demo/clinica/vera.md +46 -0
  240. package/demo/dante.md +54 -0
  241. package/demo/despacho/city.yml +8 -0
  242. package/demo/despacho/marta.md +46 -0
  243. package/demo/despacho/parcels.yml +15 -0
  244. package/demo/despacho/roads.json +4 -0
  245. package/demo/despacho/units.yml +9 -0
  246. package/demo/elsa.md +50 -0
  247. package/demo/farid.md +52 -0
  248. package/demo/greta.md +50 -0
  249. package/demo/hugo.md +49 -0
  250. package/demo/iris.md +49 -0
  251. package/demo/jonas.md +51 -0
  252. package/demo/kira.md +51 -0
  253. package/demo/luca.md +49 -0
  254. package/demo/parcels.yml +92 -0
  255. package/demo/seed.py +20 -0
  256. package/demo/show.py +161 -0
  257. package/demo/stories.py +824 -0
  258. package/demo/units.yml +33 -0
  259. package/docs/agents-first.md +106 -0
  260. package/docs/glossary.md +55 -0
  261. package/docs/map-live-layers.md +73 -0
  262. package/docs/security.md +265 -0
  263. package/docs/self-host.md +151 -0
  264. package/docs/testing.md +205 -0
  265. package/package.json +73 -0
  266. package/plugin/.claude-plugin/plugin.json +62 -0
  267. package/plugin/.mcp.json +15 -0
  268. package/plugin/channel/activity-cli.ts +16 -0
  269. package/plugin/channel/adapter-prompts.ts +113 -0
  270. package/plugin/channel/adapter.js +4292 -0
  271. package/plugin/channel/adapter.ts +133 -0
  272. package/plugin/channel/bus.js +20188 -0
  273. package/plugin/channel/bus.ts +131 -0
  274. package/plugin/channel/city-config.ts +125 -0
  275. package/plugin/channel/claude-channel.ts +58 -0
  276. package/plugin/channel/cli-args.ts +75 -0
  277. package/plugin/channel/client.js +4200 -0
  278. package/plugin/channel/client.ts +38 -0
  279. package/plugin/channel/committee/activity.ts +256 -0
  280. package/plugin/channel/committee/collection.ts +154 -0
  281. package/plugin/channel/committee/decision.ts +175 -0
  282. package/plugin/channel/committee/floor.ts +135 -0
  283. package/plugin/channel/committee/guards.ts +30 -0
  284. package/plugin/channel/committee/history.ts +38 -0
  285. package/plugin/channel/committee/render.ts +102 -0
  286. package/plugin/channel/committee/service.ts +72 -0
  287. package/plugin/channel/committee/storage.ts +92 -0
  288. package/plugin/channel/committee/types.ts +163 -0
  289. package/plugin/channel/committee/view.ts +63 -0
  290. package/plugin/channel/committee-cli.ts +109 -0
  291. package/plugin/channel/delivery-metrics.ts +61 -0
  292. package/plugin/channel/delivery-queue.ts +118 -0
  293. package/plugin/channel/hub/activity-controller.ts +72 -0
  294. package/plugin/channel/hub/activity-feed.ts +169 -0
  295. package/plugin/channel/hub/committee-controller.ts +60 -0
  296. package/plugin/channel/hub/connections.ts +48 -0
  297. package/plugin/channel/hub/diagnostics.ts +67 -0
  298. package/plugin/channel/hub/envelope-validity.ts +109 -0
  299. package/plugin/channel/hub/envelopes.ts +66 -0
  300. package/plugin/channel/hub/lifecycle.ts +91 -0
  301. package/plugin/channel/hub/local-roads.ts +89 -0
  302. package/plugin/channel/hub/remote-roads.ts +165 -0
  303. package/plugin/channel/hub/road-controller.ts +99 -0
  304. package/plugin/channel/hub-client.ts +149 -0
  305. package/plugin/channel/local-hub.js +5995 -0
  306. package/plugin/channel/local-hub.ts +349 -0
  307. package/plugin/channel/map-reporter.ts +48 -0
  308. package/plugin/channel/package-lock.json +1731 -0
  309. package/plugin/channel/package.json +19 -0
  310. package/plugin/channel/protocol.ts +98 -0
  311. package/plugin/channel/road-cli.ts +18 -0
  312. package/plugin/channel/run.sh +15 -0
  313. package/plugin/channel/runtime/claude.ts +458 -0
  314. package/plugin/channel/runtime/codex-config.ts +77 -0
  315. package/plugin/channel/runtime/codex.ts +669 -0
  316. package/plugin/channel/runtime/command.ts +62 -0
  317. package/plugin/channel/runtime/factory.ts +15 -0
  318. package/plugin/channel/runtime/json-rpc.ts +154 -0
  319. package/plugin/channel/runtime/kimi.ts +277 -0
  320. package/plugin/channel/runtime/opencode.ts +248 -0
  321. package/plugin/channel/runtime/process.ts +84 -0
  322. package/plugin/channel/runtime/types.ts +45 -0
  323. package/plugin/channel/runtime-files.ts +73 -0
  324. package/plugin/channel/runtime-gateway.js +6396 -0
  325. package/plugin/channel/runtime-gateway.ts +358 -0
  326. package/plugin/channel/runtime-metrics.ts +52 -0
  327. package/plugin/channel/runtime-subscription.ts +180 -0
  328. package/plugin/channel/terminal-delivery.ts +131 -0
  329. package/plugin/channel/untrusted.ts +60 -0
  330. package/plugin/commands/committee.md +31 -0
  331. package/plugin/commands/exit.md +32 -0
  332. package/plugin/commands/goals.md +20 -0
  333. package/plugin/commands/join.md +18 -0
  334. package/plugin/commands/notice.md +20 -0
  335. package/plugin/commands/propose.md +19 -0
  336. package/plugin/commands/round.md +17 -0
  337. package/plugin/commands/session.md +22 -0
  338. package/plugin/commands/settings.md +25 -0
  339. package/plugin/commands/setup.md +21 -0
  340. package/plugin/commands/team.md +23 -0
  341. package/plugin/domains/custom.md +27 -0
  342. package/plugin/domains/finance.md +31 -0
  343. package/plugin/domains/healthcare.md +34 -0
  344. package/plugin/domains/legal.md +31 -0
  345. package/plugin/domains/marketing.md +33 -0
  346. package/plugin/domains/operations.md +31 -0
  347. package/plugin/domains/research.md +32 -0
  348. package/plugin/domains/sales.md +30 -0
  349. package/plugin/domains/software.md +37 -0
  350. package/plugin/hooks/activity.sh +6 -0
  351. package/plugin/hooks/digging.sh +68 -0
  352. package/plugin/hooks/growth.sh +42 -0
  353. package/plugin/hooks/hooks.json +106 -0
  354. package/plugin/hooks/notice-on-pr.sh +35 -0
  355. package/plugin/hooks/notice-on-stop.sh +80 -0
  356. package/plugin/hooks/notice-pending.sh +58 -0
  357. package/plugin/hooks/solo-en-ciudad.sh +23 -0
  358. package/plugin/hooks/tokens.sh +47 -0
  359. package/plugin/roles/examples/account-executive.md +25 -0
  360. package/plugin/roles/examples/ai-manager.md +34 -0
  361. package/plugin/roles/examples/associate.md +24 -0
  362. package/plugin/roles/examples/brand-lead.md +20 -0
  363. package/plugin/roles/examples/cfo.md +20 -0
  364. package/plugin/roles/examples/city-lead.md +25 -0
  365. package/plugin/roles/examples/clinical-director.md +26 -0
  366. package/plugin/roles/examples/clinical-ops.md +25 -0
  367. package/plugin/roles/examples/clinician.md +25 -0
  368. package/plugin/roles/examples/compliance.md +27 -0
  369. package/plugin/roles/examples/content.md +24 -0
  370. package/plugin/roles/examples/controller.md +27 -0
  371. package/plugin/roles/examples/cpto.md +41 -0
  372. package/plugin/roles/examples/customer-success.md +25 -0
  373. package/plugin/roles/examples/data-engineer.md +37 -0
  374. package/plugin/roles/examples/data.md +60 -0
  375. package/plugin/roles/examples/dev.md +37 -0
  376. package/plugin/roles/examples/devops.md +39 -0
  377. package/plugin/roles/examples/enablement.md +24 -0
  378. package/plugin/roles/examples/ethics.md +24 -0
  379. package/plugin/roles/examples/fin-analytics.md +27 -0
  380. package/plugin/roles/examples/health-compliance.md +25 -0
  381. package/plugin/roles/examples/health-data.md +26 -0
  382. package/plugin/roles/examples/knowledge.md +25 -0
  383. package/plugin/roles/examples/lifecycle.md +26 -0
  384. package/plugin/roles/examples/llm-engineer.md +34 -0
  385. package/plugin/roles/examples/managing-partner.md +20 -0
  386. package/plugin/roles/examples/methods.md +23 -0
  387. package/plugin/roles/examples/operations-lead.md +23 -0
  388. package/plugin/roles/examples/ops.md +24 -0
  389. package/plugin/roles/examples/patient-safety.md +26 -0
  390. package/plugin/roles/examples/performance.md +27 -0
  391. package/plugin/roles/examples/po.md +36 -0
  392. package/plugin/roles/examples/process-owner.md +23 -0
  393. package/plugin/roles/examples/product-design.md +39 -0
  394. package/plugin/roles/examples/program-manager.md +24 -0
  395. package/plugin/roles/examples/quality.md +25 -0
  396. package/plugin/roles/examples/research-director.md +24 -0
  397. package/plugin/roles/examples/research-ops.md +25 -0
  398. package/plugin/roles/examples/researcher.md +25 -0
  399. package/plugin/roles/examples/revenue-lead.md +25 -0
  400. package/plugin/roles/examples/revops.md +26 -0
  401. package/plugin/roles/examples/seo.md +27 -0
  402. package/plugin/roles/examples/specialist.md +24 -0
  403. package/plugin/scripts/actualiza.py +198 -0
  404. package/plugin/scripts/admision.py +165 -0
  405. package/plugin/scripts/apaga.py +232 -0
  406. package/plugin/scripts/atajos.py +506 -0
  407. package/plugin/scripts/avatar.py +211 -0
  408. package/plugin/scripts/broker.py +531 -0
  409. package/plugin/scripts/cage.py +492 -0
  410. package/plugin/scripts/capabilities.py +210 -0
  411. package/plugin/scripts/card.py +322 -0
  412. package/plugin/scripts/cities.py +520 -0
  413. package/plugin/scripts/city-env.sh +90 -0
  414. package/plugin/scripts/city-runtime.sh +87 -0
  415. package/plugin/scripts/city-session.sh +552 -0
  416. package/plugin/scripts/city_env.py +67 -0
  417. package/plugin/scripts/crecimiento.py +140 -0
  418. package/plugin/scripts/deliberations.py +48 -0
  419. package/plugin/scripts/doctor.py +294 -0
  420. package/plugin/scripts/domains.py +201 -0
  421. package/plugin/scripts/evidencia.py +64 -0
  422. package/plugin/scripts/find-repos.sh +111 -0
  423. package/plugin/scripts/gh.py +159 -0
  424. package/plugin/scripts/hall_protocol.py +147 -0
  425. package/plugin/scripts/hook_activity.py +139 -0
  426. package/plugin/scripts/launch.py +94 -0
  427. package/plugin/scripts/logs.py +98 -0
  428. package/plugin/scripts/pairing.py +185 -0
  429. package/plugin/scripts/parcels.py +132 -0
  430. package/plugin/scripts/read-card.py +55 -0
  431. package/plugin/scripts/report.py +201 -0
  432. package/plugin/scripts/reset.py +180 -0
  433. package/plugin/scripts/roads.py +230 -0
  434. package/plugin/scripts/roles.py +274 -0
  435. package/plugin/scripts/runtime_log.py +69 -0
  436. package/plugin/scripts/runtime_processes.py +132 -0
  437. package/plugin/scripts/rutas.py +83 -0
  438. package/plugin/scripts/seat.py +1696 -0
  439. package/plugin/scripts/tokens.py +194 -0
  440. package/plugin/scripts/trust-repos.py +59 -0
  441. package/plugin/scripts/ui.py +280 -0
  442. package/plugin/scripts/units.py +80 -0
  443. package/plugin/scripts/workspace.py +561 -0
  444. package/plugin/skills/city/SKILL.md +191 -0
  445. package/templates/blank.md +39 -0
  446. package/templates/finance.md +44 -0
  447. package/templates/legal.md +45 -0
  448. package/templates/marketing.md +48 -0
  449. package/templates/product.md +45 -0
package/README.es.md ADDED
@@ -0,0 +1,2226 @@
1
+ # Agents City
2
+
3
+ [Español](README.es.md) · [English](README.md)
4
+
5
+ **Ejecuta varias ciudades autónomas de agentes en una máquina y conecta sólo
6
+ las que deban hablar.**
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
+
16
+ Agents City es un orquestador local y multimodelo para trabajo con repositorios.
17
+ Cada ciudad tiene una identidad, un dominio, un asiento principal, un objetivo,
18
+ agentes de apoyo por repo, conocimiento editable, skills reconocidas en vivo y
19
+ carreteras explícitas hacia otras ciudades. No convierte todos los agentes en un
20
+ chat grupal: el asiento preside, selecciona a los especialistas y controla los
21
+ turnos.
22
+
23
+ Esta es la guía completa. Si sólo quieres probarlo, ve a [Inicio rápido](#inicio-rápido).
24
+
25
+ ## Índice
26
+
27
+ - [Modelo mental](#modelo-mental)
28
+ - [Inicio rápido](#inicio-rápido)
29
+ - [Requisitos e instalación](#requisitos-e-instalación)
30
+ - [Primer arranque, paso a paso](#primer-arranque-paso-a-paso)
31
+ - [Trabajar dentro de tmux](#trabajar-dentro-de-tmux)
32
+ - [Motores y transportes](#motores-y-transportes)
33
+ - [Dominios, roles y conocimiento](#dominios-roles-y-conocimiento)
34
+ - [Referencia completa de comandos](#referencia-completa-de-comandos)
35
+ - [Comité: flujo completo](#comité-flujo-completo)
36
+ - [Comandos `/city:` de Claude](#comandos-city-de-claude)
37
+ - [Recetario de casos de uso](#recetario-de-casos-de-uso)
38
+ - [Ficheros y variables de entorno](#ficheros-y-variables-de-entorno)
39
+ - [Seguridad y límites de confianza](#seguridad-y-límites-de-confianza)
40
+ - [Resolución de problemas](#resolución-de-problemas)
41
+ - [Desarrollo y pruebas](#desarrollo-y-pruebas)
42
+
43
+ ## Modelo mental
44
+
45
+ Una ciudad no es una cuenta, una persona remota ni un conjunto libre de bots. Es
46
+ un ámbito de trabajo autónomo propiedad de una persona local:
47
+
48
+ ```text
49
+ usuario local
50
+ ├── ciudad home
51
+ │ ├── identidad estable: propietario/home
52
+ │ ├── dominio + rol del asiento + objetivo
53
+ │ ├── asiento: presidente y única frontera pública
54
+ │ ├── agente A: workspace + montajes → un repo git (tipo: code)
55
+ │ ├── agente B: workspace + montajes → una carpeta de documentos (tipo: knowledge)
56
+ │ ├── agente C: workspace + montajes → varios repos y un worktree
57
+ │ ├── conocimiento de dominio/rol editable
58
+ │ ├── skills que ya existen dentro del trabajo montado
59
+ │ └── carreteras explícitas hacia otros asientos
60
+ ├── ciudad producto
61
+ └── ciudad cliente-a
62
+ ```
63
+
64
+ **Primero vienen los agentes.** La unidad es el agente, y un repo es solo una de
65
+ las cosas que puede montar. Cada agente tiene una **carpeta de trabajo** con un
66
+ directorio `mounts/` de symlinks a donde vive el trabajo real — un repo git, un
67
+ worktree enlazado o una simple carpeta de documentos — así que una persona cuyo
68
+ trabajo es conocimiento en documentos, sin git alguno, es un agente de primera
69
+ clase. «Un repo es un agente» es solo el caso particular de un agente cuyo único
70
+ montaje es ese repo, por lo que **las ciudades de solo-repos siguen funcionando
71
+ igual**. Modelo completo: [docs/agents-first.md](docs/agents-first.md).
72
+
73
+ Las fronteras importantes son:
74
+
75
+ - **Usuario:** puede poseer varias ciudades locales.
76
+ - **Ciudad:** tiene identidad, dominio, objetivo, configuración y estado propios.
77
+ - **Asiento (`seat`):** es el presidente del comité y el único actor que puede
78
+ cruzar carreteras.
79
+ - **Agente:** la unidad miembro. Posee una carpeta de trabajo y opera sobre sus
80
+ montajes, aporta evidencia y siempre tiene autoridad de miembro — sea su
81
+ especialidad `dev`, `seo` o `cfo`, y sea su **tipo** `code`, `knowledge` o
82
+ `coordinator`.
83
+ - **Montaje:** un symlink dentro de la carpeta de un agente hacia trabajo real en
84
+ disco (un repo, un worktree, una carpeta de documentos). Un agente puede tener
85
+ varios, o ninguno.
86
+ - **Rol:** perspectiva y responsabilidad profesional; no concede permisos del bus.
87
+ - **Skill:** capacidad instalada por el usuario o el propio repo. El
88
+ reconocimiento es en vivo y de solo lectura; la única escritura deliberada es
89
+ el Hall instalando un zip de skill que el dueño sube explícitamente, en el
90
+ hogar de ese agente — nunca por su cuenta, nunca en otro sitio. Las skills
91
+ son el formato del runtime de Claude; los demás motores las ignoran.
92
+ - **Carretera:** allowlist entre dos asientos. Da alcance, no autoridad.
93
+ - **Comité:** proceso acotado de posiciones aisladas, síntesis, palabra, decisión
94
+ y verificación. No es una conversación lateral entre todos.
95
+
96
+ ## Inicio rápido
97
+
98
+ ### Instalar desde npm
99
+
100
+ ```bash
101
+ npm install -g agents-city
102
+ agents-city --version
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.
108
+
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.
113
+
114
+ ### Probarlo sin instalar nada
115
+
116
+ ```bash
117
+ npx agents-city
118
+ ```
119
+
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
124
+
125
+ ```bash
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
128
+ ```
129
+
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".
134
+
135
+ ### Actualizar o quitar
136
+
137
+ ```bash
138
+ npm install -g agents-city # actualizar a la última versión
139
+ npm uninstall -g agents-city # quitar el programa
140
+ ```
141
+
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
+ ```
158
+
159
+ ## Requisitos e instalación
160
+
161
+ ### Requisitos base
162
+
163
+ | Requisito | Para qué se usa |
164
+ |---|---|
165
+ | Node.js 22 o posterior | paquete npm, bus WebSocket y frontends |
166
+ | npm | instalación y empaquetado |
167
+ | Python 3 | Hall, onboarding, ciudades, mapas y utilidades |
168
+ | bash | sesiones y launchers |
169
+ | tmux | una ventana por asiento/repo; `seat` intenta instalarlo si falta |
170
+ | macOS o Linux | plataformas nativas soportadas |
171
+ | WSL | necesario en Windows porque Windows no incluye bash/tmux nativos |
172
+
173
+ Cada motor necesita además su propio CLI instalado y autenticado. Agents City no
174
+ incluye ni suplanta las cuentas de Claude, Codex, OpenCode o Kimi.
175
+
176
+ ```bash
177
+ command -v claude
178
+ command -v codex
179
+ command -v opencode
180
+ command -v kimi
181
+ ```
182
+
183
+ No necesitas tenerlos todos. Puedes usar sólo Claude, sólo Codex o una mezcla.
184
+
185
+ ### GitHub es opcional
186
+
187
+ Elegir repos locales no necesita cuenta. Si durante el onboarding eliges GitHub,
188
+ Agents City usa el CLI independiente `gh`:
189
+
190
+ 1. lo detecta;
191
+ 2. intenta instalarlo con el gestor del sistema si falta;
192
+ 3. ejecuta `gh auth login --web` si no está autenticado;
193
+ 4. muestra el código de dispositivo si no puede abrir el navegador;
194
+ 5. ofrece clonar los repos seleccionados que aún no estén en el disco.
195
+
196
+ `gh` no va dentro del paquete npm de Agents City.
197
+
198
+ ### Actualizar una instalación
199
+
200
+ ```bash
201
+ npm install -g agents-city # desde el registro
202
+ agents-city --version
203
+ ```
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
+
211
+ Las sesiones ya abiertas conservan el código cargado en memoria. Para aplicar la
212
+ nueva versión a una ciudad:
213
+
214
+ ```bash
215
+ agents-city exit home --dry-run
216
+ agents-city exit home
217
+ agents-city seat --city home
218
+ ```
219
+
220
+ Guarda primero cualquier trabajo activo: `exit` cierra todas las ventanas de esa
221
+ ciudad.
222
+
223
+ ### Desinstalar
224
+
225
+ ```bash
226
+ npm uninstall -g agents-city
227
+ ```
228
+
229
+ Esto elimina el programa instalado, pero **no** borra `~/.agents-city`, tus
230
+ ciudades, backups ni repos. Usa `agents-city reset` sólo cuando quieras reiniciar
231
+ una ciudad concreta.
232
+
233
+ ## Primer arranque, paso a paso
234
+
235
+ `agents-city seat` crea `home` si todavía no existe y hace siete preguntas.
236
+
237
+ ### 1. Dominio de trabajo
238
+
239
+ El dominio determina vocabulario, criterios de evidencia y roles sugeridos. Las
240
+ opciones incorporadas son:
241
+
242
+ | ID | Dominio |
243
+ |---|---|
244
+ | `software` | Desarrollo de software |
245
+ | `healthcare` | Salud y medicina |
246
+ | `legal` | Servicios legales |
247
+ | `finance` | Finanzas y operaciones |
248
+ | `marketing` | Marketing y crecimiento |
249
+ | `sales` | Ventas y customer success |
250
+ | `research` | Investigación y educación |
251
+ | `operations` | Operaciones y delivery |
252
+ | `custom` | Otro dominio, sin suponer una industria |
253
+
254
+ ### 2. Rol del asiento
255
+
256
+ Es la responsabilidad del jefe de esa ciudad, no el nombre de la ciudad ni el
257
+ motor. El asiento sigue siendo presidente aunque elijas `blank`.
258
+
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`.
292
+
293
+ ### 4. Objetivo
294
+
295
+ Un objetivo puede ser cuantitativo o cualitativo. Guarda:
296
+
297
+ - título;
298
+ - señal observada;
299
+ - comando que devuelve la medida, si existe;
300
+ - persona y frecuencia de juicio, si es cualitativo;
301
+ - baseline;
302
+ - target;
303
+ - fecha objetivo.
304
+
305
+ Puedes omitirlo y configurarlo después con `agents-city seat --goal`.
306
+
307
+ ### 5. Motor de tu propia silla
308
+
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.
314
+
315
+ La configuración persistente queda en la ficha del propietario. Los flags
316
+ `--model` y `--effort` de `seat` son overrides sólo para ese arranque.
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
+
353
+ ### Qué se crea
354
+
355
+ ```text
356
+ ~/.agents-city/
357
+ ├── .runtime/ # endpoints, colas y estado efímero del bus
358
+ ├── state/ # estado local del mapa, separado por ciudad
359
+ ├── .backups/ # migraciones antiguas
360
+ └── <propietario>/
361
+ ├── .current # ciudad seleccionada
362
+ ├── .backups/ # resets recuperables del propietario
363
+ └── <ciudad>/
364
+ ├── city.yml # id, nombre, slug, owner, dominio
365
+ ├── roads.json # carreteras permitidas
366
+ ├── <propietario>.md # rol, repos, roles, objetivo, motores
367
+ ├── AGENTS.md # cómo leer esta ciudad
368
+ ├── domains/ # conocimiento de dominio editable
369
+ ├── roles/ # conocimiento de roles editable
370
+ ├── deliberations/ # estados, eventos y actas del comité
371
+ ├── units.yml # barrios del mapa, si se usa
372
+ └── parcels.yml # casas/parcelas del mapa, si se usa
373
+ ```
374
+
375
+ El root `~/.agents-city` es un contenedor, nunca una ciudad. `home` es sólo la
376
+ primera ciudad y se aísla igual que `producto` o `cliente-a`.
377
+
378
+ ## Trabajar dentro de tmux
379
+
380
+ Una sesión se llama `<propietario>-<ciudad>` y contiene:
381
+
382
+ - ventana `seat`: asiento principal, situado en la carpeta de la ciudad;
383
+ - una ventana por repo encontrado localmente;
384
+ - el runtime configurado ya iniciado en cada ventana.
385
+
386
+ Atajos instalados sólo en el servidor tmux actual:
387
+
388
+ | Acción | Atajo |
389
+ |---|---|
390
+ | Cambiar a las ventanas 1–9 | `Alt+1` … `Alt+9` |
391
+ | Ventana anterior/siguiente | `Alt+←` / `Alt+→` |
392
+ | Seleccionar con ratón | clic en la barra inferior |
393
+ | Scroll | rueda del ratón |
394
+ | Separarse sin cerrar | `Ctrl-b`, después `d` |
395
+ | Volver a la ciudad | `agents-city seat --city <nombre>` |
396
+
397
+ Si la sesión ya existe, `seat` se vuelve a adjuntar: no crea otra ni duplica los
398
+ agentes. Una pestaña con campana o color de actividad indica que merece atención.
399
+
400
+ Claude se inicia de forma escalonada porque varias instancias comparten su token
401
+ OAuth. Codex, OpenCode y Kimi no esperan ese escalonado. Usa `CITY_SETTLE=0
402
+ CITY_STAGGER=0` sólo si quieres desactivarlo conscientemente.
403
+
404
+ No cierres una ciudad matando procesos genéricos. Usa:
405
+
406
+ ```bash
407
+ agents-city exit <ciudad> --dry-run
408
+ agents-city exit <ciudad>
409
+ ```
410
+
411
+ ## Motores y transportes
412
+
413
+ Todos reciben sobres del mismo bus WebSocket local, pero la última milla es
414
+ nativa para cada proveedor:
415
+
416
+ | Runtime | Entrega de tareas del bus | Interfaz visible | Requisito |
417
+ |---|---|---|---|
418
+ | Claude | `stream-json` persistente por stdin/stdout | gateway interactivo `city>` y transcripción visible de Claude | CLI `claude` autenticado; sin Team ni política admin |
419
+ | Codex | `app-server` WebSocket | TUI oficial conectada con `codex --remote` | CLI `codex` autenticado |
420
+ | OpenCode | API HTTP/SSE | consola interactiva `city>` del gateway | CLI `opencode` configurado |
421
+ | Kimi | REST + WebSocket | consola interactiva `city>` del gateway | CLI `kimi` o `kimi-code` configurado |
422
+ | CLI desconocida | adapter de compatibilidad | TUI/comando propio dentro de tmux | configuración `terminal:<comando>` |
423
+
424
+ Las tareas de Claude, Codex, OpenCode y Kimi **no** se pegan en tmux ni pasan por
425
+ el portapapeles. El fallback de terminal existe sólo para un comando desconocido
426
+ elegido explícitamente.
427
+
428
+ Agents City **no** usa Channels personalizados en el arranque normal de Claude.
429
+ El mismo proceso oficial de Claude Code permanece abierto en modo
430
+ print/streaming y recibe turnos JSONL directamente desde el gateway de la ciudad.
431
+ Por tanto, una cuenta personal Pro/Max no necesita `sudo`,
432
+ `managed-settings.json`, consola Team, allowlist de Channels, bypass de desarrollo
433
+ ni confirmaciones por ventana. El plugin instalado sigue aportando normalmente
434
+ sus herramientas MCP, skills y hooks. Los Channels personalizados quedan como un
435
+ mecanismo preview opcional de Anthropic, no como requisito de Agents City.
436
+
437
+ Ejemplo conceptual de una ficha multimodelo:
438
+
439
+ ```yaml
440
+ runs.seat: codex
441
+ runs.api: codex --model gpt-5
442
+ runs.analytics: opencode -m lmstudio/qwen3-coder
443
+ runs.research: kimi
444
+ runs.legacy: terminal:gemini
445
+ model.docs: sonnet
446
+ effort.docs: high
447
+ ```
448
+
449
+ Si el asiento no usa Claude, no tendrá comandos `/city:`. Todo lo fundamental
450
+ sigue disponible mediante `agents-city committee`, `road`, `bus`, `skills`,
451
+ `seat`, `reset` y `exit`.
452
+
453
+ ## Dominios, roles y conocimiento
454
+
455
+ ### Roles incorporados por dominio
456
+
457
+ | Dominio | IDs de rol disponibles |
458
+ |---|---|
459
+ | `software` | `cpto`, `dev`, `data-engineer`, `devops`, `data`, `product-design`, `po`, `llm-engineer`, `ai-manager`, `blank` |
460
+ | `healthcare` | `clinical-director`, `clinician`, `patient-safety`, `clinical-ops`, `health-data`, `health-compliance`, `blank` |
461
+ | `legal` | `managing-partner`, `associate`, `compliance`, `knowledge`, `ops`, `blank` |
462
+ | `finance` | `cfo`, `controller`, `fin-analytics`, `ops`, `compliance`, `blank` |
463
+ | `marketing` | `brand-lead`, `content`, `performance`, `seo`, `lifecycle`, `data`, `product-design`, `blank` |
464
+ | `sales` | `revenue-lead`, `account-executive`, `revops`, `customer-success`, `enablement`, `blank` |
465
+ | `research` | `research-director`, `researcher`, `methods`, `research-ops`, `ethics`, `knowledge`, `blank` |
466
+ | `operations` | `operations-lead`, `program-manager`, `process-owner`, `quality`, `knowledge`, `blank` |
467
+ | `custom` | `city-lead`, `specialist`, `quality`, `knowledge`, `blank` |
468
+
469
+ `blank` es una decisión completa: no crea fichero de rol, no aplica un perfil
470
+ oculto y no infiere una responsabilidad. Puede asignarse al asiento o a cualquier
471
+ repo y cambiarse más tarde.
472
+
473
+ Al seleccionar un dominio/rol, Agents City copia los packs iniciales a la ciudad:
474
+
475
+ ```text
476
+ domains/<dominio>.md
477
+ roles/<rol>.md
478
+ ```
479
+
480
+ Son Markdown normal. Puedes editar, quitar o ampliar su contenido. Un cambio de
481
+ rol posterior no sobrescribe un fichero existente, por lo que tus adaptaciones se
482
+ conservan. Este conocimiento no es una skill.
483
+
484
+ ## Referencia completa de comandos
485
+
486
+ ### Vista general
487
+
488
+ ```text
489
+ agents-city [hall]
490
+ agents-city setup
491
+ agents-city seat
492
+ agents-city cities
493
+ agents-city road
494
+ agents-city bus
495
+ agents-city committee
496
+ agents-city agents
497
+ agents-city skills
498
+ agents-city city
499
+ agents-city shortcut
500
+ agents-city demo
501
+ agents-city report
502
+ agents-city tokens
503
+ agents-city logs
504
+ agents-city benchmark
505
+ agents-city reset
506
+ agents-city exit
507
+ agents-city doctor
508
+ agents-city update
509
+ agents-city test
510
+ ```
511
+
512
+ Comandos globales:
513
+
514
+ ```bash
515
+ agents-city --help
516
+ agents-city --version
517
+ ```
518
+
519
+ ### `agents-city` y `agents-city hall`
520
+
521
+ Abren el Hall local de la ciudad seleccionada.
522
+
523
+ ```bash
524
+ agents-city
525
+ agents-city hall
526
+ agents-city hall --city producto
527
+ agents-city hall --no-browser
528
+ ```
529
+
530
+ | Opción | Efecto |
531
+ |---|---|
532
+ | `--city NAME|ID|PATH` | selecciona una ciudad conocida y abre esa |
533
+ | `--no-browser` | no abre navegador; imprime la URL local con su token temporal |
534
+
535
+ El servidor enlaza sólo `127.0.0.1` y exige un token por ejecución para cada
536
+ escritura. La columna **City live**, a la derecha, se conecta como observador al
537
+ mismo bus WebSocket local que usan los agentes. Muestra los mensajes visibles
538
+ normales de usuario/agente, fallos de runtime y todo el flujo moderado como una
539
+ conversación: un avatar por repo, el asiento marcado como presidente y un turno
540
+ visible por posición revelada o réplica concedida. Los comandos y el ruido de
541
+ ciclo de vida quedan ocultos tras **show work**; se abre por defecto la
542
+ conversación seleccionada.
543
+
544
+ El Hall abre directamente en **The map**. La ciudad ocupa todo el lienzo central: estado, controles e
545
+ historial permanecen en las barras laterales, nunca encima o debajo del mapa.
546
+ Cada turno semántico que entra por ese mismo WebSocket produce además un
547
+ bocadillo breve, anclado al personaje que habla y encabezado por su destino
548
+ (`Para seat:`, `Para committee:`, etc.). El bocadillo es sólo el resumen fugaz;
549
+ el mensaje completo y su evidencia siguen en **City live**. No se generan
550
+ diálogos de atrezo ni se muestran comandos, razonamiento privado o sobres crudos.
551
+
552
+ Codex usa los items visibles completados de app-server;
553
+ Claude, sus hooks documentados de prompt y stop. Los items de razonamiento,
554
+ chain-of-thought, credenciales y frames crudos de transporte no se muestran ni
555
+ se escriben en el registro de actividad. El token de observador rota con el hub,
556
+ sólo acepta un origen de este ordenador y es de sólo lectura: el navegador no
557
+ puede dirigir el comité. `Ctrl-c` detiene el Hall.
558
+
559
+ ### `agents-city setup`
560
+
561
+ Crea o selecciona una ciudad y abre el Hall; con `--tui` entrega el flujo a
562
+ `seat`.
563
+
564
+ ```bash
565
+ agents-city setup
566
+ agents-city setup --city producto
567
+ agents-city setup --city producto --tui
568
+ agents-city setup --out /ruta/a/una/ciudad
569
+ agents-city setup --demo
570
+ agents-city setup --no-browser
571
+ ```
572
+
573
+ | Opción | Efecto |
574
+ |---|---|
575
+ | `--city NOMBRE` | crea la ciudad gestionada si no existe o selecciona la existente |
576
+ | `--out RUTA` | registra/importa una carpeta explícita compatible; uso avanzado |
577
+ | `--demo` | abre la demo guiada completa de Aurora Games |
578
+ | `--tui` | usa onboarding de terminal y abre la sesión |
579
+ | `--no-browser` | mantiene el Hall en terminal e imprime su URL |
580
+
581
+ ### `agents-city seat`
582
+
583
+ Configura lo solicitado, garantiza tmux/plugin y abre o reanuda la sesión de la
584
+ ciudad.
585
+
586
+ ```bash
587
+ agents-city seat
588
+ agents-city seat --city producto
589
+ agents-city seat --repos
590
+ agents-city seat --agent-roles
591
+ agents-city seat --goal
592
+ agents-city seat --engines
593
+ agents-city seat --domain marketing
594
+ agents-city seat --domain marketing --role brand-lead
595
+ agents-city seat --role blank
596
+ agents-city seat --only api,web
597
+ agents-city seat --model sonnet --effort high
598
+ agents-city seat --seat-yolo on
599
+ agents-city seat --no-yolo --no-sync
600
+ ```
601
+
602
+ | Opción | Persistencia y efecto |
603
+ |---|---|
604
+ | `--city NAME|PATH` | selecciona esta ciudad y abre su sesión |
605
+ | `--repos` | vuelve a elegir repos y luego roles de esos agentes; persiste |
606
+ | `--agent-roles`, `--agents` | vuelve a elegir sólo el rol de cada repo; persiste |
607
+ | `--goal` | vuelve a definir el objetivo; persiste |
608
+ | `--engines` | elige runtime/modelo por ventana; persiste |
609
+ | `--domain DOMINIO` | cambia dominio; persiste y pide un rol compatible si no das `--role` |
610
+ | `--role ROL` | cambia el rol del asiento sin picker; persiste |
611
+ | `--only a,b` | abre sólo esos repos en esta sesión; no cambia la ficha |
612
+ | `--model ALIAS` | override de modelo para todas las ventanas de este arranque |
613
+ | `--effort LEVEL` | override `low`, `medium`, `high`, `xhigh` o `max` para este arranque |
614
+ | `--seat-yolo on\|off` | si el propio asiento corre sin preguntar permisos; persiste por ciudad (`seat_yolo` en `city.yml`, también la sexta pregunta del asistente). En local el asiento son las manos del dueño; las ventanas de repo conservan su propia historia de yolo/jaula |
615
+ | `--no-yolo` | desactiva autoaprobación en este arranque — asiento incluido, diga lo que diga `seat_yolo` |
616
+ | `--no-sync` | no hace `git fetch/pull` inicial en repos de este arranque |
617
+
618
+ `seat` acepta un usuario posicional por compatibilidad, pero sólo si coincide con
619
+ el propietario local resuelto. Para otra ciudad del mismo usuario usa `--city`.
620
+
621
+ ### `agents-city cities`
622
+
623
+ Gestiona el catálogo local. Crear o seleccionar no inicia tmux.
624
+
625
+ ```bash
626
+ agents-city cities list
627
+ agents-city cities current
628
+ agents-city cities create producto
629
+ agents-city cities use producto
630
+ agents-city cities use /ruta/a/ciudad
631
+ ```
632
+
633
+ | Subcomando | Salida/efecto |
634
+ |---|---|
635
+ | `list` | ciudades conocidas; `*` marca la seleccionada |
636
+ | `current` | ruta absoluta de la seleccionada |
637
+ | `create NOMBRE` | crea `~/.agents-city/<owner>/<slug>/` y la selecciona |
638
+ | `use NAME|PATH` | selecciona una ciudad existente sin arrancarla |
639
+
640
+ ### `agents-city road`
641
+
642
+ Abre y cierra la allowlist de conexiones entre asientos.
643
+
644
+ ```bash
645
+ agents-city road list producto
646
+ agents-city road connect producto cliente-a
647
+ agents-city road invite producto
648
+ agents-city road invite producto > producto.invitation.json
649
+ agents-city road connect producto research.invitation.json
650
+ agents-city road disconnect producto cliente-a
651
+ agents-city road disconnect producto <city-id-remoto>
652
+ ```
653
+
654
+ | Subcomando | Efecto |
655
+ |---|---|
656
+ | `list CIUDAD` | muestra destino, dirección y si es local/remoto |
657
+ | `connect A B` | si B es local, escribe ambos extremos simétricamente |
658
+ | `connect A invitation.json` | añade sólo el extremo local de una carretera remota |
659
+ | `invite CIUDAD` | imprime JSON público sin token |
660
+ | `disconnect A B|ID` | elimina ambos extremos locales o el id remoto indicado |
661
+
662
+ No se puede conectar una ciudad consigo misma. Una invitación remota debe
663
+ aceptarse de forma independiente en cada máquina.
664
+
665
+ ### `agents-city bus`
666
+
667
+ Opera mensajes entre asientos sobre carreteras ya declaradas.
668
+
669
+ ```bash
670
+ agents-city bus roster
671
+ agents-city bus inbox
672
+ agents-city bus send alice/research "Necesito confirmar el contrato del evento X"
673
+ agents-city bus send '*' "Aviso para todas mis carreteras"
674
+ ```
675
+
676
+ | Subcomando | Efecto |
677
+ |---|---|
678
+ | `roster` | devuelve carreteras y presencia online conocida |
679
+ | `inbox` | devuelve y consume el inbox pendiente; el historial append-only permanece |
680
+ | `send owner/city TEXTO` | envía a un destino permitido |
681
+ | `send '*' TEXTO` | envía a todas las carreteras; exige al menos una |
682
+
683
+ Sólo `seat` puede ejecutar estos comandos. Un actor de repo es rechazado por la
684
+ ACL aunque conozca la dirección.
685
+
686
+ ### `agents-city committee`
687
+
688
+ Gestiona deliberaciones estructuradas dentro de una ciudad. Todos los comandos
689
+ aceptan campos como flags o un objeto JSON con `--input`.
690
+
691
+ ```bash
692
+ agents-city committee list
693
+ agents-city committee history
694
+ agents-city committee show <deliberation-id>
695
+ agents-city committee status <deliberation-id> # alias de show
696
+ agents-city committee schema open
697
+ agents-city committee open --input proposal.json
698
+ agents-city committee open --input - < proposal.json
699
+ ```
700
+
701
+ | Subcomando | Actor permitido | Finalidad |
702
+ |---|---|---|
703
+ | `list` | cualquiera de la ciudad | deliberaciones abiertas |
704
+ | `history` | asiento | decisiones terminadas y recuento de contribuciones |
705
+ | `show ID`, `status ID` | actor implicado | estado y eventos visibles para esa identidad |
706
+ | `schema VERBO` | cualquiera | contrato JSON de un verbo de mutación |
707
+ | `open` | asiento | formula pregunta, resultado buscado, miembros y límites |
708
+ | `respond` | miembro invitado | registra una primera posición independiente |
709
+ | `synthesize` | asiento | publica acuerdos, conflictos e incógnitas |
710
+ | `floor-request` | miembro | pide turno por evidencia, contradicción, riesgo o dependencia |
711
+ | `floor-grant` | asiento | concede una petición de palabra |
712
+ | `floor-deny` | asiento | deniega una petición con motivo |
713
+ | `reply` | miembro con turno | hace una réplica acotada y basada en evidencia |
714
+ | `decide` | asiento | fija resultado, responsables, verificador y reapertura |
715
+ | `verify` | verificador asignado | devuelve `pass` o `fail` con pruebas |
716
+ | `replan` | asiento | reabre una verificación fallida con un plan nuevo |
717
+ | `close` | asiento | cierra un resultado ya verificado |
718
+ | `cancel` | asiento | cancela una deliberación explicando el motivo |
719
+
720
+ Ejemplo de apertura mediante flags:
721
+
722
+ ```bash
723
+ agents-city committee open \
724
+ --question "¿Debemos lanzar hoy?" \
725
+ --outcome-wanted "Una decisión reversible con dueño y verificación" \
726
+ --context "El release candidate ha pasado las pruebas locales" \
727
+ --constraint "No perder datos" \
728
+ --constraint "Poder volver atrás en diez minutos" \
729
+ --done "La decisión nombra ejecutor y verificador" \
730
+ --authority execute \
731
+ --member api \
732
+ --member web \
733
+ --member qa \
734
+ --max-rebuttals 1
735
+ ```
736
+
737
+ El resultado imprime un `deliberationId`. Guárdalo para los pasos siguientes.
738
+ Para payloads grandes es preferible JSON:
739
+
740
+ ```json
741
+ {
742
+ "question": "¿Debemos lanzar hoy?",
743
+ "desiredOutcome": "Una decisión reversible con dueño y verificación",
744
+ "context": "El release candidate ha pasado las pruebas locales",
745
+ "constraints": ["No perder datos", "Rollback en diez minutos"],
746
+ "definitionOfDone": ["Ejecutor y verificador asignados"],
747
+ "authority": "execute",
748
+ "participants": ["api", "web", "qa"],
749
+ "maxRebuttals": 1
750
+ }
751
+ ```
752
+
753
+ ```bash
754
+ agents-city committee open --input proposal.json
755
+ ```
756
+
757
+ `--input -` lee stdin. Si se mezclan JSON y flags, los flags explícitos
758
+ sobrescriben el campo equivalente. Los campos repetibles son `--member`,
759
+ `--constraint`, `--done`, `--evidence`, `--risk`, `--unknown`, `--agreement`,
760
+ `--conflict`, `--check`, `--residual-risk`, `--selected-evidence`,
761
+ `--rejected-option`, `--dissent`, `--reopen-if`, `--learning` y `--followup`.
762
+
763
+ Consulta siempre el contrato exacto disponible en la versión instalada:
764
+
765
+ ```bash
766
+ agents-city committee schema respond
767
+ agents-city committee schema decide
768
+ agents-city committee schema verify
769
+ ```
770
+
771
+ Los comandos de miembro (`respond`, `floor-request` y `reply`) se ejecutan
772
+ normalmente por el agente autenticado de ese repo cuando recibe el sobre. Si los
773
+ ejecutas desde el asiento, el rechazo de ACL es correcto: el bus no finge otra
774
+ identidad por aceptar un nombre como argumento.
775
+
776
+ ### `agents-city skills`
777
+
778
+ Muestra las skills que ya existen en los repos de una ciudad. Es una operación
779
+ sólo de lectura: no instala, copia, activa ni elimina nada.
780
+
781
+ ```bash
782
+ agents-city skills
783
+ agents-city skills producto
784
+ ```
785
+
786
+ Se reconocen estos layouts por repo:
787
+
788
+ ```text
789
+ SKILL.md
790
+ .claude/skills/*/SKILL.md
791
+ .codex/skills/*/SKILL.md
792
+ .agents/skills/*/SKILL.md
793
+ skills/*/SKILL.md
794
+ ```
795
+
796
+ La capacidad real de invocar una skill depende del runtime. Agents City la
797
+ anuncia como capacidad del miembro y deja al proveedor aplicar sus propias reglas
798
+ de descubrimiento y uso.
799
+
800
+ ### `agents-city agents`
801
+
802
+ Lista los agentes de esta ciudad y gestiona sobre qué trabaja cada uno. Los
803
+ montajes de un agente son symlinks dentro de su workspace, así que esto es el
804
+ equivalente en terminal de la fila **works on** del Hall y de la pregunta 3 del
805
+ asistente.
806
+
807
+ ```bash
808
+ agents-city agents list --card ~/.agents-city/alice/home/alice.md --data ~/.agents-city/alice/home
809
+ agents-city agents mounts --agent urgencias --data ~/.agents-city/alice/home
810
+ agents-city agents mount --agent urgencias --src ~/documentos/manual --data …
811
+ agents-city agents unmount --agent urgencias --name manual --data …
812
+ ```
813
+
814
+ | Comando | Efecto |
815
+ |---|---|
816
+ | `list` | cada agente: nombre, slug, rol, runtime, tipo, directorio de trabajo |
817
+ | `mounts` | los montajes de un agente, como etiqueta y destino real |
818
+ | `mount --src RUTA` | monta un repo, un worktree o una carpeta de documentos |
819
+ | `unmount --name ETIQUETA` | quita ese montaje; la carpeta en sí no se toca |
820
+ | `sync` / `sync-all` | reconstruye los workspaces desde la ficha, como hace el lanzador |
821
+
822
+ Desmontar quita un symlink y una clave de la ficha. Nunca borra aquello a lo que
823
+ apuntaba el enlace.
824
+
825
+ ### `agents-city city`
826
+
827
+ Abre el mapa local de una ciudad, sin arrancar una sesión de agentes.
828
+
829
+ ```bash
830
+ agents-city city
831
+ agents-city city ~/.agents-city/alice/producto
832
+ ```
833
+
834
+ Usa el puerto `8787` o el siguiente libre, enlaza en loopback y abre el
835
+ navegador. `Ctrl-c` detiene el servidor. `units.yml`, `parcels.yml`, la ficha y
836
+ el estado del bus alimentan la visualización.
837
+
838
+ El mapa está vivo, no es una postal. Tres capas escenifican lo que pasa AHORA,
839
+ todas derivadas de datos que el producto ya emite: la presencia (una casa en
840
+ mitad de un turno brilla y respira; una recién parada se enfría), el
841
+ ayuntamiento (las sesiones del comité se representan en escena — las posiciones
842
+ selladas llegan volando boca abajo, la palabra es una mano alzada, la
843
+ verificación estampa la puerta y el cierre archiva el acta — con la cámara
844
+ volando a la sesión y los miembros caminando hasta ella), y una puerta por
845
+ carretera, por la que salen las cartas hacia otras ciudades. Los agentes tienen
846
+ caras identicón deterministas, las parcelas `knowledge`/`coordinator` visten
847
+ una familia de edificios distinta de `code`, el ayuntamiento y las puertas son
848
+ clicables, `P` (o el control ⛶) alterna pantalla completa, y el rail en vivo
849
+ del Hall se redimensiona arrastrando su borde. El contrato completo está en
850
+ [docs/map-live-layers.md](docs/map-live-layers.md).
851
+
852
+ ### `agents-city shortcut`
853
+
854
+ Pone una ciudad en tu escritorio: su nombre, un icono coloreado a partir de su
855
+ propia identidad, y un doble clic que la abre.
856
+
857
+ ```bash
858
+ agents-city shortcut # la ciudad seleccionada
859
+ agents-city shortcut product # una concreta
860
+ agents-city shortcut --hall # una puerta que abre el mapa en vez del asiento
861
+ agents-city shortcut --remove # quitarlo del escritorio
862
+ agents-city shortcut --to ~/bin # escribirlo en otro sitio
863
+ ```
864
+
865
+ | Opción | Efecto |
866
+ |---|---|
867
+ | `--hall` | el acceso directo abre el mapa en el navegador en vez de la ciudad tmux |
868
+ | `--remove` | quita el acceso directo de esta ciudad |
869
+ | `--to DIR` | lo escribe en otra carpeta que no sea el escritorio |
870
+
871
+ Lo que se escribe depende del escritorio, y en cada uno es de verdad, no un
872
+ script disfrazado:
873
+
874
+ | Plataforma | Acceso directo | Icono |
875
+ |---|---|---|
876
+ | macOS | bundle `.app` que abre la ciudad en Terminal | `.icns`, construido con el `iconutil` del sistema |
877
+ | Linux | entrada `.desktop`, marcada como confiable donde hay `gio` | `.png` bajo `XDG_DATA_HOME` |
878
+ | Windows (WSL) | `.lnk` en el escritorio **de Windows**, que lanza `wsl.exe` | `.ico`, cuando hay interoperabilidad con PowerShell |
879
+
880
+ Todos ejecutan la misma línea que escribirías tú, así que el acceso directo es un
881
+ botón etiquetado sobre la puerta que ya existe, no una segunda forma de entrar. El
882
+ icono se genera sin ninguna librería de imagen: un PNG escrito a mano, envuelto
883
+ como `.ico` para Windows y convertido con `iconutil` en macOS.
884
+
885
+ En Windows la ciudad vive dentro de WSL, y un `~/Desktop` de ahí es el escritorio
886
+ del home de Linux que nadie mira: por eso el escritorio de Windows se le pregunta
887
+ a Windows, nunca se arma a partir del nombre de usuario, porque un escritorio
888
+ redirigido a OneDrive o a un perfil de dominio no está bajo
889
+ `C:\Users\<nombre>\Desktop`. Sin interoperabilidad se escribe un `.cmd` que
890
+ también se abre con doble clic: la misma puerta, con icono genérico.
891
+
892
+ ### `agents-city demo`
893
+
894
+ Abre una ciudad ficticia y desechable en el Hall completo. El centro contiene
895
+ el mapa; el lateral derecho reproduce una deliberación guiada y los mismos
896
+ turnos aparecen como bocadillos `Para …:` sobre sus agentes. Hay una demo por
897
+ dominio — caos real contado en palabras llanas, no en frases de programadores:
898
+
899
+ ```bash
900
+ agents-city demo # software · Aurora Games — la noche en que desaparecieron las partidas
901
+ agents-city demo --domain medicina # Clínica Alba — la mañana de las citas duplicadas
902
+ agents-city demo --domain legal # Costa & Ley — el plazo de mañana a las nueve
903
+ agents-city demo --no-browser
904
+ ```
905
+
906
+ No arranca modelos ni necesita cuentas de Claude, Codex, OpenCode o Kimi. Las
907
+ historias son presentación declarada, pero su ingeniería no es una animación:
908
+ los 22 eventos recorren el WebSocket autenticado, la máquina de estados del
909
+ comité, el registro durable y el feed de espectador reales. Cada historia
910
+ recorre la máquina ENTERA, incluida la parte que las demos suelen esconder:
911
+ tres posiciones aisladas, dos palabras concedidas por el asiento, una decisión,
912
+ una verificación que FALLA, un replanteo, y solo entonces un cierre verificado.
913
+ La clínica y el despacho son ciudades agents-first — agentes knowledge y
914
+ coordinator, sin repositorios — así que ejercitan además el roster y las
915
+ familias de edificios del mapa.
916
+
917
+ En las ciudades demo, el rail en vivo del Hall muestra el control enmarcado
918
+ **guided committee**: `⟳ replay` repite la historia del dominio, y `⏸ pause` /
919
+ `▶ resume` detienen y reanudan el propio proceso narrador (`SIGSTOP`, una
920
+ pausa de verdad). `/api/demo` rechaza cualquier ciudad que no sea una demo
921
+ empaquetada: el comité de una ciudad real es real, y repetirlo sería publicar
922
+ ficción en un bus real.
923
+
924
+ La demo copia su ciudad y su runtime a una carpeta temporal. `Ctrl-c` cierra su
925
+ Hall, mapa y hub y elimina esa copia; no selecciona, reescribe ni arranca tus
926
+ ciudades. Si ya hay otro mapa en `8787`, usa otro puerto y el Hall comprueba la
927
+ identidad para no incrustar accidentalmente la ciudad equivocada.
928
+
929
+ ### `agents-city report`
930
+
931
+ Calcula el crecimiento que puede representarse en el mapa y, opcionalmente, lo
932
+ envía al servicio de ciudad configurado.
933
+
934
+ ```bash
935
+ agents-city report
936
+ agents-city report --data ~/.agents-city/alice/producto
937
+ agents-city report --url https://city.example.com --token "$CITY_TOKEN"
938
+ agents-city report --push --quiet
939
+ ```
940
+
941
+ | Opción | Efecto |
942
+ |---|---|
943
+ | `--data RUTA` | usa otra carpeta de datos de ciudad |
944
+ | `--url URL` | sustituye la URL del servicio |
945
+ | `--token TOKEN` | sustituye el token de autenticación |
946
+ | `--push` | envía el informe; sin este flag sólo lo calcula/muestra |
947
+ | `--quiet` | reduce la salida humana |
948
+
949
+ ### `agents-city tokens`
950
+
951
+ Agrega consumo de transcripciones locales de Claude y puede enviar sólo los
952
+ totales. No envía prompts, respuestas ni rutas de ficheros.
953
+
954
+ ```bash
955
+ agents-city tokens
956
+ agents-city tokens --days 7
957
+ agents-city tokens --all
958
+ agents-city tokens --push --quiet
959
+ agents-city tokens --url https://city.example.com --token "$CITY_TOKEN"
960
+ ```
961
+
962
+ | Opción | Efecto |
963
+ |---|---|
964
+ | `--days N` | ventana temporal; por defecto 30 días |
965
+ | `--all` | relee las transcripciones dentro de `--days`, ignorando la caché incremental |
966
+ | `--url URL` | sustituye la URL del servicio |
967
+ | `--token TOKEN` | sustituye el token de autenticación |
968
+ | `--push` | envía agregados; sin este flag sólo los muestra |
969
+ | `--quiet` | reduce la salida humana |
970
+
971
+ `tokens` no estima automáticamente el consumo de Codex, OpenCode o Kimi.
972
+
973
+ ### `agents-city logs`
974
+
975
+ Lee los dos flujos locales persistentes de la ciudad seleccionada: actividad
976
+ semántica visible y diagnósticos operativos con secretos eliminados. No lee el
977
+ razonamiento del proveedor.
978
+
979
+ ```bash
980
+ agents-city logs
981
+ agents-city logs --activity --lines 50
982
+ agents-city logs --diagnostics --lines 200
983
+ agents-city logs --follow
984
+ agents-city logs --json --follow
985
+ ```
986
+
987
+ | Opción | Efecto |
988
+ |---|---|
989
+ | `--activity` | sólo prompts, respuestas, trabajo y actos de comité visibles |
990
+ | `--diagnostics` | sólo diagnósticos de hub, sockets, gateways, hooks y launchers |
991
+ | `-n, --lines N` | registros iniciales; por defecto 100 |
992
+ | `-f, --follow` | sigue mostrando registros nuevos hasta `Ctrl-c` |
993
+ | `--json` | emite los registros JSONL almacenados sin transformarlos |
994
+
995
+ Los ficheros están en el runtime privado de la ciudad como `activity.jsonl` y
996
+ `diagnostics.jsonl`. Sobreviven a recargar el Hall y reiniciar el bus, tienen
997
+ modo `0600` y se pueden inspeccionar directamente. Los IDs de origen hacen
998
+ idempotentes las notificaciones o hooks repetidos del proveedor.
999
+
1000
+ ### `agents-city benchmark`
1001
+
1002
+ Mide transporte, runtimes reales o la estructura del protocolo de comité.
1003
+
1004
+ #### Stress local, sin gastar cuota de modelos
1005
+
1006
+ ```bash
1007
+ agents-city benchmark stress
1008
+ agents-city benchmark stress --agents 40 --rounds 2 --timeout 20
1009
+ agents-city benchmark stress --agents 80 --rounds 5 --json
1010
+ agents-city benchmark stress --keep
1011
+ ```
1012
+
1013
+ | Opción | Efecto |
1014
+ |---|---|
1015
+ | `--agents N` | actores simulados; debe ser par, por defecto 40 |
1016
+ | `--rounds N` | rondas por actor; por defecto 2 |
1017
+ | `--timeout SEG` | límite del benchmark; por defecto 20 |
1018
+ | `--json` | salida legible por máquina |
1019
+ | `--keep` | conserva el workspace temporal para inspección |
1020
+
1021
+ #### Runtimes reales, con consumo de cuota
1022
+
1023
+ ```bash
1024
+ agents-city benchmark live --runtime claude --runtime codex
1025
+ agents-city benchmark live \
1026
+ --runtime codex \
1027
+ --runtime kimi \
1028
+ --timeout 180 \
1029
+ --json
1030
+ agents-city benchmark live \
1031
+ --command codex="codex --model gpt-5" \
1032
+ --command opencode="opencode -m lmstudio/qwen3-coder" \
1033
+ --keep
1034
+ ```
1035
+
1036
+ | Opción | Efecto |
1037
+ |---|---|
1038
+ | `--runtime RUNTIME` | runtime a medir; repetible: `claude`, `codex`, `kimi`, `opencode` |
1039
+ | `--command RUNTIME=COMANDO` | comando concreto para ese runtime; repetible |
1040
+ | `--timeout SEG` | límite de cada caso; por defecto 180 |
1041
+ | `--json` | salida legible por máquina |
1042
+ | `--no-save` | no guarda el resultado en el historial local |
1043
+ | `--keep` | conserva los workspaces temporales |
1044
+
1045
+ `live` hace llamadas reales a los proveedores instalados y puede consumir cuota
1046
+ o dinero. Comprueba autenticación y límites antes de lanzarlo.
1047
+
1048
+ #### Protocolo de comité
1049
+
1050
+ ```bash
1051
+ agents-city benchmark committee
1052
+ agents-city benchmark committee --json
1053
+ ```
1054
+
1055
+ Compara el flujo estructurado con un chat no acotado: barrera de respuestas,
1056
+ turnos, decisión y verificación. Es un benchmark estructural determinista; no
1057
+ demuestra por sí solo mayor calidad de respuesta ni una afirmación SOTA.
1058
+
1059
+ ### `agents-city reset`
1060
+
1061
+ Reinicia **una** ciudad gestionada conservando su identidad estable y sus repos.
1062
+
1063
+ ```bash
1064
+ agents-city reset producto --dry-run
1065
+ agents-city reset producto
1066
+ ```
1067
+
1068
+ El plan de reset:
1069
+
1070
+ 1. valida que el destino sea una ciudad gestionada, no una ruta arbitraria;
1071
+ 2. muestra y detiene sólo su sesión/runtime;
1072
+ 3. crea un backup recuperable bajo el propietario;
1073
+ 4. conserva `id`, propietario, nombre y slug;
1074
+ 5. elimina configuración, deliberaciones y estado generado de esa ciudad;
1075
+ 6. no toca los repos de código;
1076
+ 7. elimina simétricamente las carreteras locales incidentes;
1077
+ 8. deja la ciudad lista para repetir onboarding.
1078
+
1079
+ No existe todavía un comando automático `restore`; la ruta exacta del backup
1080
+ se imprime para una recuperación manual. Ejecuta siempre primero `--dry-run`.
1081
+
1082
+ ### `agents-city exit`
1083
+
1084
+ Detiene sesiones y procesos de Agents City; no borra configuración.
1085
+
1086
+ ```bash
1087
+ agents-city exit producto --dry-run
1088
+ agents-city exit producto
1089
+ agents-city exit --dry-run
1090
+ agents-city exit
1091
+ ```
1092
+
1093
+ Con una ciudad, cierra sólo su tmux, gateway y procesos auxiliares; el Hall puede
1094
+ seguir activo. Sin ciudad, muestra o cierra todo lo gestionado por Agents City.
1095
+ Una sesión tmux puede contener trabajo sin guardar, por lo que el dry-run es la
1096
+ forma segura de comprobar el alcance.
1097
+
1098
+ ### `agents-city doctor`
1099
+
1100
+ Revisa esta máquina y dice qué parte falta, en una pantalla.
1101
+
1102
+ ```bash
1103
+ agents-city doctor
1104
+ ```
1105
+
1106
+ Informa de las herramientas que necesita (python3, tmux, bash, git, node, y `gh`
1107
+ como opcional), qué runtimes de agente hay instalados, **qué jaula te da este
1108
+ kernel** —seatbelt, bubblewrap, o ninguna y por qué—, la ciudad seleccionada y su
1109
+ ficha, si el bundle del Hall está construido, y si hay una versión más nueva
1110
+ publicada. Sale con código distinto de cero cuando algo está roto, así que
1111
+ también sirve dentro de un script.
1112
+
1113
+ Si le pasas un fichero de configuración, conserva su trabajo anterior: detectar
1114
+ una forma antigua, explicarla y migrarla con `--fix` (dejando copia de
1115
+ seguridad).
1116
+
1117
+ ### `agents-city update`
1118
+
1119
+ ```bash
1120
+ agents-city update # instala la versión publicada más nueva
1121
+ agents-city update --check # sólo pregunta: instalada frente a publicada
1122
+ agents-city update --tag beta # sigue una dist-tag
1123
+ ```
1124
+
1125
+ La comprobación es **un GET al registro público de npm**, cacheado un día bajo
1126
+ `~/.agents-city/.runtime/`. No se envía nada de tu máquina —ni identificador, ni
1127
+ contador, ni telemetría— y `CITY_UPDATE_CHECK=0` lo desactiva por completo. Sólo
1128
+ ocurre donde has abierto algo deliberadamente: `doctor`, `update` y el Hall (que
1129
+ muestra una línea cuando hay versión nueva). Un `agents-city cities` normal no
1130
+ toca la red.
1131
+
1132
+ Si lo instalaste desde un checkout de git, `update` se niega y te dice el comando
1133
+ que encaja con tu instalación, en vez de ejecutar `npm install -g` sobre tu copia
1134
+ de trabajo.
1135
+
1136
+ ### `agents-city test`
1137
+
1138
+ Ejecuta la suite del checkout. Sin argumentos ejecuta todas las suites; con
1139
+ nombres ejecuta sólo las indicadas.
1140
+
1141
+ ```bash
1142
+ agents-city test
1143
+ agents-city test seat runtime-ui
1144
+ agents-city test committee stress benchmark
1145
+ ```
1146
+
1147
+ Suites disponibles:
1148
+
1149
+ ```text
1150
+ widgets card parcels domains serve seat cities channel committee live-feed
1151
+ runtime runtime-ui runtime-failures stress adapter benchmark contracts exit
1152
+ cage broker launch
1153
+ ```
1154
+
1155
+ Este comando está pensado para contribuidores o para validar un tarball local;
1156
+ una instalación de uso normal no necesita ejecutar los tests en cada arranque.
1157
+
1158
+ ## Comité: flujo completo
1159
+
1160
+ El comité está diseñado como un comité de dirección: el asiento formula la
1161
+ decisión y preside; los especialistas aportan evidencia desde sus repos; nadie
1162
+ abre una conversación lateral; el asiento integra y otra identidad verifica.
1163
+
1164
+ ```text
1165
+ open
1166
+ └─ collecting: posiciones independientes y ocultas
1167
+ ├─ faltan respuestas + proceedWithout ─┐
1168
+ └─ responden todos -> review │
1169
+ v
1170
+ synthesize
1171
+
1172
+ v
1173
+ deliberating
1174
+ ┌─ palabra acotada ─┐
1175
+ └─ floor request/reply ┘
1176
+
1177
+ decide
1178
+
1179
+ v
1180
+ verifying
1181
+ ┌─ fail ─└─ pass
1182
+ v v
1183
+ verification_failed verified
1184
+ │ │
1185
+ replan close
1186
+ │ │
1187
+ └─> review closed
1188
+ ```
1189
+
1190
+ ### 1. Preparar el brief
1191
+
1192
+ Una buena pregunta nombra una decisión, no un tema. El resultado deseado explica
1193
+ qué debe salir del comité; `definitionOfDone` contiene condiciones observables.
1194
+ Selecciona sólo repos capaces de aportar evidencia relevante.
1195
+
1196
+ | Campo de `open` | Obligatorio | Valores/semántica |
1197
+ |---|---|---|
1198
+ | `question` | sí | la decisión exacta |
1199
+ | `desiredOutcome` | sí | resultado concreto esperado |
1200
+ | `context` | no | hechos mínimos necesarios |
1201
+ | `constraints` | no | tiempo, coste, seguridad o política |
1202
+ | `definitionOfDone` | sí, lista | criterios observables de aceptación |
1203
+ | `authority` | no | `recommend`, `decide` o `execute`; por defecto `recommend` |
1204
+ | `participants` | sí, lista | nombres de actores repo de esa ciudad |
1205
+ | `maxRebuttals` | no | entero de 0 a 5; por defecto 2 por miembro |
1206
+
1207
+ `authority` documenta el mandato de la decisión; no cambia las ACL técnicas.
1208
+
1209
+ ### 2. Recoger posiciones aisladas
1210
+
1211
+ Cada participante recibe el mismo brief y responde una sola vez:
1212
+
1213
+ ```bash
1214
+ agents-city committee respond "$DELIBERATION_ID" \
1215
+ --stance conditional \
1216
+ --recommendation "Lanzar primero al 10 %" \
1217
+ --evidence "npm test: 844 comprobaciones correctas" \
1218
+ --expected-impact "Detectar regresiones antes del despliegue total" \
1219
+ --visible-when "Tras 30 minutos de telemetría" \
1220
+ --withdraw-if "La migración no es reversible" \
1221
+ --risk "Capacidad insuficiente durante el canary" \
1222
+ --unknown "Carga real de la primera hora"
1223
+ ```
1224
+
1225
+ `stance` debe ser `support`, `oppose`, `conditional` o `abstain`. `evidence` es
1226
+ obligatorio y repetible. La respuesta la ejecuta el runtime dentro de la ventana
1227
+ del repo, con su identidad real. Hasta alcanzar la barrera, el asiento ve el
1228
+ progreso, no el contenido de las primeras posiciones; esto reduce el anclaje.
1229
+
1230
+ ### 3. Sintetizar sin votar
1231
+
1232
+ Cuando todas las posiciones están listas, el asiento integra evidencia:
1233
+
1234
+ ```bash
1235
+ agents-city committee synthesize "$DELIBERATION_ID" \
1236
+ --summary "Existe acuerdo sobre un canary reversible" \
1237
+ --agreement "La migración debe tener rollback probado" \
1238
+ --conflict "10 % frente a 25 % de tráfico inicial" \
1239
+ --unknown "Capacidad bajo el pico previsto"
1240
+ ```
1241
+
1242
+ Si falta un miembro, no basta con ignorarlo:
1243
+
1244
+ ```bash
1245
+ agents-city committee synthesize "$DELIBERATION_ID" \
1246
+ --summary "Síntesis provisional" \
1247
+ --proceed-without "QA está offline; el límite vence hoy y conservamos rollback"
1248
+ ```
1249
+
1250
+ La decisión se basa en evidencia, impacto y condiciones de retirada, no en contar
1251
+ votos.
1252
+
1253
+ ### 4. Pedir y conceder la palabra
1254
+
1255
+ Después de la síntesis un miembro sólo puede replicar si presenta una base
1256
+ admitida:
1257
+
1258
+ ```bash
1259
+ agents-city committee floor-request "$DELIBERATION_ID" \
1260
+ --basis new_evidence \
1261
+ --reason "El canary falló en el test de rollback" \
1262
+ --evidence "artifacts/rollback.log: exit 1"
1263
+ ```
1264
+
1265
+ `basis` admite `new_evidence`, `contradiction`, `risk` o `dependency`. El asiento
1266
+ resuelve la petición usando el `requestId` devuelto:
1267
+
1268
+ ```bash
1269
+ agents-city committee floor-grant "$DELIBERATION_ID" --request-id "$REQUEST_ID"
1270
+ # o bien:
1271
+ agents-city committee floor-deny "$DELIBERATION_ID" \
1272
+ --request-id "$REQUEST_ID" \
1273
+ --reason "La evidencia ya forma parte de la síntesis"
1274
+ ```
1275
+
1276
+ Al concederse, ese miembro tiene exactamente una réplica y libera el turno al
1277
+ usarla:
1278
+
1279
+ ```bash
1280
+ agents-city committee reply "$DELIBERATION_ID" \
1281
+ --claim "No es seguro lanzar con el script actual" \
1282
+ --evidence "artifacts/rollback.log: exit 1" \
1283
+ --consequence "Bloquear hasta corregir y repetir rollback"
1284
+ ```
1285
+
1286
+ La réplica llega al asiento **y se oye en todo el comité**. Los demás miembros no
1287
+ contestan directamente: si uno detecta evidencia nueva, contradicción, riesgo o
1288
+ dependencia, pide otra vez la palabra al asiento. Éste concede o deniega y sólo
1289
+ entonces habla ese agente. Así hay conversación real entre especialistas, pero
1290
+ mediada como un comité de dirección, no un chat todos-contra-todos. No pueden
1291
+ coexistir dos turnos activos; cada concesión permite una sola intervención;
1292
+ `maxRebuttals` limita la cascada por miembro; y el asiento debe resolver todas las
1293
+ peticiones pendientes antes de decidir.
1294
+
1295
+ ### 5. Decidir y atribuir
1296
+
1297
+ ```bash
1298
+ agents-city committee decide "$DELIBERATION_ID" \
1299
+ --outcome "Corregir rollback y lanzar canary al 10 %" \
1300
+ --rationale "Reduce el radio de impacto y satisface el criterio reversible" \
1301
+ --owner "Responsable de release" \
1302
+ --executor api \
1303
+ --verifier qa \
1304
+ --verification-question "¿Rollback y canary pasan de extremo a extremo?" \
1305
+ --selected-evidence "suite completa verde" \
1306
+ --selected-evidence "fallo reproducible de rollback" \
1307
+ --decisive-contributors qa \
1308
+ --rejected-option "Lanzamiento total inmediato" \
1309
+ --dissent "web prefiere un canary del 25 %" \
1310
+ --reopen-if "errores 5xx > 1 % durante cinco minutos"
1311
+ ```
1312
+
1313
+ `selectedEvidence`, `decisiveContributors` y `reopenIf` son obligatorios. Si hay
1314
+ otra identidad disponible, `verifier` no puede ser el mismo actor que `executor`.
1315
+ La disensión se conserva en el acta aunque no cambie la decisión. Usa input JSON
1316
+ cuando debas registrar más de un contribuidor decisivo.
1317
+
1318
+ ### 6. Verificar, replanificar o cerrar
1319
+
1320
+ Sólo el verificador asignado puede ejecutar:
1321
+
1322
+ ```bash
1323
+ agents-city committee verify "$DELIBERATION_ID" \
1324
+ --result pass \
1325
+ --evidence "artifacts/e2e-rollback.txt" \
1326
+ --check "canary responde 200" \
1327
+ --check "rollback restaura la versión anterior" \
1328
+ --residual-risk "La primera hora a plena carga aún no está observada"
1329
+ ```
1330
+
1331
+ Con `fail`, el asiento debe replanificar y volver a sintetizar/decidir:
1332
+
1333
+ ```bash
1334
+ agents-city committee replan "$DELIBERATION_ID" \
1335
+ --reason "El rollback sigue dejando el esquema incompatible"
1336
+ ```
1337
+
1338
+ Con `pass`, el asiento puede cerrar:
1339
+
1340
+ ```bash
1341
+ agents-city committee close "$DELIBERATION_ID" \
1342
+ --summary "Canary verificado; despliegue autorizado" \
1343
+ --learning "Probar rollback antes de fijar la ventana de release" \
1344
+ --followup "Observar 5xx durante la primera hora"
1345
+ ```
1346
+
1347
+ Una deliberación no se puede cerrar sin verificación reproducible aprobada. Si
1348
+ deja de ser relevante, el asiento puede usar:
1349
+
1350
+ ```bash
1351
+ agents-city committee cancel "$DELIBERATION_ID" \
1352
+ --reason "El release fue sustituido por otro candidato"
1353
+ ```
1354
+
1355
+ Estados, eventos y acta legible quedan en `deliberations/`; `history` resume
1356
+ decisiones recientes y contribuciones decisivas para ayudar a detectar influencia
1357
+ repetida. Ese recuento es una señal de revisión, no una prueba automática de sesgo.
1358
+
1359
+ ## Comandos `/city:` de Claude
1360
+
1361
+ Estos comandos los aporta el plugin de Claude. No existen dentro de las TUI de
1362
+ Codex, OpenCode o Kimi; en ellas se usan los comandos `agents-city` equivalentes.
1363
+
1364
+ | Comando | Caso de uso |
1365
+ |---|---|
1366
+ | `/city:setup [--city N] [--tui] [--demo]` | crear/abrir una ciudad mediante el flujo compartido |
1367
+ | `/city:join [--domain D\|--role R\|--repos\|--agent-roles\|--goal\|--engines]` | nombre compatible para configurar el asiento; no añade otra persona |
1368
+ | `/city:session [--no-yolo] [--only a,b]` | abrir o reanudar el tmux de esta ciudad |
1369
+ | `/city:settings [domain\|role\|repos\|agent-roles\|goal\|engines\|roads\|skills]` | leer o cambiar una parte de la configuración |
1370
+ | `/city:goals` | mostrar o editar el objetivo actual |
1371
+ | `/city:committee PREGUNTA` | preparar y abrir una deliberación presidida |
1372
+ | `/city:committee status ID` | inspeccionar el siguiente paso legal de una deliberación |
1373
+ | `/city:round [--to owner/city] [--since FECHA]` | contrastar objetivo y evidencia local; consultar carreteras relevantes |
1374
+ | `/city:notice [--pr N\|--since REF] [--dry]` | avisar de un cambio verificado sólo a ciudades afectadas |
1375
+ | `/city:propose owner/city [ASUNTO]` | enviar una propuesta respaldada por evidencia |
1376
+ | `/city:team` | alias histórico: lista ciudades, ciudad activa, repos y carreteras; no personas |
1377
+ | `/city:exit [CIUDAD] [--dry-run]` | mostrar o cerrar procesos gestionados |
1378
+
1379
+ `/city:notice --dry` no envía nada. `/city:round` y `/city:propose` sólo pueden
1380
+ usar destinos presentes en `road list`. Una respuesta de otra ciudad informa al
1381
+ asiento; nunca adquiere autoridad para ordenar directamente a un repo local.
1382
+
1383
+ ## Recetario de casos de uso
1384
+
1385
+ ### Caso 1: empezar de cero con una ciudad y Claude
1386
+
1387
+ ```bash
1388
+ cd /ruta/al/checkout/agents-city
1389
+ npm pack
1390
+ npm install -g ./agents-city-*.tgz
1391
+ agents-city seat
1392
+ ```
1393
+
1394
+ 1. Elige el dominio.
1395
+ 2. Elige el rol del asiento.
1396
+ 3. Selecciona repos o continúa sin ninguno.
1397
+ 4. Define u omite el objetivo.
1398
+ 5. Pulsa Enter en motores para conservar Claude.
1399
+
1400
+ Resultado: ciudad `home`, sesión `<owner>-home`, una ventana `seat` y una por repo
1401
+ local seleccionado. Agents City mantiene un proceso oficial de Claude Code por
1402
+ ventana y lo alimenta mediante `stream-json` persistente; no solicita un Channel
1403
+ personalizado ni requiere aprobación admin o por ventana.
1404
+
1405
+ ### Caso 2: usar Codex como asiento principal
1406
+
1407
+ ```bash
1408
+ agents-city seat --engines
1409
+ ```
1410
+
1411
+ En la fila `seat`, elige Codex; confirma el resto y abre la ciudad. Agents City
1412
+ arranca `codex app-server` en loopback y abre la TUI oficial con
1413
+ `codex --remote`. La TUI crea su thread persistido; el gateway detecta sólo el
1414
+ thread nuevo de esa carpeta y se une mediante `thread/resume`. Debes poder
1415
+ escribir directamente en Codex. Un prompt `city>` en la ventana del asiento
1416
+ Codex indica una versión antigua o un arranque fallido; no es la interfaz
1417
+ prevista para Codex.
1418
+
1419
+ ### Caso 3: mezclar motores por repo
1420
+
1421
+ ```bash
1422
+ agents-city seat --city producto --engines
1423
+ ```
1424
+
1425
+ Ejemplo de selección:
1426
+
1427
+ ```text
1428
+ seat Codex
1429
+ api Claude / modelo opus / esfuerzo high
1430
+ web Codex
1431
+ analytics OpenCode
1432
+ research Kimi
1433
+ ```
1434
+
1435
+ Cada elección persiste en la ficha. La siguiente ejecución de `seat` reutiliza
1436
+ la configuración. Para probar otros motores sin mezclar procesos antiguos:
1437
+
1438
+ ```bash
1439
+ agents-city exit producto --dry-run
1440
+ agents-city exit producto
1441
+ agents-city seat --city producto --engines
1442
+ ```
1443
+
1444
+ ### Caso 4: usar un modelo local mediante OpenCode
1445
+
1446
+ Agents City no decide el proveedor de OpenCode. En el picker de motores, elige
1447
+ OpenCode e introduce el comando/modelo aceptado por tu instalación, por ejemplo:
1448
+
1449
+ ```text
1450
+ opencode -m lmstudio/qwen3-coder
1451
+ ```
1452
+
1453
+ Valida primero que el comando funciona solo:
1454
+
1455
+ ```bash
1456
+ opencode -m lmstudio/qwen3-coder
1457
+ ```
1458
+
1459
+ Después usa `agents-city seat --engines`. La entrega del bus llega por HTTP/SSE;
1460
+ el modelo puede ser local aunque Agents City siga usando el mismo sobre tipado.
1461
+
1462
+ ### Caso 5: usar una CLI todavía no integrada
1463
+
1464
+ Elige «otro comando (fallback de terminal)» en `--engines` e introduce, por
1465
+ ejemplo, `gemini`. Agents City lo guarda como:
1466
+
1467
+ ```yaml
1468
+ runs.api: terminal:gemini
1469
+ ```
1470
+
1471
+ El prefijo hace explícito que esa ventana puede necesitar inyección visible en
1472
+ tmux. Un comando desconocido sin `terminal:` se rechaza al leer una ficha editada
1473
+ a mano; no degrada silenciosamente el transporte de los runtimes conocidos.
1474
+
1475
+ ### Caso 6: crear varias ciudades del mismo usuario
1476
+
1477
+ ```bash
1478
+ agents-city cities create producto
1479
+ agents-city seat --city producto
1480
+
1481
+ agents-city cities create cliente-a
1482
+ agents-city seat --city cliente-a
1483
+
1484
+ agents-city cities list
1485
+ ```
1486
+
1487
+ Resultado esperado:
1488
+
1489
+ ```text
1490
+ ~/.agents-city/<owner>/producto/
1491
+ ~/.agents-city/<owner>/cliente-a/
1492
+ ```
1493
+
1494
+ Cada una tiene dominio, rol, objetivo, repos, skills reconocidas, deliberaciones,
1495
+ roads, runtime y sesión tmux propios. `home` no tiene ningún privilegio especial.
1496
+
1497
+ ### Caso 7: asignar a cada repo una especialidad distinta
1498
+
1499
+ ```bash
1500
+ agents-city seat --city producto --agent-roles
1501
+ ```
1502
+
1503
+ Puedes asignar `po` al repo principal, `seo` al portfolio y `data-engineer` al
1504
+ pipeline aunque el dominio del asiento sea `software`. El picker permite buscar
1505
+ roles de otros dominios. La especialidad modifica la perspectiva y el contexto
1506
+ editable; la autoridad técnica sigue siendo `member` para todos esos repos.
1507
+
1508
+ ### Caso 8: trabajar sin un perfil precargado
1509
+
1510
+ ```bash
1511
+ agents-city seat --city laboratorio --role blank
1512
+ agents-city seat --city laboratorio --agent-roles
1513
+ ```
1514
+
1515
+ Selecciona también `blank` en los repos que no deban recibir un perfil. No se crea
1516
+ un fichero de conocimiento de rol ni se infiere uno oculto. Las instrucciones del
1517
+ repo y sus skills siguen funcionando normalmente.
1518
+
1519
+ ### Caso 9: conectar dos ciudades locales
1520
+
1521
+ ```bash
1522
+ agents-city road connect producto cliente-a
1523
+ agents-city road list producto
1524
+ agents-city road list cliente-a
1525
+ ```
1526
+
1527
+ La carretera se escribe en ambos extremos. Arranca ambas ciudades y desde el
1528
+ asiento de una:
1529
+
1530
+ ```bash
1531
+ CITY_OWNER=alice
1532
+ AGENTS_CITY_DATA="$HOME/.agents-city/$CITY_OWNER/producto" \
1533
+ agents-city bus send "$CITY_OWNER/cliente-a" "¿Afecta este cambio a vuestro contrato?"
1534
+ ```
1535
+
1536
+ En una sesión normal no hace falta establecer `AGENTS_CITY_DATA`: ya está
1537
+ inyectado en cada ventana. El ejemplo lo hace explícito para una terminal externa.
1538
+
1539
+ ### Caso 10: conectar ciudades de dos máquinas o personas
1540
+
1541
+ En la máquina A:
1542
+
1543
+ ```bash
1544
+ agents-city road invite producto > producto.invitation.json
1545
+ ```
1546
+
1547
+ Transfiere ese JSON por un canal apropiado. No contiene el token del bus. En la
1548
+ máquina B:
1549
+
1550
+ ```bash
1551
+ agents-city road connect research producto.invitation.json
1552
+ agents-city road invite research > research.invitation.json
1553
+ ```
1554
+
1555
+ Devuelve la invitación de B y acéptala en A:
1556
+
1557
+ ```bash
1558
+ agents-city road connect producto research.invitation.json
1559
+ ```
1560
+
1561
+ Ambas máquinas necesitan el mismo transporte remoto compatible y credenciales
1562
+ válidas mediante `CITY_BUS_URL`/`CITY_BUS_TOKEN`. La invitación sólo declara la
1563
+ allowlist; no despliega infraestructura ni comparte secretos. Consulta
1564
+ [docs/self-host.md](docs/self-host.md) para el Worker remoto.
1565
+
1566
+ ### Caso 11: pedir una decisión a varios repos sin chat grupal
1567
+
1568
+ Desde el asiento Claude:
1569
+
1570
+ ```text
1571
+ /city:committee ¿Podemos activar la nueva migración en producción?
1572
+ ```
1573
+
1574
+ Desde cualquier otro runtime, prepara el brief y usa:
1575
+
1576
+ ```bash
1577
+ agents-city committee open --input migration-decision.json
1578
+ ```
1579
+
1580
+ El asiento selecciona sólo los repos relevantes. Cada primera respuesta queda
1581
+ aislada; después hay síntesis, peticiones de palabra, decisión atribuida y
1582
+ verificación. Usa `agents-city committee show ID` para ver el estado, no para
1583
+ saltarse el siguiente actor legal.
1584
+
1585
+ ### Caso 12: arrancar sólo uno o varios repos de una ciudad grande
1586
+
1587
+ ```bash
1588
+ agents-city seat --city producto --only api
1589
+ agents-city seat --city producto --only api,web
1590
+ ```
1591
+
1592
+ `--only` filtra ventanas para ese arranque; no elimina repos ni roles de la ficha.
1593
+ Si ya existe una sesión con otra composición, ciérrala de forma acotada antes:
1594
+
1595
+ ```bash
1596
+ agents-city exit producto --dry-run
1597
+ agents-city exit producto
1598
+ ```
1599
+
1600
+ ### Caso 13: seleccionar o clonar repos privados desde GitHub
1601
+
1602
+ ```bash
1603
+ agents-city seat --repos
1604
+ ```
1605
+
1606
+ Elige «mi cuenta GitHub» u «organización GitHub». Si `gh` falta, el asistente
1607
+ intenta instalarlo; si no hay sesión, abre `gh auth login --web`. El navegador o
1608
+ el código de dispositivo autentican `gh`, no Agents City. Los repos privados sólo
1609
+ aparecen si ese token tiene alcance. Un repo seleccionado pero no clonado puede
1610
+ quedar en la ficha sin ventana o clonarse, previa confirmación, bajo
1611
+ `CITY_CODE_DIR` (por defecto `~/codigo`).
1612
+
1613
+ ### Caso 14: inspeccionar skills sin instalarlas
1614
+
1615
+ ```bash
1616
+ agents-city skills producto
1617
+ ```
1618
+
1619
+ Si `api/.codex/skills/migraciones/SKILL.md` aparece, significa que el repo ya
1620
+ posee esa skill. Agents City no la copia a la ciudad ni la impone al agente. Al
1621
+ añadir, editar o quitar el `SKILL.md`, la siguiente lectura refleja el cambio sin
1622
+ reinstalar Agents City.
1623
+
1624
+ ### Caso 15: abrir sólo el mapa o la demo guiada
1625
+
1626
+ ```bash
1627
+ agents-city city ~/.agents-city/<owner>/producto
1628
+ agents-city demo
1629
+ ```
1630
+
1631
+ `city` representa datos reales de esa ciudad. `demo` abre el Hall completo de
1632
+ Aurora Games y reproduce agentes de presentación sobre la infraestructura real,
1633
+ sin invocar modelos. Si quieres administrar tus ciudades, usa `agents-city hall`.
1634
+
1635
+ ### Caso 16: medir rendimiento y detectar regresiones
1636
+
1637
+ Primero mide el bus de forma determinista y sin modelos:
1638
+
1639
+ ```bash
1640
+ agents-city benchmark stress --agents 40 --rounds 2 --json
1641
+ ```
1642
+
1643
+ Guarda el JSON como baseline. Después, si aceptas consumo de cuota, mide el camino
1644
+ real:
1645
+
1646
+ ```bash
1647
+ agents-city benchmark live \
1648
+ --runtime claude \
1649
+ --runtime codex \
1650
+ --runtime kimi \
1651
+ --timeout 180 \
1652
+ --json
1653
+ ```
1654
+
1655
+ Compara por separado aceptación bus→runtime y tiempo extremo a extremo. Una
1656
+ respuesta correcta del modelo no convierte una demora de transporte en «tiempo
1657
+ de razonamiento»; una autenticación fallida tampoco se cuenta como muestra rápida.
1658
+
1659
+ ### Caso 17: actualizar sin dejar sesiones con código antiguo
1660
+
1661
+ ```bash
1662
+ cd /ruta/al/checkout/agents-city
1663
+ npm pack
1664
+ npm install -g ./agents-city-*.tgz
1665
+ agents-city --version
1666
+ agents-city exit producto --dry-run
1667
+ agents-city exit producto
1668
+ agents-city seat --city producto
1669
+ ```
1670
+
1671
+ Instalar un tarball no reescribe procesos ya vivos. Reiniciar sólo la ciudad evita
1672
+ cerrar otra ciudad o un tmux ajeno.
1673
+
1674
+ ### Caso 18: borrar la configuración de una ciudad y repetir onboarding
1675
+
1676
+ ```bash
1677
+ agents-city reset laboratorio --dry-run
1678
+ agents-city reset laboratorio
1679
+ agents-city seat --city laboratorio
1680
+ ```
1681
+
1682
+ El reset mantiene la identidad de `laboratorio`, crea backup y no toca sus repos.
1683
+ Para borrar solamente procesos, usa `exit`, no `reset`.
1684
+
1685
+ ## Ficheros y variables de entorno
1686
+
1687
+ ### `city.yml`: identidad de la ciudad
1688
+
1689
+ Este fichero contiene la identidad estable y el dominio. No reutilices un `id`
1690
+ copiando la carpeta para crear otra ciudad; usa `cities create`.
1691
+
1692
+ ```yaml
1693
+ id: city_a1b2c3d4
1694
+ name: producto
1695
+ slug: producto
1696
+ owner: alice
1697
+ domain: software
1698
+ seat_yolo: 1
1699
+ ```
1700
+
1701
+ El address público se deriva como `owner/slug`; no se guarda como una identidad
1702
+ global del plugin porque varias ciudades pueden ejecutarse a la vez.
1703
+ `seat_yolo: 1` lanza el propio asiento sin preguntar permisos — se elige en la
1704
+ sexta pregunta del asistente o con `agents-city seat --seat-yolo on|off`;
1705
+ `--no-yolo` sigue frenando la sesión entera.
1706
+
1707
+ ### `<owner>.md`: ficha del asiento
1708
+
1709
+ Es Markdown con frontmatter. Contiene el rol del asiento, repos, rol de cada repo,
1710
+ objetivo y motor por ventana. Ejemplo reducido:
1711
+
1712
+ ```yaml
1713
+ ---
1714
+ user: alice
1715
+ name: alice
1716
+ role: cpto
1717
+ agent: alice-producto-cpto
1718
+ repos: [api, web, portfolio]
1719
+ role.api: data-engineer
1720
+ role.web: dev
1721
+ role.portfolio: seo
1722
+ goals_defined: true
1723
+ runs.seat: codex
1724
+ runs.api: claude
1725
+ model.api: opus
1726
+ effort.api: high
1727
+ runs.web: codex
1728
+ runs.portfolio: terminal:gemini
1729
+ ---
1730
+ ```
1731
+
1732
+ Los nombres tras el punto usan el actor normalizado de la ventana: minúsculas,
1733
+ números y guiones. Usa `seat --repos`, `--agent-roles`, `--goal` y `--engines`
1734
+ para mantener la ficha de forma segura. Una edición manual mal formada degrada el
1735
+ rol operativo a `blank` o puede impedir el arranque; no se evalúa como código.
1736
+
1737
+ El cuerpo de la ficha conserva el objetivo y el historial de rondas. Cambiar el
1738
+ objetivo reescribe sólo su sección, no ese historial.
1739
+
1740
+ ### Conocimiento editable
1741
+
1742
+ ```text
1743
+ domains/<domain>.md
1744
+ roles/<role>.md
1745
+ AGENTS.md
1746
+ ```
1747
+
1748
+ Los dos primeros nacen como perfiles iniciales y pasan a pertenecer a la ciudad.
1749
+ Puedes editarlos, reemplazarlos o quitarlos. Agents City no vuelve a sobrescribir
1750
+ un fichero existente durante un cambio de configuración. `AGENTS.md` explica a
1751
+ los runtimes cómo interpretar la ciudad; revísalo si haces una personalización
1752
+ profunda.
1753
+
1754
+ Las skills permanecen en los repos y son independientes de estos ficheros.
1755
+
1756
+ ### Estado de runtime
1757
+
1758
+ El hub local no mezcla datos efímeros con la configuración legible:
1759
+
1760
+ ```text
1761
+ ~/.agents-city/.runtime/bus/<city-id>/
1762
+ ├── endpoint.json
1763
+ ├── hub.lock
1764
+ ├── road-token
1765
+ ├── actors/*.json
1766
+ ├── outbox/<actor>/*.json
1767
+ ├── road-queue/*.json
1768
+ ├── road-inbox/*.json
1769
+ └── road-history.jsonl
1770
+ ```
1771
+
1772
+ Las credenciales y ficheros de runtime se crean con permisos privados. Los
1773
+ outboxes permiten que un actor se reconecte sin perder tareas ya aceptadas; el
1774
+ ACK elimina el pendiente. El límite actual es 200 pendientes por cola y 72 horas
1775
+ de vida por mensaje. `bus inbox` consume `road-inbox`, no el historial append-only.
1776
+
1777
+ ### Variables configurables
1778
+
1779
+ | Variable | Por defecto | Uso |
1780
+ |---|---|---|
1781
+ | `AGENTS_CITY_HOME` | `~/.agents-city` | raíz completa de datos y runtimes |
1782
+ | `AGENTS_CITY_USER` | identidad local resuelta | fuerza el propietario para pruebas/migraciones |
1783
+ | `AGENTS_CITY_DATA` | ciudad seleccionada | fuerza una carpeta de ciudad en una terminal externa |
1784
+ | `CITY_CODE_DIR` | `~/codigo` | destino de clones aceptados desde GitHub |
1785
+ | `CITY_SEARCH_IN` | raíces habituales del home | lista separada por `:` donde buscar repos locales |
1786
+ | `CITY_SEARCH_DEPTH` | `4` | profundidad máxima de esa búsqueda |
1787
+ | `AGENTS_CITY_ORG` | vacía | filtra repos por organización; vacía significa todos |
1788
+ | `CITY_SETTLE` | `8` | espera inicial, en segundos, para arrancar Claude |
1789
+ | `CITY_STAGGER` | `1` | separación adicional por ventana Claude |
1790
+ | `CITY_BUS_URL` | vacía | endpoint del bus remoto opcional |
1791
+ | `CITY_BUS_TOKEN` | vacía | credencial para ese transporte remoto/mapa |
1792
+ | `AGENTS_CITY_URL` | `CITY_BUS_URL` | endpoint de reporting/mapa si está separado |
1793
+ | `CITY_DIR` | `~/.claude/channels/city-bus` | carpeta de compatibilidad para `.env` y hooks |
1794
+ | `CITY_HOOKS` | `city` | `everywhere` ejecuta los hooks de conciencia en todas las sesiones de Claude, no solo en runtimes de ciudad |
1795
+ | `CITY_DESKTOP` | `~/Desktop`, o el escritorio de Windows bajo WSL | dónde escribe `agents-city shortcut` |
1796
+ | `CITY_CAGE` | `1` | `0` arranca todas las ventanas sin jaula |
1797
+ | `CITY_CAGE_DENY` | vacío | rutas extra que sellar, separadas por `:` |
1798
+ | `CITY_CAGE_ALLOW_WRITE` | vacío | rutas extra que mantener escribibles, separadas por `:` |
1799
+ | `CITY_UPDATE_CHECK` | `1` | `0` no pregunta nunca a npm si hay versión más nueva |
1800
+ | `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 |
1801
+
1802
+ Ejemplos:
1803
+
1804
+ ```bash
1805
+ CITY_SEARCH_IN="$HOME/clientes:$HOME/codigo" \
1806
+ CITY_SEARCH_DEPTH=6 \
1807
+ agents-city seat --repos
1808
+
1809
+ AGENTS_CITY_HOME="$(mktemp -d)" \
1810
+ AGENTS_CITY_USER=tester \
1811
+ agents-city cities create laboratorio
1812
+
1813
+ CITY_SETTLE=0 CITY_STAGGER=0 agents-city seat --city producto
1814
+ ```
1815
+
1816
+ El índice de repos locales se cachea un día en
1817
+ `$XDG_CACHE_HOME/agents-city/repos.tsv` o `~/.cache/agents-city/repos.tsv`. El Hall
1818
+ ofrece refrescarlo. Desde terminal, si cambias `CITY_SEARCH_IN` y la caché aún es
1819
+ válida, elimina **sólo ese fichero de índice** y repite `seat --repos`.
1820
+
1821
+ Para ajustes de transporte, el orden es:
1822
+
1823
+ 1. variable de entorno ya presente;
1824
+ 2. clave reconocida de `~/.claude/channels/city-bus/.env`;
1825
+ 3. sólo para el token en macOS, Keychain service `city@agents-city`.
1826
+
1827
+ La carga de `.env` admite únicamente claves conocidas y no puede redefinir
1828
+ `PATH`. Variables como `CITY_ADDRESS`, `CITY_BUS_ACTOR`, `CITY_RUNTIME_KIND` y
1829
+ `CITY_AGENT_ROLE` las inyecta la sesión para autenticar cada ventana; no deberías
1830
+ guardarlas como configuración global.
1831
+
1832
+ ## Seguridad y límites de confianza
1833
+
1834
+ - La conciencia del plugin se queda dentro de la ciudad: cada hook comprueba
1835
+ primero la identidad de ciudad (`CITY_BUS_ACTOR`) y calla en las sesiones
1836
+ normales de Claude — instalar el plugin no alista todas las conversaciones de
1837
+ la máquina. `CITY_HOOKS=everywhere` es el opt-in explícito a toda la máquina.
1838
+ - El hub de cada ciudad enlaza un puerto aleatorio en `127.0.0.1`; no se publica
1839
+ en la LAN.
1840
+ - Cada actor tiene token y rol propios. El asiento es `chair`; cada repo es
1841
+ `member`.
1842
+ - Los miembros no reciben credenciales de carretera, no pueden llamar a
1843
+ `road.send` y no tienen ruta miembro→miembro.
1844
+ - Sólo un sobre `seat -> seat` hacia una carretera declarada puede salir de una
1845
+ ciudad.
1846
+ - Una invitación contiene identidad/dirección, nunca el token remoto.
1847
+ - Los payloads de protocolo están limitados a 64 000 caracteres por campo de
1848
+ texto y los IDs/rutas se normalizan antes de usarse.
1849
+ - Los runtimes conocidos usan APIs nativas. Sólo `terminal:<command>` permite el
1850
+ fallback visible de tmux.
1851
+ - `report` y `tokens` son dry-run por defecto; enviar requiere `--push`.
1852
+ - `reset` y `exit` tienen `--dry-run`; el primero crea backup y ninguno debe
1853
+ tocar tmux ajenos.
1854
+
1855
+ ### La jaula, el broker y la cadena de auditoría
1856
+
1857
+ El modo yolo se queda — un comité no funciona si cada comando del bus necesita
1858
+ un humano — pero «no me preguntes» y «puedes tocarlo todo» son ejes distintos,
1859
+ y sólo el primero es yolo. En macOS las ventanas de repo de Claude, OpenCode y
1860
+ Kimi arrancan dentro de un perfil seatbelt generado: las escrituras caen sólo en su propio repo y su
1861
+ estado de runtime, y los ficheros que convierten una inyección de prompt en un
1862
+ robo de credenciales (`~/.ssh`, `~/.git-credentials`, `~/.aws`, configs de gh
1863
+ y de nube, tokens de carretera remota, y el propio
1864
+ `~/.claude/.credentials.json` de Claude Code) quedan sellados en el kernel — lecturas
1865
+ y escrituras, hijos y nietos incluidos. Al agente no se le pregunta nada: las
1866
+ rutas prohibidas sencillamente no existen para él. Codex usa en cambio su
1867
+ sandbox nativa `workspace-write` y no se envuelve en seatbelt: workers MCP como
1868
+ `node_repl` aplican su propia sandbox y macOS rechaza esa operación dentro de un
1869
+ proceso ya enjaulado. `CITY_CAGE=0` desactiva de forma deliberada la capa de
1870
+ confinamiento aplicable.
1871
+
1872
+ **En Linux la jaula es bubblewrap.** El sello se construye como se construye en
1873
+ Linux: un espacio de nombres de montaje donde las rutas selladas sencillamente
1874
+ no están montadas, así que dentro de la jaula `~/.ssh` es un directorio vacío y
1875
+ `~/.git-credentials` se lee como nada. La misma promesa que el seatbelt, con
1876
+ otro mecanismo, y `bin/test-cage.py` lo demuestra contra un espacio de nombres
1877
+ real en cada ejecución de CI en Linux: la clave plantada no se puede leer, el
1878
+ repo sigue siendo escribible, una escritura en un directorio sellado nunca llega
1879
+ al disco y un proceso nieto no se escapa.
1880
+
1881
+ Necesita `bubblewrap` instalado (`apt install bubblewrap`) y espacios de nombres
1882
+ de usuario sin privilegios habilitados — Agents City comprueba que bwrap puede
1883
+ crear uno de verdad en vez de fiarse de que exista el binario, y una máquina
1884
+ donde no pueda lo dice y arranca sin jaula, exactamente como antes. En otras
1885
+ plataformas no hay confinamiento: sin jaula, pon agentes sobre trabajo sobre el
1886
+ que te sentirías cómodo ejecutando un script.
1887
+
1888
+ Como una ventana enjaulada no puede leer el token de `gh`, los PRs y pushes
1889
+ pasan por un broker de credenciales opcional (`CITY_BROKER=1`): un proceso
1890
+ pequeño del lado del dueño que guarda las credenciales, acepta tokens por
1891
+ ventana atados a un único repo, rechaza cualquier acción sobre la rama por
1892
+ defecto y apunta cada petición — servida o rechazada — en un registro de
1893
+ auditoría encadenado por hashes que las ventanas no pueden tocar. Un byte
1894
+ reescrito rompe la cadena y `broker.py verify` lo dice. Las comprobaciones
1895
+ vivas contra el kernel y ambos caminos del broker, el feliz y el rechazado,
1896
+ corren en `bin/test-cage.py` y `bin/test-broker.py`. El modelo completo, sus
1897
+ diales y sus límites honestos están en [docs/security.md](docs/security.md).
1898
+
1899
+ Agents City aísla responsabilidades del protocolo, no crea una sandbox contra el
1900
+ propietario del sistema operativo. Otro proceso con tu mismo usuario puede leer
1901
+ tus repos, adjuntarse a tu tmux o leer ficheros privados de tu home. Para código
1902
+ no confiable usa cuentas/VMs/contenedores separados y aplica también los permisos
1903
+ del CLI de cada proveedor.
1904
+
1905
+ El bus remoto amplía la superficie de confianza. Despliega HTTPS/WSS, rota
1906
+ tokens, limita los scopes y revisa [docs/self-host.md](docs/self-host.md). Una
1907
+ carretera autoriza intercambio de mensajes entre asientos; no implica confianza
1908
+ para ejecutar comandos recibidos ni acceso al filesystem remoto.
1909
+
1910
+ ## Resolución de problemas
1911
+
1912
+ ### `agents-city seat` vuelve a una sesión que ya estaba abierta
1913
+
1914
+ Es el comportamiento normal. El nombre tmux es estable por propietario/ciudad.
1915
+ Separa la interfaz con `Ctrl-b d` o inspecciona antes de cerrarla:
1916
+
1917
+ ```bash
1918
+ agents-city exit <ciudad> --dry-run
1919
+ ```
1920
+
1921
+ ### He actualizado el paquete pero sigo viendo el comportamiento anterior
1922
+
1923
+ Un npm global nuevo no sustituye procesos vivos ni sesiones tmux. Comprueba qué
1924
+ binario ejecutas y reinicia sólo la ciudad:
1925
+
1926
+ ```bash
1927
+ type -a agents-city
1928
+ agents-city --version
1929
+ npm root -g
1930
+ agents-city exit <ciudad> --dry-run
1931
+ agents-city exit <ciudad>
1932
+ agents-city seat --city <ciudad>
1933
+ ```
1934
+
1935
+ Con `fnm`, `nvm` o `asdf`, cada versión de Node puede tener sus propios paquetes
1936
+ globales. Instala el tarball con la misma versión de Node desde la que ejecutarás
1937
+ `agents-city`.
1938
+
1939
+ ### Codex muestra `city>` en vez de su TUI
1940
+
1941
+ Codex debe mostrar su TUI oficial. Verifica una versión que soporte
1942
+ `app-server`/`--remote`, actualiza Agents City y reinicia la ciudad. Los logs
1943
+ previos al arranque deben incluir el endpoint WebSocket, la espera del thread de
1944
+ la TUI, `Codex TUI thread ... adopted over WebSocket` y la autenticación en el
1945
+ bus. Tras el primer turno aparecerá también `joined over WebSocket`. `city>` sí
1946
+ es actualmente la consola esperada para OpenCode y Kimi.
1947
+
1948
+ Si aparece `Failed to resume session ... no rollout found`, estás ejecutando la
1949
+ ruta defectuosa de `0.3.0-beta.10`, que intentaba abrir un thread recién creado
1950
+ con `codex resume --remote`. `0.3.0-beta.11` ya abría la TUI correcta, pero podía
1951
+ esperar indefinidamente a que un thread vacío materializara su primer rollout.
1952
+ Instala `0.3.0-beta.21` o posterior y reinicia sólo
1953
+ esa ciudad con `agents-city exit <ciudad>` seguido de `agents-city seat --city
1954
+ <ciudad>`.
1955
+
1956
+ ### Aparece `fatal: not a git repository` en la ventana `seat`
1957
+
1958
+ La ventana `seat` vive en la carpeta de datos de la ciudad, que no tiene por qué
1959
+ ser un repo. Las versiones actuales omiten el sync allí. Ese error antes de abrir
1960
+ Codex suele significar que la sesión sigue ejecutando un launcher antiguo:
1961
+ actualiza, usa `exit <ciudad>` y vuelve a abrirla. Un repo real sin `.git` sí debe
1962
+ revisarse por separado.
1963
+
1964
+ ### Claude dice que el plugin no está en la allowlist de Channels
1965
+
1966
+ Agents City `0.3.0-beta.21` y posteriores no arrancan Claude con `--channels`.
1967
+ Ese mensaje identifica una sesión viva antigua o un Channel lanzado manualmente,
1968
+ no una configuración ausente de la cuenta personal. **No** crees un fichero de
1969
+ managed settings de máquina ni uses `sudo`. Actualiza Agents City, comprueba la
1970
+ versión y reinicia sólo la ciudad afectada con `agents-city exit <ciudad>` y
1971
+ `agents-city seat --city <ciudad>`. El log normal debe mostrar
1972
+ `Claude Code ready over persistent stream-json` y `claude-stream-json ready`.
1973
+
1974
+ ### Claude muestra `Claude API` o pide usage credits con una cuenta Team/Max
1975
+
1976
+ Un `CLAUDE_CODE_OAUTH_TOKEN`, API key, gateway URL o selector de Bedrock,
1977
+ Vertex o Foundry heredado puede tener prioridad sobre el login sano de
1978
+ Claude.ai guardado por el CLI. Inspecciona sólo los nombres; nunca imprimas los
1979
+ valores de las credenciales:
1980
+
1981
+ ```bash
1982
+ claude auth status
1983
+ tmux show-environment -g | cut -d= -f1 | \
1984
+ grep -E 'CLAUDE_CODE_OAUTH_TOKEN|ANTHROPIC_(API_KEY|AUTH_TOKEN|BASE_URL)|CLAUDE_CODE_USE_'
1985
+ env -u CLAUDE_CODE_OAUTH_TOKEN \
1986
+ -u ANTHROPIC_API_KEY -u ANTHROPIC_AUTH_TOKEN -u ANTHROPIC_BASE_URL \
1987
+ -u CLAUDE_CODE_USE_BEDROCK -u CLAUDE_CODE_USE_VERTEX \
1988
+ -u CLAUDE_CODE_USE_FOUNDRY claude auth status
1989
+ ```
1990
+
1991
+ Si el último comando devuelve `authMethod: claude.ai`, Agents City usa ese
1992
+ login y quita únicamente esos overrides de cada proceso hijo nuevo. Nunca borra
1993
+ un token, hace logout ni reescribe el almacén de credenciales. Tras actualizar,
1994
+ reinicia sólo esa ciudad. Para usar intencionadamente autenticación por entorno/API:
1995
+
1996
+ ```bash
1997
+ CITY_CLAUDE_AUTH=environment agents-city seat --city <ciudad>
1998
+ ```
1999
+
2000
+ ### Las herramientas de Codex fallan con `sandbox_apply: Operation not permitted`
2001
+
2002
+ Es el fallo de sandbox anidada de macOS: un launcher antiguo metía la sandbox de
2003
+ Codex (o la de un worker MCP) dentro de la jaula seatbelt de la ciudad. Instala
2004
+ la beta actual y reinicia sólo la ciudad afectada. Codex arranca ahora sin la
2005
+ jaula exterior y mantiene su confinamiento nativo `workspace-write`, así puede
2006
+ leer el repo y usar herramientas sin un `sandbox_apply` anidado.
2007
+
2008
+ ### Codex avisa de que falta el ejecutable de un MCP
2009
+
2010
+ Codex hereda tu registro MCP global. Agents City lo comprueba sin imprimir los
2011
+ valores de su entorno. Si un MCP stdio habilitado apunta a un ejecutable que se
2012
+ puede demostrar que no existe, se deshabilita sólo para ese proceso de ciudad;
2013
+ no se modifica `~/.codex/config.toml` y los MCP sanos siguen activos. Puedes ver
2014
+ la decisión acotada con:
2015
+
2016
+ ```bash
2017
+ agents-city logs --diagnostics | grep codex.mcp.unavailable.disabled
2018
+ ```
2019
+
2020
+ Después puedes reparar o borrar la entrada global original con `codex mcp`. Un
2021
+ fallo de URL u otro error de arranque incierto se deja visible en vez de
2022
+ ocultarlo por conjetura.
2023
+
2024
+ ### Parece que se pega texto o un JSON en una ventana
2025
+
2026
+ Claude, Codex, OpenCode y Kimi no usan portapapeles ni `tmux paste`. Comprueba la
2027
+ ficha:
2028
+
2029
+ ```bash
2030
+ agents-city seat --engines
2031
+ ```
2032
+
2033
+ Si la fila está configurada como `terminal:<command>`, has elegido el adapter de
2034
+ compatibilidad y la inyección visible es esperada. Si un runtime conocido aparece
2035
+ así, vuelve a seleccionarlo por su nombre nativo.
2036
+
2037
+ ### Una ventana Claude muestra un comando acabado en `--da`, `--dangerously` o `-`
2038
+
2039
+ Es un comando de arranque antiguo truncado, no un mensaje de Claude ni del
2040
+ WebSocket. Las versiones actuales guardan el comando completo en un launcher
2041
+ privado y auditado, y escriben en tmux únicamente su ruta corta. Actualiza el
2042
+ paquete y reinicia sólo esa ciudad:
2043
+
2044
+ ```bash
2045
+ agents-city --version
2046
+ agents-city exit <ciudad> --dry-run
2047
+ agents-city exit <ciudad>
2048
+ agents-city seat --city <ciudad>
2049
+ agents-city logs --diagnostics --follow
2050
+ ```
2051
+
2052
+ Si el launcher falla registra `launch.failed`, imprime en el panel el código de
2053
+ salida y la ruta del log, y envía `runtime.launch.failed` a City live. Nunca
2054
+ guarda el comando completo ni las credenciales.
2055
+
2056
+ ### No aparecen mis repos
2057
+
2058
+ ```bash
2059
+ command -v git
2060
+ git -C /ruta/al/repo remote get-url origin
2061
+ CITY_SEARCH_IN="/ruta/raiz1:/ruta/raiz2" \
2062
+ CITY_SEARCH_DEPTH=6 \
2063
+ agents-city seat --repos
2064
+ ```
2065
+
2066
+ La detección exige `.git` (directorio o fichero de worktree) y un remote `origin`.
2067
+ Si acabas de cambiar las raíces, refresca desde el Hall o elimina exclusivamente
2068
+ `~/.cache/agents-city/repos.tsv`. `AGENTS_CITY_ORG` puede estar filtrando el repo;
2069
+ déjala vacía para indexar todos los remotes.
2070
+
2071
+ ### GitHub no muestra repos privados u organizaciones
2072
+
2073
+ ```bash
2074
+ gh auth status
2075
+ gh api user --jq .login
2076
+ gh auth refresh -s read:org
2077
+ ```
2078
+
2079
+ Comprueba primero el acceso directamente con `gh`; Agents City sólo consume esa
2080
+ sesión. Para una organización con SSO puede ser necesario autorizar el token en
2081
+ GitHub. Siempre puedes elegir repos del disco sin OAuth.
2082
+
2083
+ ### Un repo de la ficha no abre ventana
2084
+
2085
+ La ficha puede referenciar un repo que no está clonado. Ejecuta `seat --repos` y
2086
+ acepta clonarlo o clónalo manualmente dentro de una raíz indexada. Si dos nombres
2087
+ se normalizan al mismo actor (por ejemplo, diferencias sólo en símbolos), Agents
2088
+ City rechaza la colisión en vez de mezclar credenciales.
2089
+
2090
+ ### El bus dice que ya está arrancando o ejecutándose
2091
+
2092
+ No borres locks mientras el proceso esté vivo. Inspecciona el alcance:
2093
+
2094
+ ```bash
2095
+ agents-city exit <ciudad> --dry-run
2096
+ ```
2097
+
2098
+ Si la sesión esperada existe, vuelve con `seat`. Si es un proceso huérfano
2099
+ gestionado, `exit <ciudad>` lo cierra. El hub recupera por sí solo un lock cuyo PID
2100
+ ya no existe; un lock recién creado se conserva para evitar dos hubs simultáneos.
2101
+
2102
+ ### Un agente estaba offline cuando llegó una tarea
2103
+
2104
+ Los sobres internos aceptados quedan en su outbox hasta ACK, con TTL de 72 horas.
2105
+ Reabre la misma ciudad/runtime para drenar la cola. Si el proveedor rechazó la
2106
+ tarea, la entrega queda como fallo y no se inventa un ACK. Usa los logs y el
2107
+ benchmark de runtime para separar rechazo nativo, autenticación y latencia.
2108
+
2109
+ ### Una carretera local existe pero el destino aparece offline
2110
+
2111
+ `road connect` configura alcance; no arranca la otra ciudad. Abre ambas sesiones:
2112
+
2113
+ ```bash
2114
+ agents-city seat --city origen
2115
+ agents-city seat --city destino
2116
+ ```
2117
+
2118
+ Una carretera remota necesita además `CITY_BUS_URL` y `CITY_BUS_TOKEN` válidos en
2119
+ los dos extremos. Que el mensaje quede en cola no significa que el destino lo
2120
+ haya aceptado ni que esté de acuerdo.
2121
+
2122
+ ### El comité rechaza mi comando
2123
+
2124
+ Primero mira el estado y el schema:
2125
+
2126
+ ```bash
2127
+ agents-city committee show <id>
2128
+ agents-city committee schema <verbo>
2129
+ ```
2130
+
2131
+ Los rechazos más comunes son correctos por diseño: el asiento intenta responder
2132
+ como miembro, un miembro intenta decidir, falta una posición sin
2133
+ `--proceed-without`, queda una petición de palabra pendiente, el verificador es el
2134
+ ejecutor pudiendo elegir otro, o se intenta cerrar antes de `pass`.
2135
+
2136
+ ### Quiero empezar de cero
2137
+
2138
+ No borres `~/.agents-city` entero si sólo falla una ciudad:
2139
+
2140
+ ```bash
2141
+ agents-city reset <ciudad> --dry-run
2142
+ agents-city reset <ciudad>
2143
+ agents-city seat --city <ciudad>
2144
+ ```
2145
+
2146
+ La salida indica el backup. Si sólo quieres reiniciar procesos, usa `exit`.
2147
+
2148
+ ## Desarrollo y pruebas
2149
+
2150
+ ### Validación completa
2151
+
2152
+ ```bash
2153
+ git clone https://github.com/jlcases/agents-city.git
2154
+ cd agents-city
2155
+ npm install
2156
+ npm test
2157
+ ```
2158
+
2159
+ `npm test` ejecuta `./bin/test`: suites Python/shell, buses y runtimes nativos con
2160
+ dobles deterministas, un tmux desechable sólo para el fallback desconocido,
2161
+ stress de 40 actores, contratos cruzados y la allowlist del tarball. La ejecución
2162
+ por defecto es offline y usa homes/repos temporales.
2163
+
2164
+ Pruebas enfocadas:
2165
+
2166
+ ```bash
2167
+ ./bin/test seat runtime-ui
2168
+ ./bin/test channel committee runtime runtime-failures
2169
+ ./bin/test stress benchmark contracts exit
2170
+ ```
2171
+
2172
+ ### Typecheck y bundles
2173
+
2174
+ ```bash
2175
+ cd city/web
2176
+ npm run typecheck
2177
+ npm run build
2178
+
2179
+ cd ../../plugin/channel
2180
+ npm run typecheck
2181
+ npm run build
2182
+ ```
2183
+
2184
+ El JavaScript generado de `plugin/channel` sí se publica. Cambiar TypeScript sin
2185
+ reconstruir deja el tarball ejecutando código anterior.
2186
+
2187
+ ### Validar el paquete exacto sin publicarlo
2188
+
2189
+ ```bash
2190
+ npm pack --dry-run
2191
+ npm pack
2192
+
2193
+ CITY_TEST_PREFIX="$(mktemp -d)"
2194
+ npm install -g --prefix "$CITY_TEST_PREFIX" ./agents-city-*.tgz
2195
+ "$CITY_TEST_PREFIX/bin/agents-city" --version
2196
+ "$CITY_TEST_PREFIX/bin/agents-city" --help
2197
+ ```
2198
+
2199
+ Para pruebas de onboarding, añade un `HOME`, `AGENTS_CITY_HOME` y
2200
+ `AGENTS_CITY_USER` temporales. No apuntes una suite a tus ciudades reales.
2201
+
2202
+ La matriz y los invariantes completos están en [docs/testing.md](docs/testing.md).
2203
+ Los benchmarks tienen guías propias en
2204
+ [benchmarks/stress/README.md](benchmarks/stress/README.md),
2205
+ [benchmarks/latency/README.md](benchmarks/latency/README.md) y
2206
+ [benchmarks/committee/README.md](benchmarks/committee/README.md).
2207
+
2208
+ ## Ediciones, licencia y confianza
2209
+
2210
+ Este repositorio es la **Community Edition**, con licencia
2211
+ [Apache-2.0](LICENSE): libre de usar, modificar, self-hostear y construir
2212
+ encima, con concesión explícita de patentes. La licencia no concede derechos
2213
+ sobre el nombre *Agents City* — el código viaja, el nombre se queda.
2214
+
2215
+ Existe una **Enterprise Edition** sobre este mismo core: memoria semántica de
2216
+ la ciudad (búsqueda vectorial sobre actas, avisos y deliberaciones), SSO,
2217
+ auditoría entre ciudades y gestión de flota. No está en este repositorio.
2218
+ Agents City lo construye [Arkatai](https://arkatai.com), estudio de
2219
+ desarrollos agénticos — para la Enterprise Edition escribe a
2220
+ <hello@arkatai.com> o abre un issue con la etiqueta `enterprise`.
2221
+
2222
+ **Sin telemetría.** El producto no llama a casa de nadie: todo corre en
2223
+ loopback y ficheros locales, y nada de tu trabajo sale de tu máquina salvo lo
2224
+ que tú configures — una carretera remota o un `--push` a tu propio worker. La
2225
+ única petición a terceros de las páginas web es la carga de sus tipografías
2226
+ desde Google Fonts.