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.md ADDED
@@ -0,0 +1,2196 @@
1
+ # Agents City
2
+
3
+ [Español](README.es.md) · [English](README.md)
4
+
5
+ **Run several autonomous agent cities on one machine, and connect only the
6
+ cities that should talk.**
7
+
8
+ ```bash
9
+ npm install -g agents-city
10
+ agents-city
11
+ ```
12
+
13
+ That is the whole installation. The second command opens the town hall in your
14
+ browser and walks you through creating your first city.
15
+
16
+ Agents City is a local-first, multi-model orchestrator for repository work. Each
17
+ city has its own identity, domain, chair seat, goal, repo support agents,
18
+ editable knowledge, live-recognised skills, and explicit roads to other cities.
19
+ It does not turn every agent into a group chat: the seat chairs the process,
20
+ selects specialists, and controls the floor.
21
+
22
+ This is the complete guide. If you only want to try it, go to
23
+ [Quick start](#quick-start).
24
+
25
+ ## Contents
26
+
27
+ - [Mental model](#mental-model)
28
+ - [Quick start](#quick-start)
29
+ - [Requirements and installation](#requirements-and-installation)
30
+ - [First run, step by step](#first-run-step-by-step)
31
+ - [Working inside tmux](#working-inside-tmux)
32
+ - [Runtimes and transports](#runtimes-and-transports)
33
+ - [Domains, roles, and knowledge](#domains-roles-and-knowledge)
34
+ - [Complete command reference](#complete-command-reference)
35
+ - [Committee: complete workflow](#committee-complete-workflow)
36
+ - [Claude `/city:` commands](#claude-city-commands)
37
+ - [Use-case cookbook](#use-case-cookbook)
38
+ - [Files and environment variables](#files-and-environment-variables)
39
+ - [Security and trust boundaries](#security-and-trust-boundaries)
40
+ - [Troubleshooting](#troubleshooting)
41
+ - [Development and testing](#development-and-testing)
42
+
43
+ ## Mental model
44
+
45
+ A city is not an account, a remote person, or a free-form collection of bots. It
46
+ is one autonomous work domain owned by a local person:
47
+
48
+ ```text
49
+ local user
50
+ ├── home city
51
+ │ ├── stable identity: owner/home
52
+ │ ├── domain + seat role + goal
53
+ │ ├── seat: chair and only public boundary
54
+ │ ├── agent A: workspace + mounts → a git repo (kind: code)
55
+ │ ├── agent B: workspace + mounts → a folder of documents (kind: knowledge)
56
+ │ ├── agent C: workspace + mounts → several repos and a worktree
57
+ │ ├── editable domain/role knowledge
58
+ │ ├── skills that already live inside the mounted work
59
+ │ └── explicit roads to other seats
60
+ ├── product city
61
+ └── client-a city
62
+ ```
63
+
64
+ **Agents come first.** An agent is the unit, and a repo is just one thing it can
65
+ mount. Each agent has a **workspace folder** with a `mounts/` dir of symlinks to
66
+ wherever the real work lives — a git repo, a linked worktree, or a plain folder
67
+ of documents — so a person whose work is knowledge in documents, with no git at
68
+ all, is a first-class agent. "One repo is one agent" is simply the special case
69
+ of an agent whose single mount is that repo, so **existing repo-only cities keep
70
+ working unchanged**. Full model: [docs/agents-first.md](docs/agents-first.md).
71
+
72
+ The important boundaries are:
73
+
74
+ - **User:** may own several local cities.
75
+ - **City:** has its own identity, domain, goal, configuration, and state.
76
+ - **Seat:** chairs the committee and is the only actor that may cross roads.
77
+ - **Agent:** the member unit. It owns a workspace folder and works over its
78
+ mounts, contributes evidence, and always has member authority — whether its
79
+ speciality is `dev`, `seo` or `cfo`, and whether its **kind** is `code`,
80
+ `knowledge` or `coordinator`.
81
+ - **Mount:** a symlink inside an agent's workspace to real work on disk (a repo,
82
+ a worktree, a document folder). An agent may have several, or none.
83
+ - **Role:** professional perspective and responsibility; it does not grant bus
84
+ permissions.
85
+ - **Skill:** capability installed by the user or repo. Recognition is live and
86
+ read-only; the one deliberate write is the Hall installing a skill zip the
87
+ owner explicitly uploads, into that agent's own home — never on its own,
88
+ never anywhere else. Skills are the Claude runtime's format; other engines
89
+ ignore them.
90
+ - **Road:** allowlist between two seats. It grants reachability, not authority.
91
+ - **Committee:** bounded process for isolated positions, synthesis, floor,
92
+ decision, and verification. It is not lateral conversation between all agents.
93
+
94
+ ## Quick start
95
+
96
+ ### Install from npm
97
+
98
+ ```bash
99
+ npm install -g agents-city
100
+ agents-city --version
101
+ ```
102
+
103
+ This is `0.x` on purpose: the commands are usable today, and the file formats
104
+ and APIs can still change between minor versions. Nothing here pretends to be
105
+ frozen yet.
106
+
107
+ You need Node.js 22+, Python 3 and tmux; the
108
+ [requirements table](#base-requirements) has the details, and `agents-city seat`
109
+ offers to install tmux when it is missing. Nothing is installed system-wide
110
+ beyond the npm global folder of your active Node installation.
111
+
112
+ ### Try it without installing anything
113
+
114
+ ```bash
115
+ npx agents-city
116
+ ```
117
+
118
+ `npx` downloads the package into its cache, runs it, and leaves your global npm
119
+ folder untouched — the fastest way to see whether this is for you.
120
+
121
+ ### Then: the Hall, or the terminal
122
+
123
+ ```bash
124
+ agents-city # the town hall in your browser (same as: agents-city hall)
125
+ agents-city seat # the terminal wizard, if you prefer not to leave the shell
126
+ ```
127
+
128
+ The Hall listens on `127.0.0.1`, chooses a free port, and opens the browser. You
129
+ can create or select a city, edit its configuration, tune each agent's engine
130
+ and watch the live map there. The Hall and the CLI use the same underlying
131
+ modules, so neither is the "lesser" path.
132
+
133
+ ### Update, or remove
134
+
135
+ ```bash
136
+ npm install -g agents-city # update to the newest release
137
+ npm uninstall -g agents-city # remove the program
138
+ ```
139
+
140
+ Uninstalling leaves `~/.agents-city`, your cities and your repositories exactly
141
+ where they are: the program is not your data.
142
+
143
+ ### Install from a source checkout instead
144
+
145
+ For contributors, and for anyone who wants to read the code before running it.
146
+ Packing first is the honest test: it exercises the exact file list a person
147
+ receives from npm, not your whole working copy.
148
+
149
+ ```bash
150
+ git clone https://github.com/jlcases/agents-city.git
151
+ cd agents-city
152
+ npm pack
153
+ npm install -g ./agents-city-*.tgz
154
+ agents-city --version
155
+ ```
156
+
157
+ ## Requirements and installation
158
+
159
+ ### Base requirements
160
+
161
+ | Requirement | Used for |
162
+ |---|---|
163
+ | Node.js 22 or later | npm package, WebSocket bus, and frontends |
164
+ | npm | installation and packaging |
165
+ | Python 3 | Hall, onboarding, cities, maps, and utilities |
166
+ | bash | sessions and launchers |
167
+ | tmux | one window per seat/repo; `seat` tries to install it when missing |
168
+ | macOS or Linux | natively supported platforms |
169
+ | WSL | required on Windows because native Windows has no bash/tmux |
170
+ | bubblewrap | optional, Linux only: it IS the cage there. Without it agents run uncaged — see [the cage](#the-cage-the-broker-and-the-audit-chain) |
171
+
172
+ Each runtime also needs its own installed and authenticated CLI. Agents City
173
+ does not bundle or replace Claude, Codex, OpenCode, or Kimi accounts.
174
+
175
+ ```bash
176
+ command -v claude
177
+ command -v codex
178
+ command -v opencode
179
+ command -v kimi
180
+ ```
181
+
182
+ You do not need all of them. An all-Claude, all-Codex, or mixed city is valid.
183
+
184
+ ### GitHub is optional
185
+
186
+ Selecting local repos requires no account. If you choose GitHub during
187
+ onboarding, Agents City uses the separate `gh` CLI:
188
+
189
+ 1. detects it;
190
+ 2. tries the system package manager if it is absent;
191
+ 3. runs `gh auth login --web` when unauthenticated;
192
+ 4. shows the device code if a browser cannot open;
193
+ 5. offers to clone selected repos that are not on disk.
194
+
195
+ `gh` is not bundled inside the Agents City npm package.
196
+
197
+ ### Update an installation
198
+
199
+ ```bash
200
+ npm install -g agents-city # from the registry
201
+ agents-city --version
202
+ ```
203
+
204
+ From a source checkout, pack and install the tarball instead:
205
+
206
+ ```bash
207
+ cd /path/to/agents-city && npm pack && npm install -g ./agents-city-*.tgz
208
+ ```
209
+
210
+ Already-running sessions retain the code loaded in memory. To apply the new
211
+ version to one city:
212
+
213
+ ```bash
214
+ agents-city exit home --dry-run
215
+ agents-city exit home
216
+ agents-city seat --city home
217
+ ```
218
+
219
+ Save active work first: `exit` closes every window in that city.
220
+
221
+ ### Uninstall
222
+
223
+ ```bash
224
+ npm uninstall -g agents-city
225
+ ```
226
+
227
+ This removes the installed program. It does **not** remove `~/.agents-city`, your
228
+ cities, backups, or repositories. Use `agents-city reset` only when you intend to
229
+ restart one specific city.
230
+
231
+ ## First run, step by step
232
+
233
+ `agents-city seat` creates `home` when no city exists and asks seven questions.
234
+
235
+ ### 1. Work domain
236
+
237
+ The domain determines vocabulary, evidence criteria, and suggested roles. The
238
+ built-in options are:
239
+
240
+ | ID | Domain |
241
+ |---|---|
242
+ | `software` | Software development |
243
+ | `healthcare` | Healthcare and medicine |
244
+ | `legal` | Legal services |
245
+ | `finance` | Finance and operations |
246
+ | `marketing` | Marketing and growth |
247
+ | `sales` | Sales and customer success |
248
+ | `research` | Research and education |
249
+ | `operations` | Operations and delivery |
250
+ | `custom` | Another domain without assuming an industry |
251
+
252
+ ### 2. Seat role
253
+
254
+ This is the responsibility of the city lead. It is not the city name or runtime.
255
+ The seat remains chair even when you choose `blank`.
256
+
257
+ ### 3. The agents, one at a time
258
+
259
+ This is the city itself, and it is a loop rather than a list of folders to tick.
260
+ Each agent is asked for in full, and then you are asked for another, until you
261
+ say the city is complete:
262
+
263
+ 1. **Its name** — what you call it in its window, on the map, and on the bus.
264
+ 2. **The kind of work it does** — `code`, `knowledge` or `coordinator`. This is
265
+ not a permission: it decides how its house grows on the map, so a person
266
+ whose work is documents is not measured in pull requests.
267
+ 3. **Its role** — its specialty, from this city's domain or another one. A
268
+ software city can give `po` to a product agent, `seo` to a portfolio one and
269
+ `data-engineer` to a pipeline. None becomes chair.
270
+ 4. **Everything it works on** — any number of repositories (read from disk, your
271
+ GitHub account, or an organisation) *plus* any number of document folders.
272
+ One agent may answer for three services and a handbook at once, and an agent
273
+ with no git anywhere is a first-class agent. They are mounted inside its
274
+ workspace, not turned into separate agents.
275
+ 5. **What runs it** — Claude with a model and effort of its own, or Codex,
276
+ OpenCode, Kimi, or an explicit terminal fallback.
277
+ 6. **The skills it starts with** — a skill folder or `.zip` installed into that
278
+ agent's own home. Only offered for engines that read skills; an agent on
279
+ Codex is told its engine ignores them instead of being sold something that
280
+ does nothing.
281
+
282
+ Each agent then receives a tmux window, a private bus actor, its workspace as
283
+ working directory, and the skills its runtime can already discover in what it
284
+ mounts.
285
+
286
+ Saying the city has no agents is also valid: it opens with only its seat, and
287
+ roads connect it to other cities.
288
+
289
+ Change the roster any time with `agents-city seat --agents`.
290
+
291
+ ### 4. Goal
292
+
293
+ A goal may be quantitative or qualitative. It stores:
294
+
295
+ - title;
296
+ - observed signal;
297
+ - a command that returns the measure, when one exists;
298
+ - person and review frequency for a qualitative judgement;
299
+ - baseline;
300
+ - target;
301
+ - target date.
302
+
303
+ You may skip it and configure it later with `agents-city seat --goal`.
304
+
305
+ ### 5. Runtime for your own chair
306
+
307
+ Every agent's engine was decided on the agent itself, in question 3. What is
308
+ left is your own window — the one that holds the chair role, the `/city:`
309
+ commands and the plugin. Pressing Enter keeps it on your Claude; you may instead
310
+ choose Claude with a model and effort, Codex, OpenCode, Kimi, or an unknown
311
+ command through the explicit terminal fallback.
312
+
313
+ Persistent choices live in the owner card. `seat --model` and `--effort` are
314
+ one-launch overrides only.
315
+
316
+ ### 6. Whether your chair asks permission
317
+
318
+ Per city, in `city.yml` as `seat_yolo`. Locally the seat is your own hands on
319
+ your own machine, so asking you for permission in your own chair is a choice,
320
+ not a law. Agent windows keep their own cage either way, and launching with
321
+ `--no-yolo` still brakes the whole session, seat included.
322
+
323
+ ### 7. The city on your desktop
324
+
325
+ Offered once, when the city is new: a real desktop shortcut carrying the city's
326
+ name and an icon coloured from its own identity — a macOS `.app` bundle or a
327
+ Linux `.desktop` entry. Double-click it and the city opens.
328
+
329
+ It runs the same line you would type, so it is a labelled button on the front
330
+ door rather than a second way in. Add or remove one any time:
331
+
332
+ ```bash
333
+ agents-city shortcut # this city, on your desktop
334
+ agents-city shortcut home --hall # a door that opens the map instead
335
+ agents-city shortcut --remove # take it off again
336
+ agents-city shortcut --to ~/bin # somewhere other than the desktop
337
+ ```
338
+
339
+ **On Windows** the city lives inside WSL, and a `~/Desktop` in WSL is the Linux
340
+ home's desktop — which nobody ever looks at. So the shortcut is written to the
341
+ **Windows** desktop instead, asked of Windows itself rather than guessed from a
342
+ username (a desktop redirected to OneDrive or a domain profile is not under
343
+ `C:\Users\<name>\Desktop`). It is a real `.lnk`, built through Windows' own
344
+ PowerShell so it can carry an `.ico`, and it launches `wsl.exe` running the same
345
+ command in a login shell. Where interop is unavailable, a double-clickable
346
+ `.cmd` is written instead — same door, plain icon.
347
+
348
+ ### What gets created
349
+
350
+ ```text
351
+ ~/.agents-city/
352
+ ├── .runtime/ # bus endpoints, queues, and ephemeral state
353
+ ├── state/ # local map state, separated per city
354
+ ├── .backups/ # old migrations
355
+ └── <owner>/
356
+ ├── .current # selected city
357
+ ├── .backups/ # recoverable owner resets
358
+ └── <city>/
359
+ ├── city.yml # id, name, slug, owner, domain
360
+ ├── roads.json # allowed roads
361
+ ├── <owner>.md # role, repos, roles, goal, runtimes
362
+ ├── AGENTS.md # how to read this city
363
+ ├── domains/ # editable domain knowledge
364
+ ├── roles/ # editable role knowledge
365
+ ├── deliberations/ # committee state, events, and acts
366
+ ├── units.yml # map districts, when used
367
+ └── parcels.yml # map houses/parcels, when used
368
+ ```
369
+
370
+ The `~/.agents-city` root is a container, never a city. `home` is simply the
371
+ first city and is isolated exactly like `product` or `client-a`.
372
+
373
+ ## Working inside tmux
374
+
375
+ A session is named `<owner>-<city>` and contains:
376
+
377
+ - a `seat` window, located in the city folder;
378
+ - one window per locally found repo;
379
+ - the configured runtime already started in each window.
380
+
381
+ Shortcuts are added only to the currently running tmux server:
382
+
383
+ | Action | Shortcut |
384
+ |---|---|
385
+ | Switch to windows 1–9 | `Alt+1` … `Alt+9` |
386
+ | Previous/next window | `Alt+←` / `Alt+→` |
387
+ | Select with mouse | click the bottom status bar |
388
+ | Scroll | mouse wheel |
389
+ | Detach without closing | `Ctrl-b`, then `d` |
390
+ | Return to the city | `agents-city seat --city <name>` |
391
+
392
+ If the session already exists, `seat` reattaches to it; it does not create a
393
+ duplicate set of agents. A bell or activity-coloured tab means that window may
394
+ need attention.
395
+
396
+ Claude starts in a stagger because multiple instances share its OAuth token.
397
+ Codex, OpenCode, and Kimi do not wait for that stagger. Use
398
+ `CITY_SETTLE=0 CITY_STAGGER=0` only when you deliberately want to disable it.
399
+
400
+ Do not close a city by killing generic processes. Use:
401
+
402
+ ```bash
403
+ agents-city exit <city> --dry-run
404
+ agents-city exit <city>
405
+ ```
406
+
407
+ ## Runtimes and transports
408
+
409
+ All runtimes receive typed envelopes from the same local WebSocket bus, but each
410
+ provider has a native last mile:
411
+
412
+ | Runtime | Bus task delivery | Visible interface | Requirement |
413
+ |---|---|---|---|
414
+ | Claude | persistent `stream-json` over stdin/stdout | interactive `city>` gateway plus visible Claude transcript | authenticated `claude` CLI; no Team account or admin policy |
415
+ | Codex | `app-server` WebSocket | official TUI connected with `codex --remote` | authenticated `codex` CLI |
416
+ | OpenCode | HTTP/SSE API | interactive gateway `city>` console | configured `opencode` CLI |
417
+ | Kimi | REST + WebSocket | interactive gateway `city>` console | configured `kimi` or `kimi-code` CLI |
418
+ | Unknown CLI | compatibility adapter | its own TUI/command inside tmux | explicit `terminal:<command>` setting |
419
+
420
+ Claude, Codex, OpenCode, and Kimi tasks are **not** pasted into tmux and do not
421
+ use the clipboard. Terminal fallback exists only for an explicitly selected
422
+ unknown command.
423
+
424
+ Agents City does **not** use custom Claude Channels in its normal launch path.
425
+ The same official Claude Code process stays open in print/streaming mode and
426
+ receives JSONL turns directly from the city gateway. A personal Pro/Max account
427
+ therefore needs no `sudo`, `managed-settings.json`, Team console, Channel
428
+ allowlist, development bypass, or per-window confirmation. The installed plugin
429
+ still supplies its MCP tools, skills and hooks normally. Custom Channels remain
430
+ an optional upstream preview mechanism, not a prerequisite for Agents City.
431
+
432
+ Conceptual multi-model card settings:
433
+
434
+ ```yaml
435
+ runs.seat: codex
436
+ runs.api: codex --model gpt-5
437
+ runs.analytics: opencode -m lmstudio/qwen3-coder
438
+ runs.research: kimi
439
+ runs.legacy: terminal:gemini
440
+ model.docs: sonnet
441
+ effort.docs: high
442
+ ```
443
+
444
+ When the seat does not use Claude, it has no `/city:` commands. Everything
445
+ fundamental remains available through `agents-city committee`, `road`, `bus`,
446
+ `skills`, `seat`, `reset`, and `exit`.
447
+
448
+ ## Domains, roles, and knowledge
449
+
450
+ ### Built-in roles by domain
451
+
452
+ | Domain | Available role IDs |
453
+ |---|---|
454
+ | `software` | `cpto`, `dev`, `data-engineer`, `devops`, `data`, `product-design`, `po`, `llm-engineer`, `ai-manager`, `blank` |
455
+ | `healthcare` | `clinical-director`, `clinician`, `patient-safety`, `clinical-ops`, `health-data`, `health-compliance`, `blank` |
456
+ | `legal` | `managing-partner`, `associate`, `compliance`, `knowledge`, `ops`, `blank` |
457
+ | `finance` | `cfo`, `controller`, `fin-analytics`, `ops`, `compliance`, `blank` |
458
+ | `marketing` | `brand-lead`, `content`, `performance`, `seo`, `lifecycle`, `data`, `product-design`, `blank` |
459
+ | `sales` | `revenue-lead`, `account-executive`, `revops`, `customer-success`, `enablement`, `blank` |
460
+ | `research` | `research-director`, `researcher`, `methods`, `research-ops`, `ethics`, `knowledge`, `blank` |
461
+ | `operations` | `operations-lead`, `program-manager`, `process-owner`, `quality`, `knowledge`, `blank` |
462
+ | `custom` | `city-lead`, `specialist`, `quality`, `knowledge`, `blank` |
463
+
464
+ `blank` is a complete choice: it creates no role file, applies no hidden
465
+ profile, and infers no responsibility. You may assign it to the seat or any repo
466
+ and change it later.
467
+
468
+ When you select a domain/role, Agents City copies initial packs into the city:
469
+
470
+ ```text
471
+ domains/<domain>.md
472
+ roles/<role>.md
473
+ ```
474
+
475
+ They are ordinary Markdown. You can edit, remove, or extend their contents. A
476
+ later role change does not overwrite an existing file, so your adaptations are
477
+ preserved. This knowledge is not a skill.
478
+
479
+ ## Complete command reference
480
+
481
+ ### Overview
482
+
483
+ ```text
484
+ agents-city [hall]
485
+ agents-city setup
486
+ agents-city seat
487
+ agents-city cities
488
+ agents-city road
489
+ agents-city bus
490
+ agents-city committee
491
+ agents-city agents
492
+ agents-city skills
493
+ agents-city city
494
+ agents-city shortcut
495
+ agents-city demo
496
+ agents-city report
497
+ agents-city tokens
498
+ agents-city logs
499
+ agents-city benchmark
500
+ agents-city reset
501
+ agents-city exit
502
+ agents-city doctor
503
+ agents-city update
504
+ agents-city test
505
+ ```
506
+
507
+ Global commands:
508
+
509
+ ```bash
510
+ agents-city --help
511
+ agents-city --version
512
+ ```
513
+
514
+ ### `agents-city` and `agents-city hall`
515
+
516
+ Open the local Hall for the selected city.
517
+
518
+ ```bash
519
+ agents-city
520
+ agents-city hall
521
+ agents-city hall --city product
522
+ agents-city hall --no-browser
523
+ ```
524
+
525
+ | Option | Effect |
526
+ |---|---|
527
+ | `--city NAME|ID|PATH` | select a known city and open it |
528
+ | `--no-browser` | do not open the browser; print the local URL and temporary token |
529
+
530
+ The server binds only to `127.0.0.1` and requires a per-run token for writes.
531
+ The **City live** column on the right connects as a spectator to the same local
532
+ WebSocket bus used by the agents. It shows ordinary visible user/agent messages,
533
+ runtime failures, and the complete moderated committee flow as a conversation:
534
+ one avatar per repo, the seat marked as chair, and one visible turn per revealed
535
+ position or granted reply. Routine commands and lifecycle noise are collapsed
536
+ behind **show work**; the selected conversation opens by default.
537
+
538
+ The Hall opens directly on **The map**. The city owns the whole centre canvas: state, controls, and
539
+ history stay in the side rails, never above or below the map. Every semantic
540
+ turn arriving on that same WebSocket also creates a short game-style bubble,
541
+ anchored to the speaking character and prefixed with its recipient (`Para
542
+ seat:`, `Para committee:`, and so on). The bubble is only the transient summary;
543
+ the complete message and evidence remain in **City live**. No decorative
544
+ dialogue, commands, private reasoning, or raw envelopes become speech.
545
+
546
+ Codex uses completed visible app-server items; Claude uses its documented prompt
547
+ and stop hooks. Provider reasoning items, chain-of-thought, credentials, and raw
548
+ transport frames are neither shown nor written to the activity log. The
549
+ spectator token rotates with the hub, accepts only an origin on this computer,
550
+ and is read-only: the browser cannot direct the committee. `Ctrl-c` stops the
551
+ Hall.
552
+
553
+ ### `agents-city setup`
554
+
555
+ Creates or selects a city and opens the Hall; `--tui` hands the flow to `seat`.
556
+
557
+ ```bash
558
+ agents-city setup
559
+ agents-city setup --city product
560
+ agents-city setup --city product --tui
561
+ agents-city setup --out /path/to/a/city
562
+ agents-city setup --demo
563
+ agents-city setup --no-browser
564
+ ```
565
+
566
+ | Option | Effect |
567
+ |---|---|
568
+ | `--city NAME` | create the managed city when missing or select the existing one |
569
+ | `--out PATH` | register/import an explicit compatible folder; advanced use |
570
+ | `--demo` | open the complete guided Aurora Games demo |
571
+ | `--tui` | use terminal onboarding and open the session |
572
+ | `--no-browser` | keep the Hall in the terminal and print its URL |
573
+
574
+ ### `agents-city seat`
575
+
576
+ Configures requested settings, ensures tmux/plugin, and opens or resumes the city
577
+ session.
578
+
579
+ ```bash
580
+ agents-city seat
581
+ agents-city seat --city product
582
+ agents-city seat --repos
583
+ agents-city seat --agent-roles
584
+ agents-city seat --goal
585
+ agents-city seat --engines
586
+ agents-city seat --domain marketing
587
+ agents-city seat --domain marketing --role brand-lead
588
+ agents-city seat --role blank
589
+ agents-city seat --only api,web
590
+ agents-city seat --model sonnet --effort high
591
+ agents-city seat --seat-yolo on
592
+ agents-city seat --no-yolo --no-sync
593
+ ```
594
+
595
+ | Option | Persistence and effect |
596
+ |---|---|
597
+ | `--city NAME|PATH` | select this city and open its session |
598
+ | `--repos` | choose repos again, then their agent roles; persists |
599
+ | `--agent-roles`, `--agents` | choose only each repo role again; persists |
600
+ | `--goal` | redefine the goal; persists |
601
+ | `--engines` | choose runtime/model per window; persists |
602
+ | `--domain DOMAIN` | change domain; persists and asks for a compatible role unless `--role` is supplied |
603
+ | `--role ROLE` | change the seat role without a picker; persists |
604
+ | `--only a,b` | open only those repos this run; does not alter the card |
605
+ | `--model ALIAS` | model override for all windows in this launch |
606
+ | `--effort LEVEL` | `low`, `medium`, `high`, `xhigh`, or `max` override for this launch |
607
+ | `--seat-yolo on\|off` | whether the chair itself runs without permission prompts; persists per city (`city.yml seat_yolo`, also question six of the wizard). Locally the seat is the owner's own hands; repo windows keep their own yolo/cage story either way |
608
+ | `--no-yolo` | disable auto-approval for this launch — seat included, whatever `seat_yolo` says |
609
+ | `--no-sync` | skip initial `git fetch/pull` in repos for this launch |
610
+
611
+ `seat` accepts a positional user for compatibility, but only when it matches the
612
+ resolved local owner. Use `--city` for another city belonging to the same user.
613
+
614
+ ### `agents-city cities`
615
+
616
+ Manages the local catalogue. Creating or selecting does not start tmux.
617
+
618
+ ```bash
619
+ agents-city cities list
620
+ agents-city cities current
621
+ agents-city cities create product
622
+ agents-city cities use product
623
+ agents-city cities use /path/to/city
624
+ ```
625
+
626
+ | Subcommand | Output/effect |
627
+ |---|---|
628
+ | `list` | known cities; `*` marks the selected one |
629
+ | `current` | absolute path of the selected city |
630
+ | `create NAME` | create `~/.agents-city/<owner>/<slug>/` and select it |
631
+ | `use NAME|PATH` | select an existing city without starting it |
632
+
633
+ ### `agents-city road`
634
+
635
+ Opens and closes the allowlist of connections between seats.
636
+
637
+ ```bash
638
+ agents-city road list product
639
+ agents-city road connect product client-a
640
+ agents-city road invite product
641
+ agents-city road invite product > product.invitation.json
642
+ agents-city road connect product research.invitation.json
643
+ agents-city road disconnect product client-a
644
+ agents-city road disconnect product <remote-city-id>
645
+ ```
646
+
647
+ | Subcommand | Effect |
648
+ |---|---|
649
+ | `list CITY` | show destination, address, and local/remote status |
650
+ | `connect A B` | when B is local, write both ends symmetrically |
651
+ | `connect A invitation.json` | add only the local end of a remote road |
652
+ | `invite CITY` | print public JSON without a token |
653
+ | `disconnect A B|ID` | remove both local ends or the specified remote ID |
654
+
655
+ A city cannot connect to itself. Each machine must independently accept the
656
+ other remote invitation.
657
+
658
+ ### `agents-city bus`
659
+
660
+ Operates messages between seats over declared roads.
661
+
662
+ ```bash
663
+ agents-city bus roster
664
+ agents-city bus inbox
665
+ agents-city bus send alice/research "Please confirm the event X contract"
666
+ agents-city bus send '*' "Notice for every connected city"
667
+ ```
668
+
669
+ | Subcommand | Effect |
670
+ |---|---|
671
+ | `roster` | return roads and known online presence |
672
+ | `inbox` | return and consume pending inbox; append-only history remains |
673
+ | `send owner/city TEXT` | send to one allowed destination |
674
+ | `send '*' TEXT` | send to all roads; requires at least one |
675
+
676
+ Only `seat` may run these operations. A repo actor is rejected by the ACL even
677
+ if it knows the destination address.
678
+
679
+ ### `agents-city committee`
680
+
681
+ Manages structured deliberations inside one city. Every command accepts fields
682
+ as flags or as a JSON object through `--input`.
683
+
684
+ ```bash
685
+ agents-city committee list
686
+ agents-city committee history
687
+ agents-city committee show <deliberation-id>
688
+ agents-city committee status <deliberation-id> # alias for show
689
+ agents-city committee schema open
690
+ agents-city committee open --input proposal.json
691
+ agents-city committee open --input - < proposal.json
692
+ ```
693
+
694
+ | Subcommand | Allowed actor | Purpose |
695
+ |---|---|---|
696
+ | `list` | any involved city actor | open deliberations visible to that actor |
697
+ | `history` | seat | finished decision history and contributor counts |
698
+ | `show ID`, `status ID` | involved city actor | complete actor-visible state and events |
699
+ | `schema VERB` | anyone | JSON contract for a mutation verb |
700
+ | `open` | seat | state question, outcome, members, and boundaries |
701
+ | `respond` | invited member | record one independent initial position |
702
+ | `synthesize` | seat | publish agreements, conflicts, and unknowns |
703
+ | `floor-request` | member | request a turn for evidence, contradiction, risk, or dependency |
704
+ | `floor-grant` | seat | grant one floor request |
705
+ | `floor-deny` | seat | deny one floor request with a reason |
706
+ | `reply` | member holding the floor | submit one bounded, evidence-based reply |
707
+ | `decide` | seat | record outcome, owners, verifier, and reopen conditions |
708
+ | `verify` | assigned verifier | return `pass` or `fail` with checks |
709
+ | `replan` | seat | reopen a failed verification with a new plan |
710
+ | `close` | seat | close an already verified outcome |
711
+ | `cancel` | seat | cancel a deliberation with a reason |
712
+
713
+ Opening with flags:
714
+
715
+ ```bash
716
+ agents-city committee open \
717
+ --question "Should we ship today?" \
718
+ --outcome-wanted "A reversible decision with an owner and verification" \
719
+ --context "The release candidate passed the local suite" \
720
+ --constraint "Do not lose data" \
721
+ --constraint "Rollback within ten minutes" \
722
+ --done "The decision names an executor and verifier" \
723
+ --authority execute \
724
+ --member api \
725
+ --member web \
726
+ --member qa \
727
+ --max-rebuttals 1
728
+ ```
729
+
730
+ The result prints a `deliberationId`. Keep it for later transitions. JSON is
731
+ usually clearer for large payloads:
732
+
733
+ ```json
734
+ {
735
+ "question": "Should we ship today?",
736
+ "desiredOutcome": "A reversible decision with an owner and verification",
737
+ "context": "The release candidate passed the local suite",
738
+ "constraints": ["Do not lose data", "Rollback within ten minutes"],
739
+ "definitionOfDone": ["Executor and verifier assigned"],
740
+ "authority": "execute",
741
+ "participants": ["api", "web", "qa"],
742
+ "maxRebuttals": 1
743
+ }
744
+ ```
745
+
746
+ ```bash
747
+ agents-city committee open --input proposal.json
748
+ ```
749
+
750
+ `--input -` reads stdin. When JSON and flags are mixed, explicit flags override
751
+ the equivalent field. Repeatable flags are `--member`, `--constraint`, `--done`,
752
+ `--evidence`, `--risk`, `--unknown`, `--agreement`, `--conflict`, `--check`,
753
+ `--residual-risk`, `--selected-evidence`, `--rejected-option`, `--dissent`,
754
+ `--reopen-if`, `--learning`, and `--followup`.
755
+
756
+ Always inspect the exact contract shipped by the installed version:
757
+
758
+ ```bash
759
+ agents-city committee schema respond
760
+ agents-city committee schema decide
761
+ agents-city committee schema verify
762
+ ```
763
+
764
+ Member commands (`respond`, `floor-request`, and `reply`) are normally executed
765
+ by the authenticated repo agent after receiving an envelope. Running one from
766
+ the seat correctly fails its ACL: accepting an actor name as text would not let
767
+ the bus pretend to be that actor.
768
+
769
+ ### `agents-city skills`
770
+
771
+ Lists skills already present in a city's repos. This is read-only: it does not
772
+ install, copy, enable, or remove anything.
773
+
774
+ ```bash
775
+ agents-city skills
776
+ agents-city skills product
777
+ ```
778
+
779
+ Recognised layouts per repository:
780
+
781
+ ```text
782
+ SKILL.md
783
+ .claude/skills/*/SKILL.md
784
+ .codex/skills/*/SKILL.md
785
+ .agents/skills/*/SKILL.md
786
+ skills/*/SKILL.md
787
+ ```
788
+
789
+ Actual invocation depends on the runtime. Agents City advertises the capability
790
+ for the member and lets the provider enforce its own discovery and use rules.
791
+
792
+ ### `agents-city agents`
793
+
794
+ Lists this city's agents and manages what each one works on. An agent's mounts
795
+ are symlinks inside its workspace, so this is the terminal equivalent of the
796
+ Hall's **works on** row and of question 3 of the wizard.
797
+
798
+ ```bash
799
+ agents-city agents list --card ~/.agents-city/alice/home/alice.md --data ~/.agents-city/alice/home
800
+ agents-city agents mounts --agent urgencias --data ~/.agents-city/alice/home
801
+ agents-city agents mount --agent urgencias --src ~/documents/handbook --data …
802
+ agents-city agents unmount --agent urgencias --name handbook --data …
803
+ ```
804
+
805
+ | Command | Effect |
806
+ |---|---|
807
+ | `list` | every agent: name, slug, role, runtime, kind, working directory |
808
+ | `mounts` | one agent's mounts, as label and real target |
809
+ | `mount --src PATH` | mount a repo, a worktree or a folder of documents |
810
+ | `unmount --name LABEL` | remove that mount; the folder itself is untouched |
811
+ | `sync` / `sync-all` | rebuild the workspaces from the card, as the launcher does |
812
+
813
+ Unmounting removes a symlink and a card key. It never deletes what the link
814
+ pointed at.
815
+
816
+ ### `agents-city city`
817
+
818
+ Opens one city's local map without starting an agent session.
819
+
820
+ ```bash
821
+ agents-city city
822
+ agents-city city ~/.agents-city/alice/product
823
+ ```
824
+
825
+ It uses port `8787` or the next free port, binds to loopback, and opens the
826
+ browser. `Ctrl-c` stops the server. `units.yml`, `parcels.yml`, the card, and bus
827
+ state feed the visualisation.
828
+
829
+ The map is live, not a postcard. Three layers stage what is happening right
830
+ now, all derived from data the product already emits: presence (a mid-turn
831
+ house glows and breathes, a stopped one cools), the town hall (committee
832
+ sessions play on stage — sealed positions fly in face down, the floor is a
833
+ raised hand, verification stamps the door, closing files the act — with the
834
+ camera flying to the session and members walking over), and one gate per road,
835
+ which letters to other cities leave through. Agents get deterministic
836
+ identicon faces, `knowledge`/`coordinator` parcels wear a different building
837
+ family than `code`, the town hall and the gates are clickable, `P` (or the ⛶
838
+ control) toggles fullscreen, and the Hall's live rail is resizable by dragging
839
+ its edge. The full contract is in
840
+ [docs/map-live-layers.md](docs/map-live-layers.md).
841
+
842
+ ### `agents-city shortcut`
843
+
844
+ Puts a city on your desktop: its name, an icon coloured from its own identity,
845
+ and a double-click that opens it.
846
+
847
+ ```bash
848
+ agents-city shortcut # the selected city
849
+ agents-city shortcut product # a specific one
850
+ agents-city shortcut --hall # a door that opens the map instead of the seat
851
+ agents-city shortcut --remove # take it off the desktop
852
+ agents-city shortcut --to ~/bin # write it somewhere else
853
+ ```
854
+
855
+ | Option | Effect |
856
+ |---|---|
857
+ | `--hall` | the shortcut opens the browser map instead of the tmux city |
858
+ | `--remove` | remove this city's shortcut |
859
+ | `--to DIR` | write it into another folder than the desktop |
860
+
861
+ What gets written depends on the desktop, and each is a real one rather than a
862
+ script pretending:
863
+
864
+ | Platform | Shortcut | Icon |
865
+ |---|---|---|
866
+ | macOS | `.app` bundle running the city in Terminal | `.icns`, built with the system's `iconutil` |
867
+ | Linux | `.desktop` entry, marked trusted where `gio` exists | `.png` under `XDG_DATA_HOME` |
868
+ | Windows (WSL) | `.lnk` on the **Windows** desktop, launching `wsl.exe` | `.ico`, when PowerShell interop is reachable |
869
+
870
+ All of them run the same line you would type, so the shortcut is a labelled
871
+ button on the front door rather than a second way in. The icon is generated
872
+ without any image library: a PNG written by hand, wrapped as `.ico` for Windows
873
+ and converted by `iconutil` for macOS.
874
+
875
+ On Windows the city lives inside WSL, and a `~/Desktop` there is the Linux
876
+ home's desktop that nobody looks at — so the Windows desktop is asked of Windows
877
+ itself, never assembled from a username, because a desktop redirected to OneDrive
878
+ or a domain profile is not under `C:\Users\<name>\Desktop`. Without interop a
879
+ double-clickable `.cmd` is written instead: same door, plain icon.
880
+
881
+ ### `agents-city demo`
882
+
883
+ Opens one fictional, disposable demo city in the complete Hall. The map owns
884
+ the centre; the right rail plays a guided deliberation and those same turns
885
+ appear as `Para …:` speech bubbles over their agents. There is one demo per
886
+ domain — real chaos told in plain words, not programmer phrases:
887
+
888
+ ```bash
889
+ agents-city demo # software · Aurora Games — the night the saves vanished
890
+ agents-city demo --domain medicina # Clínica Alba — the morning the appointments doubled
891
+ agents-city demo --domain legal # Costa & Ley — the deadline at nine tomorrow
892
+ agents-city demo --no-browser
893
+ ```
894
+
895
+ It starts no models and needs no Claude, Codex, OpenCode or Kimi account. The
896
+ stories are declared presentation content, but their engineering is not an
897
+ animation: all 22 events cross the real authenticated WebSocket, committee
898
+ state machine, durable ledger and spectator feed. Every story walks the WHOLE
899
+ machine, including the part demos usually hide: three isolated positions, two
900
+ chair-granted floor requests, a decision, a verification that FAILS, a replan,
901
+ and only then a verified close. The clinic and the firm are agents-first
902
+ cities — knowledge and coordinator agents, no repositories — so they also
903
+ exercise the roster and the map's building families.
904
+
905
+ The Hall's live rail shows a framed **guided committee** control for demo
906
+ cities only: `⟳ replay` plays the domain's story again, and `⏸ pause` /
907
+ `▶ resume` stop and continue the storyteller process itself (`SIGSTOP`, a real
908
+ pause). `/api/demo` refuses any city that is not a packaged demo: a real
909
+ city's committee is real, and a replay there would publish fiction onto a real
910
+ bus.
911
+
912
+ The demo copies its city and runtime into a temporary directory. `Ctrl-c` stops
913
+ its Hall, map and hub and removes that copy; it never selects, rewrites or starts
914
+ your cities. If another map already owns `8787`, the demo uses another port and
915
+ the Hall checks city identity instead of accidentally framing the wrong map.
916
+
917
+ ### `agents-city report`
918
+
919
+ Computes growth that can be represented on the map and optionally pushes it to
920
+ the configured city service.
921
+
922
+ ```bash
923
+ agents-city report
924
+ agents-city report --data ~/.agents-city/alice/product
925
+ agents-city report --url https://city.example.com --token "$CITY_TOKEN"
926
+ agents-city report --push --quiet
927
+ ```
928
+
929
+ | Option | Effect |
930
+ |---|---|
931
+ | `--data PATH` | use another city data folder |
932
+ | `--url URL` | override the service URL |
933
+ | `--token TOKEN` | override the authentication token |
934
+ | `--push` | send the report; without it, only compute/show |
935
+ | `--quiet` | reduce human-readable output |
936
+
937
+ ### `agents-city tokens`
938
+
939
+ Aggregates local Claude transcript usage and can send totals only. It does not
940
+ send prompts, responses, or file paths.
941
+
942
+ ```bash
943
+ agents-city tokens
944
+ agents-city tokens --days 7
945
+ agents-city tokens --all
946
+ agents-city tokens --push --quiet
947
+ agents-city tokens --url https://city.example.com --token "$CITY_TOKEN"
948
+ ```
949
+
950
+ | Option | Effect |
951
+ |---|---|
952
+ | `--days N` | time window; default 30 days |
953
+ | `--all` | re-read transcripts inside `--days`, ignoring the incremental cache |
954
+ | `--url URL` | override the service URL |
955
+ | `--token TOKEN` | override the authentication token |
956
+ | `--push` | send aggregates; without it, only show them |
957
+ | `--quiet` | reduce human-readable output |
958
+
959
+ `tokens` does not automatically estimate Codex, OpenCode, or Kimi usage.
960
+
961
+ ### `agents-city logs`
962
+
963
+ Reads the selected city's two durable local streams: visible semantic activity
964
+ and secret-scrubbed operational diagnostics. It does not read provider reasoning.
965
+
966
+ ```bash
967
+ agents-city logs
968
+ agents-city logs --activity --lines 50
969
+ agents-city logs --diagnostics --lines 200
970
+ agents-city logs --follow
971
+ agents-city logs --json --follow
972
+ ```
973
+
974
+ | Option | Effect |
975
+ |---|---|
976
+ | `--activity` | only visible prompts, answers, work, and committee events |
977
+ | `--diagnostics` | only hub, socket, gateway, hook, and launcher diagnostics |
978
+ | `-n, --lines N` | initial number of records; default 100 |
979
+ | `-f, --follow` | continue streaming appended records until `Ctrl-c` |
980
+ | `--json` | emit the stored JSONL records unchanged |
981
+
982
+ The files live under the selected city's private runtime directory as
983
+ `activity.jsonl` and `diagnostics.jsonl`. They survive a Hall reload and a bus
984
+ restart, are mode `0600`, and can be inspected directly. Activity source IDs
985
+ make repeated provider notifications and hooks idempotent.
986
+
987
+ ### `agents-city benchmark`
988
+
989
+ Measures transport, real runtimes, or the structure of the committee protocol.
990
+
991
+ #### Local stress without model quota
992
+
993
+ ```bash
994
+ agents-city benchmark stress
995
+ agents-city benchmark stress --agents 40 --rounds 2 --timeout 20
996
+ agents-city benchmark stress --agents 80 --rounds 5 --json
997
+ agents-city benchmark stress --keep
998
+ ```
999
+
1000
+ | Option | Effect |
1001
+ |---|---|
1002
+ | `--agents N` | simulated actors; must be even, default 40 |
1003
+ | `--rounds N` | rounds per actor; default 2 |
1004
+ | `--timeout SEC` | benchmark limit; default 20 |
1005
+ | `--json` | machine-readable output |
1006
+ | `--keep` | preserve the temporary workspace for inspection |
1007
+
1008
+ #### Real runtimes, consuming quota
1009
+
1010
+ ```bash
1011
+ agents-city benchmark live --runtime claude --runtime codex
1012
+ agents-city benchmark live \
1013
+ --runtime codex \
1014
+ --runtime kimi \
1015
+ --timeout 180 \
1016
+ --json
1017
+ agents-city benchmark live \
1018
+ --command codex="codex --model gpt-5" \
1019
+ --command opencode="opencode -m lmstudio/qwen3-coder" \
1020
+ --keep
1021
+ ```
1022
+
1023
+ | Option | Effect |
1024
+ |---|---|
1025
+ | `--runtime RUNTIME` | runtime to measure; repeatable: `claude`, `codex`, `kimi`, `opencode` |
1026
+ | `--command RUNTIME=COMMAND` | concrete command for that runtime; repeatable |
1027
+ | `--timeout SEC` | limit per case; default 180 |
1028
+ | `--json` | machine-readable output |
1029
+ | `--no-save` | do not append the result to local history |
1030
+ | `--keep` | preserve temporary workspaces |
1031
+
1032
+ `live` makes real calls to installed providers and can consume quota or money.
1033
+ Check authentication and limits before running it.
1034
+
1035
+ #### Committee protocol
1036
+
1037
+ ```bash
1038
+ agents-city benchmark committee
1039
+ agents-city benchmark committee --json
1040
+ ```
1041
+
1042
+ This compares the structured flow with an unbounded chat: response barrier,
1043
+ floor control, decision, and verification. It is a deterministic structural
1044
+ benchmark; by itself it proves neither higher answer quality nor a SOTA claim.
1045
+
1046
+ ### `agents-city reset`
1047
+
1048
+ Resets **one** managed city while preserving its stable identity and repositories.
1049
+
1050
+ ```bash
1051
+ agents-city reset product --dry-run
1052
+ agents-city reset product
1053
+ ```
1054
+
1055
+ The reset plan:
1056
+
1057
+ 1. verifies the target is a managed city, not an arbitrary path;
1058
+ 2. shows and stops only that city's session/runtime;
1059
+ 3. creates a recoverable backup under its owner;
1060
+ 4. preserves `id`, owner, name, and slug;
1061
+ 5. removes that city's configuration, deliberations, and generated state;
1062
+ 6. does not touch source repositories;
1063
+ 7. symmetrically removes incident local roads;
1064
+ 8. leaves the city ready for onboarding again.
1065
+
1066
+ There is no automatic `restore` command yet. The exact backup path is printed
1067
+ for manual recovery. Always run `--dry-run` first.
1068
+
1069
+ ### `agents-city exit`
1070
+
1071
+ Stops Agents City sessions and processes without deleting configuration.
1072
+
1073
+ ```bash
1074
+ agents-city exit product --dry-run
1075
+ agents-city exit product
1076
+ agents-city exit --dry-run
1077
+ agents-city exit
1078
+ ```
1079
+
1080
+ With a city, it closes only that city's tmux, gateway, and helper processes; the
1081
+ Hall may stay up. Without a city, it shows or closes everything managed by
1082
+ Agents City. A tmux session may contain unsaved work, so dry-run is the safe way
1083
+ to confirm scope.
1084
+
1085
+ ### `agents-city doctor`
1086
+
1087
+ Checks this machine and says which part is missing, in one screen.
1088
+
1089
+ ```bash
1090
+ agents-city doctor
1091
+ ```
1092
+
1093
+ It reports the tools it needs (python3, tmux, bash, git, node, and `gh` as
1094
+ optional), which agent runtimes are installed, **which cage this kernel gives
1095
+ you** — seatbelt, bubblewrap, or none and why — the selected city and its card,
1096
+ whether the Hall bundle is built, and whether a newer version is published. It
1097
+ exits non-zero when something is broken, so it works in a script too.
1098
+
1099
+ Passed a config file instead, it keeps its older job: detect an old config
1100
+ shape, explain it, and migrate it with `--fix` (leaving a backup).
1101
+
1102
+ ### `agents-city update`
1103
+
1104
+ ```bash
1105
+ agents-city update # install the newest published version
1106
+ agents-city update --check # only ask: installed vs published
1107
+ agents-city update --tag beta # follow a dist-tag
1108
+ ```
1109
+
1110
+ The check is **one GET to the public npm registry**, cached for a day under
1111
+ `~/.agents-city/.runtime/`. Nothing about your machine is sent — no identifier,
1112
+ no counter, no telemetry — and `CITY_UPDATE_CHECK=0` switches it off entirely.
1113
+ It runs only where you deliberately opened something: `doctor`, `update`, and
1114
+ the Hall (which shows one line when a release is out). A plain
1115
+ `agents-city cities` never touches the network.
1116
+
1117
+ Installed from a git checkout, `update` refuses and tells you the command that
1118
+ fits your install instead of running `npm install -g` over your working copy.
1119
+
1120
+ ### `agents-city test`
1121
+
1122
+ Runs checkout tests. With no arguments it runs every suite; with names it runs
1123
+ only those suites.
1124
+
1125
+ ```bash
1126
+ agents-city test
1127
+ agents-city test seat runtime-ui
1128
+ agents-city test committee stress benchmark
1129
+ ```
1130
+
1131
+ Available suites:
1132
+
1133
+ ```text
1134
+ widgets card parcels domains serve seat cities channel committee live-feed
1135
+ runtime runtime-ui runtime-failures stress adapter benchmark contracts exit
1136
+ cage broker launch
1137
+ ```
1138
+
1139
+ This command is intended for contributors or local tarball validation. Normal
1140
+ use does not require running tests at every startup.
1141
+
1142
+ ## Committee: complete workflow
1143
+
1144
+ The committee behaves like a management committee: the seat frames and chairs
1145
+ the decision; specialists contribute evidence from their repos; nobody opens a
1146
+ lateral conversation; the seat integrates and another identity verifies.
1147
+
1148
+ ```text
1149
+ open
1150
+ └─ collecting: independent, hidden positions
1151
+ ├─ missing replies + proceedWithout ─┐
1152
+ └─ all reply -> review │
1153
+ v
1154
+ synthesize
1155
+
1156
+ v
1157
+ deliberating
1158
+ ┌─ bounded floor ─┐
1159
+ └─ request/reply ┘
1160
+
1161
+ decide
1162
+
1163
+ v
1164
+ verifying
1165
+ ┌─ fail ─└─ pass
1166
+ v v
1167
+ verification_failed verified
1168
+ │ │
1169
+ replan close
1170
+ │ │
1171
+ └─> review closed
1172
+ ```
1173
+
1174
+ ### 1. Prepare the brief
1175
+
1176
+ A good question names a decision, not merely a topic. The desired outcome says
1177
+ what the committee must produce; `definitionOfDone` lists observable conditions.
1178
+ Select only repositories capable of producing relevant evidence.
1179
+
1180
+ | `open` field | Required | Values/meaning |
1181
+ |---|---|---|
1182
+ | `question` | yes | exact decision |
1183
+ | `desiredOutcome` | yes | concrete expected result |
1184
+ | `context` | no | minimum necessary facts |
1185
+ | `constraints` | no | time, cost, security, or policy boundaries |
1186
+ | `definitionOfDone` | yes, list | observable acceptance conditions |
1187
+ | `authority` | no | `recommend`, `decide`, or `execute`; default `recommend` |
1188
+ | `participants` | yes, list | repo actor names in this city |
1189
+ | `maxRebuttals` | no | integer 0–5; default 2 per member |
1190
+
1191
+ `authority` records the mandate; it does not change technical ACLs.
1192
+
1193
+ ### 2. Collect isolated positions
1194
+
1195
+ Each participant receives the same brief and responds once:
1196
+
1197
+ ```bash
1198
+ agents-city committee respond "$DELIBERATION_ID" \
1199
+ --stance conditional \
1200
+ --recommendation "Ship to 10% first" \
1201
+ --evidence "npm test: 844 checks passed" \
1202
+ --expected-impact "Detect regressions before full rollout" \
1203
+ --visible-when "After 30 minutes of telemetry" \
1204
+ --withdraw-if "The migration is not reversible" \
1205
+ --risk "Insufficient canary capacity" \
1206
+ --unknown "First-hour production load"
1207
+ ```
1208
+
1209
+ `stance` is `support`, `oppose`, `conditional`, or `abstain`. `evidence` is
1210
+ required and repeatable. The runtime executes the response inside the repo
1211
+ window under its real identity. Until the barrier opens, the seat sees progress,
1212
+ not initial-position contents; this reduces anchoring.
1213
+
1214
+ ### 3. Synthesise without voting
1215
+
1216
+ Once all positions are ready, the seat integrates evidence:
1217
+
1218
+ ```bash
1219
+ agents-city committee synthesize "$DELIBERATION_ID" \
1220
+ --summary "There is agreement on a reversible canary" \
1221
+ --agreement "The migration needs a tested rollback" \
1222
+ --conflict "10% versus 25% initial traffic" \
1223
+ --unknown "Capacity at expected peak"
1224
+ ```
1225
+
1226
+ If a member is missing, it cannot simply be ignored:
1227
+
1228
+ ```bash
1229
+ agents-city committee synthesize "$DELIBERATION_ID" \
1230
+ --summary "Provisional synthesis" \
1231
+ --proceed-without "QA is offline; the deadline is today and rollback remains available"
1232
+ ```
1233
+
1234
+ The decision integrates evidence, impact, and withdrawal conditions rather than
1235
+ counting votes.
1236
+
1237
+ ### 4. Request and grant the floor
1238
+
1239
+ After synthesis, a member may reply only with an admitted basis:
1240
+
1241
+ ```bash
1242
+ agents-city committee floor-request "$DELIBERATION_ID" \
1243
+ --basis new_evidence \
1244
+ --reason "The canary failed its rollback test" \
1245
+ --evidence "artifacts/rollback.log: exit 1"
1246
+ ```
1247
+
1248
+ `basis` accepts `new_evidence`, `contradiction`, `risk`, or `dependency`. The
1249
+ seat resolves the returned `requestId`:
1250
+
1251
+ ```bash
1252
+ agents-city committee floor-grant "$DELIBERATION_ID" --request-id "$REQUEST_ID"
1253
+ # or:
1254
+ agents-city committee floor-deny "$DELIBERATION_ID" \
1255
+ --request-id "$REQUEST_ID" \
1256
+ --reason "The evidence is already in the synthesis"
1257
+ ```
1258
+
1259
+ Once granted, that member has exactly one reply and releases the floor by using it:
1260
+
1261
+ ```bash
1262
+ agents-city committee reply "$DELIBERATION_ID" \
1263
+ --claim "Shipping with the current script is unsafe" \
1264
+ --evidence "artifacts/rollback.log: exit 1" \
1265
+ --consequence "Block until fixed and rerun rollback"
1266
+ ```
1267
+
1268
+ The reply reaches the seat **and is heard by the whole committee**. Other members
1269
+ do not answer the speaker directly: if one finds new evidence, a contradiction,
1270
+ a material risk, or a dependency, it asks the seat for another turn. The seat
1271
+ grants or denies it, and only then may that agent speak. This is real specialist
1272
+ conversation mediated like an executive committee, not an all-to-all chat. Two
1273
+ active turns cannot coexist; every grant permits one intervention;
1274
+ `maxRebuttals` bounds the cascade per member; and the seat must resolve every
1275
+ pending request before deciding.
1276
+
1277
+ ### 5. Decide and attribute
1278
+
1279
+ ```bash
1280
+ agents-city committee decide "$DELIBERATION_ID" \
1281
+ --outcome "Fix rollback and ship a 10% canary" \
1282
+ --rationale "This limits impact and satisfies reversibility" \
1283
+ --owner "Release owner" \
1284
+ --executor api \
1285
+ --verifier qa \
1286
+ --verification-question "Do rollback and canary pass end to end?" \
1287
+ --selected-evidence "full suite is green" \
1288
+ --selected-evidence "reproducible rollback failure" \
1289
+ --decisive-contributors qa \
1290
+ --rejected-option "Immediate full rollout" \
1291
+ --dissent "web prefers a 25% canary" \
1292
+ --reopen-if "5xx errors exceed 1% for five minutes"
1293
+ ```
1294
+
1295
+ `selectedEvidence`, `decisiveContributors`, and `reopenIf` are required. If
1296
+ another identity is available, `verifier` cannot equal `executor`. Dissent stays
1297
+ in the act even when it does not change the decision. Use JSON input when more
1298
+ than one decisive contributor must be recorded.
1299
+
1300
+ ### 6. Verify, replan, or close
1301
+
1302
+ Only the assigned verifier may run:
1303
+
1304
+ ```bash
1305
+ agents-city committee verify "$DELIBERATION_ID" \
1306
+ --result pass \
1307
+ --evidence "artifacts/e2e-rollback.txt" \
1308
+ --check "canary returns 200" \
1309
+ --check "rollback restores the previous version" \
1310
+ --residual-risk "The first hour at full load remains unobserved"
1311
+ ```
1312
+
1313
+ After `fail`, the seat must replan and then synthesise/decide again:
1314
+
1315
+ ```bash
1316
+ agents-city committee replan "$DELIBERATION_ID" \
1317
+ --reason "Rollback still leaves an incompatible schema"
1318
+ ```
1319
+
1320
+ After `pass`, the seat may close:
1321
+
1322
+ ```bash
1323
+ agents-city committee close "$DELIBERATION_ID" \
1324
+ --summary "Canary verified; rollout authorised" \
1325
+ --learning "Test rollback before fixing a release window" \
1326
+ --followup "Watch 5xx rates for the first hour"
1327
+ ```
1328
+
1329
+ A deliberation cannot close without reproducible passing verification. If it is
1330
+ no longer relevant, the seat may cancel it:
1331
+
1332
+ ```bash
1333
+ agents-city committee cancel "$DELIBERATION_ID" \
1334
+ --reason "The release was replaced by another candidate"
1335
+ ```
1336
+
1337
+ State, events, and a readable act remain in `deliberations/`. `history`
1338
+ summarises recent decisions and decisive contributions to expose repeated
1339
+ influence. That count is a review signal, not automatic evidence of capture.
1340
+
1341
+ ## Claude `/city:` commands
1342
+
1343
+ These commands come from the Claude plugin. They do not exist inside Codex,
1344
+ OpenCode, or Kimi TUIs; use the equivalent `agents-city` terminal commands there.
1345
+
1346
+ | Command | Use case |
1347
+ |---|---|
1348
+ | `/city:setup [--city N] [--tui] [--demo]` | create/open a city through the shared flow |
1349
+ | `/city:join [--domain D\|--role R\|--repos\|--agent-roles\|--goal\|--engines]` | compatibility name for configuring the seat; does not add a person |
1350
+ | `/city:session [--no-yolo] [--only a,b]` | open or resume this city's tmux |
1351
+ | `/city:settings [domain\|role\|repos\|agent-roles\|goal\|engines\|roads\|skills]` | read or change one configuration area |
1352
+ | `/city:goals` | show or edit the current goal |
1353
+ | `/city:committee QUESTION` | prepare and open a chaired deliberation |
1354
+ | `/city:committee status ID` | inspect the next legal transition |
1355
+ | `/city:round [--to owner/city] [--since DATE]` | compare goal and local evidence; consult relevant roads |
1356
+ | `/city:notice [--pr N\|--since REF] [--dry]` | notify only affected cities about a verified change |
1357
+ | `/city:propose owner/city [SUBJECT]` | send an evidence-backed proposal |
1358
+ | `/city:team` | historical alias: list cities, active city, repos, and roads; not people |
1359
+ | `/city:exit [CITY] [--dry-run]` | show or close managed processes |
1360
+
1361
+ `/city:notice --dry` sends nothing. `/city:round` and `/city:propose` can only use
1362
+ destinations present in `road list`. A reply from another city informs the seat;
1363
+ it never gains authority to command a local repo directly.
1364
+
1365
+ ## Use-case cookbook
1366
+
1367
+ ### Case 1: start from zero with one city and Claude
1368
+
1369
+ ```bash
1370
+ cd /path/to/agents-city
1371
+ npm pack
1372
+ npm install -g ./agents-city-*.tgz
1373
+ agents-city seat
1374
+ ```
1375
+
1376
+ 1. Choose the domain.
1377
+ 2. Choose the seat role.
1378
+ 3. Select repositories or continue with none.
1379
+ 4. Define or skip the goal.
1380
+ 5. Press Enter in the runtime picker to keep Claude.
1381
+
1382
+ Result: a `home` city, an `<owner>-home` session, one `seat` window, and one
1383
+ window per selected local repo. Agents City keeps one official Claude Code
1384
+ process per window and feeds it through persistent `stream-json`; it does not
1385
+ request a custom Channel or require admin/per-window approval.
1386
+
1387
+ ### Case 2: use Codex as the main seat
1388
+
1389
+ ```bash
1390
+ agents-city seat --engines
1391
+ ```
1392
+
1393
+ Choose Codex on the `seat` row, confirm the other rows, and open the city. Agents
1394
+ City starts `codex app-server` on loopback and opens the official TUI with
1395
+ `codex --remote`. The TUI creates its persisted thread; the gateway detects only
1396
+ the new thread for that working directory and joins it through `thread/resume`.
1397
+ You should type directly into Codex. A `city>` prompt in a Codex seat means an
1398
+ old version or a failed launch; it is not the intended Codex interface.
1399
+
1400
+ ### Case 3: mix runtimes per repository
1401
+
1402
+ ```bash
1403
+ agents-city seat --city product --engines
1404
+ ```
1405
+
1406
+ Example selection:
1407
+
1408
+ ```text
1409
+ seat Codex
1410
+ api Claude / opus model / high effort
1411
+ web Codex
1412
+ analytics OpenCode
1413
+ research Kimi
1414
+ ```
1415
+
1416
+ Each choice persists in the card. The next `seat` run reuses it. To test another
1417
+ combination without retaining old processes:
1418
+
1419
+ ```bash
1420
+ agents-city exit product --dry-run
1421
+ agents-city exit product
1422
+ agents-city seat --city product --engines
1423
+ ```
1424
+
1425
+ ### Case 4: use a local model through OpenCode
1426
+
1427
+ Agents City does not choose OpenCode's provider. In the runtime picker, select
1428
+ OpenCode and enter the command/model accepted by your installation, for example:
1429
+
1430
+ ```text
1431
+ opencode -m lmstudio/qwen3-coder
1432
+ ```
1433
+
1434
+ Validate it independently first:
1435
+
1436
+ ```bash
1437
+ opencode -m lmstudio/qwen3-coder
1438
+ ```
1439
+
1440
+ Then run `agents-city seat --engines`. Bus delivery reaches OpenCode through
1441
+ HTTP/SSE; the model may be local while Agents City keeps the same typed envelope.
1442
+
1443
+ ### Case 5: use a CLI that is not natively integrated yet
1444
+
1445
+ Choose “another command (terminal fallback)” under `--engines` and enter, for
1446
+ example, `gemini`. Agents City stores:
1447
+
1448
+ ```yaml
1449
+ runs.api: terminal:gemini
1450
+ ```
1451
+
1452
+ The prefix makes it explicit that this window may need visible tmux injection.
1453
+ An unknown command without `terminal:` is rejected when reading a hand-edited
1454
+ card; known runtimes never silently degrade to terminal transport.
1455
+
1456
+ ### Case 6: create several cities for the same user
1457
+
1458
+ ```bash
1459
+ agents-city cities create product
1460
+ agents-city seat --city product
1461
+
1462
+ agents-city cities create client-a
1463
+ agents-city seat --city client-a
1464
+
1465
+ agents-city cities list
1466
+ ```
1467
+
1468
+ Expected result:
1469
+
1470
+ ```text
1471
+ ~/.agents-city/<owner>/product/
1472
+ ~/.agents-city/<owner>/client-a/
1473
+ ```
1474
+
1475
+ Each city has its own domain, role, goal, repos, recognised skills,
1476
+ deliberations, roads, runtime, and tmux session. `home` has no special privilege.
1477
+
1478
+ ### Case 7: give every repo a different speciality
1479
+
1480
+ ```bash
1481
+ agents-city seat --city product --agent-roles
1482
+ ```
1483
+
1484
+ Assign `po` to the main repo, `seo` to the portfolio, and `data-engineer` to the
1485
+ pipeline even when the seat domain is `software`. The picker can search roles
1486
+ from other domains. Speciality changes perspective and editable context; all
1487
+ repo agents retain technical `member` authority.
1488
+
1489
+ ### Case 8: work without a preloaded profile
1490
+
1491
+ ```bash
1492
+ agents-city seat --city lab --role blank
1493
+ agents-city seat --city lab --agent-roles
1494
+ ```
1495
+
1496
+ Also select `blank` for repos that should receive no profile. No role knowledge
1497
+ file is created and no hidden role is inferred. Repo instructions and skills
1498
+ continue to work normally.
1499
+
1500
+ ### Case 9: connect two local cities
1501
+
1502
+ ```bash
1503
+ agents-city road connect product client-a
1504
+ agents-city road list product
1505
+ agents-city road list client-a
1506
+ ```
1507
+
1508
+ The road is written at both ends. Start both cities and, from one seat:
1509
+
1510
+ ```bash
1511
+ CITY_OWNER=alice
1512
+ AGENTS_CITY_DATA="$HOME/.agents-city/$CITY_OWNER/product" \
1513
+ agents-city bus send "$CITY_OWNER/client-a" "Does this change affect your contract?"
1514
+ ```
1515
+
1516
+ Inside a normal session, you do not need to set `AGENTS_CITY_DATA`; it is already
1517
+ injected into each window. The example makes it explicit for an outside terminal.
1518
+
1519
+ ### Case 10: connect cities belonging to different machines or people
1520
+
1521
+ On machine A:
1522
+
1523
+ ```bash
1524
+ agents-city road invite product > product.invitation.json
1525
+ ```
1526
+
1527
+ Transfer that JSON over an appropriate channel. It contains no bus token. On
1528
+ machine B:
1529
+
1530
+ ```bash
1531
+ agents-city road connect research product.invitation.json
1532
+ agents-city road invite research > research.invitation.json
1533
+ ```
1534
+
1535
+ Return B's invitation and accept it on A:
1536
+
1537
+ ```bash
1538
+ agents-city road connect product research.invitation.json
1539
+ ```
1540
+
1541
+ Both machines need the same compatible remote transport and valid credentials
1542
+ through `CITY_BUS_URL`/`CITY_BUS_TOKEN`. Invitations only declare the allowlist;
1543
+ they neither deploy infrastructure nor share secrets. See
1544
+ [docs/self-host.md](docs/self-host.md) for the remote Worker.
1545
+
1546
+ ### Case 11: ask several repos for a decision without a group chat
1547
+
1548
+ From a Claude seat:
1549
+
1550
+ ```text
1551
+ /city:committee Can we enable the new migration in production?
1552
+ ```
1553
+
1554
+ From any other runtime, prepare the brief and use:
1555
+
1556
+ ```bash
1557
+ agents-city committee open --input migration-decision.json
1558
+ ```
1559
+
1560
+ The seat selects only relevant repos. Initial responses stay isolated; synthesis,
1561
+ floor requests, an attributed decision, and verification follow. Use
1562
+ `agents-city committee show ID` to inspect state, not to bypass the next legal
1563
+ actor.
1564
+
1565
+ ### Case 12: start only one or two repos in a large city
1566
+
1567
+ ```bash
1568
+ agents-city seat --city product --only api
1569
+ agents-city seat --city product --only api,web
1570
+ ```
1571
+
1572
+ `--only` filters windows for this launch; it does not remove repos or roles from
1573
+ the card. If a session with another composition already exists, close it first:
1574
+
1575
+ ```bash
1576
+ agents-city exit product --dry-run
1577
+ agents-city exit product
1578
+ ```
1579
+
1580
+ ### Case 13: select or clone private GitHub repositories
1581
+
1582
+ ```bash
1583
+ agents-city seat --repos
1584
+ ```
1585
+
1586
+ Choose “my GitHub account” or “GitHub organisation”. If `gh` is missing, the
1587
+ wizard tries to install it; if unauthenticated, it opens `gh auth login --web`.
1588
+ The browser or device code authenticates `gh`, not Agents City. Private repos
1589
+ appear only when the token has access. A selected but uncloned repo may stay on
1590
+ the card without a window or be cloned, after confirmation, beneath
1591
+ `CITY_CODE_DIR` (default `~/codigo`).
1592
+
1593
+ ### Case 14: inspect skills without installing them
1594
+
1595
+ ```bash
1596
+ agents-city skills product
1597
+ ```
1598
+
1599
+ If `api/.codex/skills/migrations/SKILL.md` appears, the repo already owns that
1600
+ skill. Agents City neither copies it into the city nor forces the agent to use
1601
+ it. Adding, editing, or removing the `SKILL.md` changes the next read without
1602
+ reinstalling Agents City.
1603
+
1604
+ ### Case 15: open only the map or the guided demo
1605
+
1606
+ ```bash
1607
+ agents-city city ~/.agents-city/<owner>/product
1608
+ agents-city demo
1609
+ ```
1610
+
1611
+ `city` renders that city's real data. `demo` opens the complete Aurora Games Hall
1612
+ and plays presentation agents over the real infrastructure without invoking
1613
+ models. Use `agents-city hall` to manage your own cities.
1614
+
1615
+ ### Case 16: measure performance and detect regressions
1616
+
1617
+ Measure the deterministic bus first, without models:
1618
+
1619
+ ```bash
1620
+ agents-city benchmark stress --agents 40 --rounds 2 --json
1621
+ ```
1622
+
1623
+ Keep the JSON as a baseline. Then, if model quota use is acceptable, measure the
1624
+ real path:
1625
+
1626
+ ```bash
1627
+ agents-city benchmark live \
1628
+ --runtime claude \
1629
+ --runtime codex \
1630
+ --runtime kimi \
1631
+ --timeout 180 \
1632
+ --json
1633
+ ```
1634
+
1635
+ Compare bus-to-runtime acceptance separately from end-to-end completion. A
1636
+ correct model response does not turn transport delay into “reasoning time”; an
1637
+ authentication failure is not counted as a fast sample.
1638
+
1639
+ ### Case 17: update without leaving old code in live sessions
1640
+
1641
+ ```bash
1642
+ cd /path/to/agents-city
1643
+ npm pack
1644
+ npm install -g ./agents-city-*.tgz
1645
+ agents-city --version
1646
+ agents-city exit product --dry-run
1647
+ agents-city exit product
1648
+ agents-city seat --city product
1649
+ ```
1650
+
1651
+ Installing a tarball does not rewrite live processes. Restarting only the target
1652
+ city avoids closing another city or an unrelated tmux session.
1653
+
1654
+ ### Case 18: clear one city's configuration and repeat onboarding
1655
+
1656
+ ```bash
1657
+ agents-city reset lab --dry-run
1658
+ agents-city reset lab
1659
+ agents-city seat --city lab
1660
+ ```
1661
+
1662
+ Reset preserves the `lab` identity, creates a backup, and does not touch repos.
1663
+ Use `exit`, not `reset`, when you only need to stop processes.
1664
+
1665
+ ## Files and environment variables
1666
+
1667
+ ### `city.yml`: city identity
1668
+
1669
+ This file stores stable identity and domain. Do not create a city by copying a
1670
+ folder and reusing its `id`; use `cities create`.
1671
+
1672
+ ```yaml
1673
+ id: city_a1b2c3d4
1674
+ name: product
1675
+ slug: product
1676
+ owner: alice
1677
+ domain: software
1678
+ seat_yolo: 1
1679
+ ```
1680
+
1681
+ The public address is derived as `owner/slug`. It is not stored as one global
1682
+ plugin identity because several cities may run concurrently. `seat_yolo: 1`
1683
+ launches the chair itself without permission prompts — set at the wizard's
1684
+ sixth question or with `agents-city seat --seat-yolo on|off`; `--no-yolo`
1685
+ still brakes the whole session.
1686
+
1687
+ ### `<owner>.md`: seat card
1688
+
1689
+ This is Markdown with frontmatter. It stores the seat role, repos, each repo
1690
+ role, goal, and runtime per window. Reduced example:
1691
+
1692
+ ```yaml
1693
+ ---
1694
+ user: alice
1695
+ name: alice
1696
+ role: cpto
1697
+ agent: alice-product-cpto
1698
+ repos: [api, web, portfolio]
1699
+ role.api: data-engineer
1700
+ role.web: dev
1701
+ role.portfolio: seo
1702
+ goals_defined: true
1703
+ runs.seat: codex
1704
+ runs.api: claude
1705
+ model.api: opus
1706
+ effort.api: high
1707
+ runs.web: codex
1708
+ runs.portfolio: terminal:gemini
1709
+ ---
1710
+ ```
1711
+
1712
+ Names after the dot use the normalised window actor: lowercase letters, digits,
1713
+ and hyphens. Prefer `seat --repos`, `--agent-roles`, `--goal`, and `--engines` to
1714
+ maintain the card safely. A malformed manual edit degrades the operating role to
1715
+ `blank` or may block startup; it is not evaluated as code.
1716
+
1717
+ The card body retains the goal and round history. Changing the goal rewrites
1718
+ only that section, not the history.
1719
+
1720
+ ### Editable knowledge
1721
+
1722
+ ```text
1723
+ domains/<domain>.md
1724
+ roles/<role>.md
1725
+ AGENTS.md
1726
+ ```
1727
+
1728
+ The first two begin as initial profiles and then belong to the city. You may
1729
+ edit, replace, or remove them. Agents City does not overwrite an existing file
1730
+ during a later configuration change. `AGENTS.md` tells runtimes how to interpret
1731
+ the city; review it after deep customisation.
1732
+
1733
+ Skills remain inside repositories and are independent of these files.
1734
+
1735
+ ### Runtime state
1736
+
1737
+ The local hub keeps ephemeral state separate from readable configuration:
1738
+
1739
+ ```text
1740
+ ~/.agents-city/.runtime/bus/<city-id>/
1741
+ ├── endpoint.json
1742
+ ├── hub.lock
1743
+ ├── road-token
1744
+ ├── actors/*.json
1745
+ ├── outbox/<actor>/*.json
1746
+ ├── road-queue/*.json
1747
+ ├── road-inbox/*.json
1748
+ └── road-history.jsonl
1749
+ ```
1750
+
1751
+ Credentials and runtime files are created with private permissions. Outboxes let
1752
+ an actor reconnect without losing an already accepted task; its ACK removes the
1753
+ pending item. Current limits are 200 pending items per queue and a 72-hour
1754
+ message lifetime. `bus inbox` consumes `road-inbox`, not append-only history.
1755
+
1756
+ ### Configurable variables
1757
+
1758
+ | Variable | Default | Use |
1759
+ |---|---|---|
1760
+ | `AGENTS_CITY_HOME` | `~/.agents-city` | root for all data and runtimes |
1761
+ | `AGENTS_CITY_USER` | resolved local identity | force an owner for tests/migrations |
1762
+ | `AGENTS_CITY_DATA` | selected city | force a city folder from an outside terminal |
1763
+ | `CITY_CODE_DIR` | `~/codigo` | destination for accepted GitHub clones |
1764
+ | `CITY_SEARCH_IN` | common home roots | colon-separated roots for local repo search |
1765
+ | `CITY_SEARCH_DEPTH` | `4` | maximum depth of that search |
1766
+ | `AGENTS_CITY_ORG` | empty | filter repositories by organisation; empty means all |
1767
+ | `CITY_SETTLE` | `8` | initial Claude startup wait in seconds |
1768
+ | `CITY_STAGGER` | `1` | extra separation per Claude window |
1769
+ | `CITY_BUS_URL` | empty | optional remote bus endpoint |
1770
+ | `CITY_BUS_TOKEN` | empty | credential for remote transport/map |
1771
+ | `AGENTS_CITY_URL` | `CITY_BUS_URL` | reporting/map endpoint when separate |
1772
+ | `CITY_DIR` | `~/.claude/channels/city-bus` | compatibility folder for `.env` and hooks |
1773
+ | `CITY_HOOKS` | `city` | `everywhere` runs the conscience hooks in every Claude session, not only city runtimes |
1774
+ | `CITY_DESKTOP` | `~/Desktop`, or the Windows desktop under WSL | where `agents-city shortcut` writes |
1775
+ | `CITY_CAGE` | `1` | `0` launches every window uncaged |
1776
+ | `CITY_CAGE_DENY` | empty | extra colon-separated paths to seal |
1777
+ | `CITY_CAGE_ALLOW_WRITE` | empty | extra colon-separated paths to keep writable |
1778
+ | `CITY_UPDATE_CHECK` | `1` | `0` never asks npm whether a newer version exists |
1779
+ | `CITY_CAGE_BWRAP` | probed | `1`/`0` answers "can this Linux build a namespace?" without probing; the launcher sets it once per city |
1780
+
1781
+ Examples:
1782
+
1783
+ ```bash
1784
+ CITY_SEARCH_IN="$HOME/clients:$HOME/code" \
1785
+ CITY_SEARCH_DEPTH=6 \
1786
+ agents-city seat --repos
1787
+
1788
+ AGENTS_CITY_HOME="$(mktemp -d)" \
1789
+ AGENTS_CITY_USER=tester \
1790
+ agents-city cities create lab
1791
+
1792
+ CITY_SETTLE=0 CITY_STAGGER=0 agents-city seat --city product
1793
+ ```
1794
+
1795
+ The local repository index is cached for one day at
1796
+ `$XDG_CACHE_HOME/agents-city/repos.tsv` or `~/.cache/agents-city/repos.tsv`. The
1797
+ Hall offers a refresh. From a terminal, if you change `CITY_SEARCH_IN` while the
1798
+ cache is still valid, remove **only that index file** and repeat `seat --repos`.
1799
+
1800
+ Transport setting precedence is:
1801
+
1802
+ 1. an environment variable already present;
1803
+ 2. a recognised key in `~/.claude/channels/city-bus/.env`;
1804
+ 3. for the token only on macOS, the Keychain service `city@agents-city`.
1805
+
1806
+ The `.env` loader accepts known keys only and cannot redefine `PATH`. The session
1807
+ injects `CITY_ADDRESS`, `CITY_BUS_ACTOR`, `CITY_RUNTIME_KIND`, and
1808
+ `CITY_AGENT_ROLE` to authenticate each window; do not store them as global
1809
+ configuration.
1810
+
1811
+ ## Security and trust boundaries
1812
+
1813
+ - The plugin's conscience stays inside the city: every hook checks for a city
1814
+ identity (`CITY_BUS_ACTOR`) first and is silent in plain Claude sessions —
1815
+ installing the plugin does not enrol every conversation on the machine.
1816
+ `CITY_HOOKS=everywhere` is the explicit machine-wide opt-in.
1817
+ - Each city's hub binds a random port on `127.0.0.1`; it is not published to the
1818
+ LAN.
1819
+ - Every actor has its own token and role. The seat is `chair`; each repo is
1820
+ `member`.
1821
+ - Members receive no road credentials, cannot call `road.send`, and have no
1822
+ member-to-member route.
1823
+ - Only a `seat -> seat` envelope addressed to a declared road may leave a city.
1824
+ - An invitation contains identity/address, never the remote token.
1825
+ - Protocol text fields are limited to 64,000 characters and IDs/paths are
1826
+ normalised before use.
1827
+ - Known runtimes use native APIs. Only `terminal:<command>` permits the visible
1828
+ tmux fallback.
1829
+ - `report` and `tokens` are dry-run by default; sending requires `--push`.
1830
+ - `reset` and `exit` have `--dry-run`; reset creates a backup, and neither should
1831
+ touch unrelated tmux sessions.
1832
+
1833
+ ### The cage, the broker, and the audit chain
1834
+
1835
+ Yolo mode stays — a committee cannot work if every bus command needs a human —
1836
+ but "do not ask" and "touch everything" are different axes, and only the first
1837
+ one is yolo. On macOS Claude, OpenCode and Kimi repo windows launch inside a
1838
+ generated seatbelt profile: writes land only in their own repo and runtime state, and the files
1839
+ that turn a prompt injection into a credential theft (`~/.ssh`,
1840
+ `~/.git-credentials`, `~/.aws`, gh and cloud configs, remote road tokens, and
1841
+ Claude Code's own `~/.claude/.credentials.json`) are
1842
+ sealed at the kernel — reads and writes, children and grandchildren included.
1843
+ The agent is never asked anything; forbidden paths simply do not exist for it.
1844
+ Codex instead applies its native `workspace-write` sandbox and is not wrapped
1845
+ in seatbelt: MCP workers such as `node_repl` apply their own sandbox, and macOS
1846
+ rejects that operation inside an already-caged process. `CITY_CAGE=0`
1847
+ deliberately disables the applicable confinement layer.
1848
+
1849
+ **On Linux the cage is bubblewrap.** The seal is built the way Linux builds
1850
+ these — a mount namespace where the sealed paths are simply not mounted, so
1851
+ `~/.ssh` inside the cage is an empty directory and `~/.git-credentials` reads as
1852
+ nothing. Same promise as the seatbelt, different mechanism, and `bin/test-cage.py`
1853
+ proves it against a real namespace on every Linux CI run: the planted key is
1854
+ unreadable, the repo stays writable, a write into a sealed directory never
1855
+ reaches the disk, and a grandchild process cannot escape.
1856
+
1857
+ It needs `bubblewrap` installed (`apt install bubblewrap`) and unprivileged user
1858
+ namespaces enabled — Agents City checks that bwrap can really build one rather
1859
+ than trusting that the binary exists, and a machine where it cannot says so and
1860
+ launches uncaged, exactly as before. There is no confinement on other platforms:
1861
+ without a cage, run agents over work you would be comfortable running a script
1862
+ over.
1863
+
1864
+ Because a caged window cannot read the `gh` token, PRs and pushes go through
1865
+ an opt-in credential broker (`CITY_BROKER=1`): a small owner-side process that
1866
+ holds the credentials, accepts per-window tokens bound to a single repo,
1867
+ refuses any action on the default branch, and writes every request — served or
1868
+ refused — to a hash-chained audit log the windows cannot touch. One rewritten
1869
+ byte breaks the chain and `broker.py verify` says so. The live kernel checks
1870
+ and both broker paths, happy and refused, run in `bin/test-cage.py` and
1871
+ `bin/test-broker.py`. The full model, its dials and its honest limits are in
1872
+ [docs/security.md](docs/security.md).
1873
+
1874
+ Agents City isolates protocol responsibilities; it is not a hostile sandbox
1875
+ against the operating-system owner. Another process running as your user can
1876
+ read your repos, attach to tmux, or read private files in your home. Use separate
1877
+ accounts, VMs, or containers for untrusted code, and also apply each provider
1878
+ CLI's permission controls.
1879
+
1880
+ A remote bus expands the trust surface. Deploy HTTPS/WSS, rotate tokens, limit
1881
+ scopes, and read [docs/self-host.md](docs/self-host.md). A road authorises message
1882
+ exchange between seats; it neither authorises execution of received commands nor
1883
+ grants remote filesystem access.
1884
+
1885
+ ## Troubleshooting
1886
+
1887
+ ### `agents-city seat` returns to an already open session
1888
+
1889
+ This is expected. The tmux name is stable per owner/city. Detach with `Ctrl-b d`
1890
+ or inspect before closing:
1891
+
1892
+ ```bash
1893
+ agents-city exit <city> --dry-run
1894
+ ```
1895
+
1896
+ ### I updated the package but still see the old behaviour
1897
+
1898
+ A new global npm package does not replace live processes or tmux sessions. Check
1899
+ the binary being executed and restart only the city:
1900
+
1901
+ ```bash
1902
+ type -a agents-city
1903
+ agents-city --version
1904
+ npm root -g
1905
+ agents-city exit <city> --dry-run
1906
+ agents-city exit <city>
1907
+ agents-city seat --city <city>
1908
+ ```
1909
+
1910
+ With `fnm`, `nvm`, or `asdf`, every Node version may have a different global
1911
+ package set. Install the tarball under the Node version that will execute it.
1912
+
1913
+ ### Codex shows `city>` instead of its TUI
1914
+
1915
+ Codex should show its official TUI. Verify a Codex version supporting
1916
+ `app-server`/`--remote`, update Agents City, and restart the city. Startup logs
1917
+ should show the WebSocket endpoint, the wait for the TUI thread, `Codex TUI
1918
+ thread ... adopted over WebSocket`, and bus authentication. After the first turn
1919
+ it will also show `joined over WebSocket`. `city>` is currently the expected
1920
+ console for OpenCode and Kimi.
1921
+
1922
+ If you see `Failed to resume session ... no rollout found`, you are running the
1923
+ broken `0.3.0-beta.10` path, which tried to open a newly created thread through
1924
+ `codex resume --remote`. `0.3.0-beta.11` opened the right TUI but could wait
1925
+ indefinitely for an empty thread to materialize its first rollout. Install
1926
+ `0.3.0-beta.21` or later and restart only that
1927
+ city with `agents-city exit <city>` followed by `agents-city seat --city <city>`.
1928
+
1929
+ ### The `seat` window prints `fatal: not a git repository`
1930
+
1931
+ The seat lives in the city data folder, which need not be a Git repository.
1932
+ Current launchers skip sync there. Seeing this error before Codex starts usually
1933
+ means the session still runs an old launcher: update, run `exit <city>`, and open
1934
+ it again. A real repo window without `.git` should be diagnosed separately.
1935
+
1936
+ ### Claude says the plugin is not on the Channels allowlist
1937
+
1938
+ Agents City `0.3.0-beta.21` and later do not launch Claude with `--channels`.
1939
+ That message therefore identifies an old live session or a manual Channel
1940
+ invocation, not missing personal-account configuration. Do **not** create a
1941
+ machine-wide managed settings file or use `sudo`. Update Agents City, verify the
1942
+ version, then restart only the affected city with `agents-city exit <city>` and
1943
+ `agents-city seat --city <city>`. The normal log should say
1944
+ `Claude Code ready over persistent stream-json` and
1945
+ `claude-stream-json ready`.
1946
+
1947
+ ### Claude shows `Claude API` or asks for usage credits on a Team/Max account
1948
+
1949
+ An inherited `CLAUDE_CODE_OAUTH_TOKEN`, API key, gateway URL, Bedrock, Vertex,
1950
+ or Foundry selector can take precedence over the healthy Claude.ai login stored
1951
+ by the CLI. Inspect names only — never print credential values:
1952
+
1953
+ ```bash
1954
+ claude auth status
1955
+ tmux show-environment -g | cut -d= -f1 | \
1956
+ grep -E 'CLAUDE_CODE_OAUTH_TOKEN|ANTHROPIC_(API_KEY|AUTH_TOKEN|BASE_URL)|CLAUDE_CODE_USE_'
1957
+ env -u CLAUDE_CODE_OAUTH_TOKEN \
1958
+ -u ANTHROPIC_API_KEY -u ANTHROPIC_AUTH_TOKEN -u ANTHROPIC_BASE_URL \
1959
+ -u CLAUDE_CODE_USE_BEDROCK -u CLAUDE_CODE_USE_VERTEX \
1960
+ -u CLAUDE_CODE_USE_FOUNDRY claude auth status
1961
+ ```
1962
+
1963
+ If the last command reports `authMethod: claude.ai`, Agents City uses that login
1964
+ and removes only those overrides from each new city child. It never deletes a
1965
+ token, logs out, or rewrites the credential store. Restart only that city after
1966
+ updating. To deliberately use environment/API authentication instead:
1967
+
1968
+ ```bash
1969
+ CITY_CLAUDE_AUTH=environment agents-city seat --city <city>
1970
+ ```
1971
+
1972
+ ### Codex tools fail with `sandbox_apply: Operation not permitted`
1973
+
1974
+ This is the macOS nested-sandbox failure: an older launcher put Codex's own
1975
+ sandbox (or an MCP worker sandbox) inside the city's seatbelt cage. Install the
1976
+ current beta and restart only the affected city. Codex now runs without the
1977
+ outer seatbelt and keeps its native `workspace-write` confinement, so repo reads
1978
+ and tools work without a nested `sandbox_apply`.
1979
+
1980
+ ### Codex reports an MCP executable is missing
1981
+
1982
+ Codex inherits your global MCP registry. Agents City checks that registry
1983
+ without printing its environment values. If an enabled stdio MCP points to an
1984
+ executable that provably does not exist, it is disabled only for that city
1985
+ process; `~/.codex/config.toml` is not changed and healthy MCPs remain enabled.
1986
+ Inspect the scoped decision with:
1987
+
1988
+ ```bash
1989
+ agents-city logs --diagnostics | grep codex.mcp.unavailable.disabled
1990
+ ```
1991
+
1992
+ Fix or remove the original global entry later with `codex mcp`; a URL failure
1993
+ or another uncertain startup error is left visible rather than guessed away.
1994
+
1995
+ ### Text or JSON appears to be pasted into a window
1996
+
1997
+ Claude, Codex, OpenCode, and Kimi do not use the clipboard or `tmux paste`.
1998
+ Inspect the card through:
1999
+
2000
+ ```bash
2001
+ agents-city seat --engines
2002
+ ```
2003
+
2004
+ If that row uses `terminal:<command>`, you selected the compatibility adapter and
2005
+ visible injection is expected. If a known runtime appears that way, select its
2006
+ native runtime again.
2007
+
2008
+ ### A Claude window shows a command ending in `--da`, `--dangerously`, or `-`
2009
+
2010
+ That is a truncated legacy launch command, not a Claude or WebSocket message.
2011
+ Current versions write the full command into a private audited launcher and type
2012
+ only its short path into tmux. Update the package and restart only that city:
2013
+
2014
+ ```bash
2015
+ agents-city --version
2016
+ agents-city exit <city> --dry-run
2017
+ agents-city exit <city>
2018
+ agents-city seat --city <city>
2019
+ agents-city logs --diagnostics --follow
2020
+ ```
2021
+
2022
+ A failed launcher records `launch.failed`, prints its exit code and log path in
2023
+ the pane, and emits `runtime.launch.failed` to City live. It never logs the full
2024
+ command or credentials.
2025
+
2026
+ ### My repositories do not appear
2027
+
2028
+ ```bash
2029
+ command -v git
2030
+ git -C /path/to/repo remote get-url origin
2031
+ CITY_SEARCH_IN="/root/one:/root/two" \
2032
+ CITY_SEARCH_DEPTH=6 \
2033
+ agents-city seat --repos
2034
+ ```
2035
+
2036
+ Discovery requires `.git` (a directory or worktree file) and an `origin` remote.
2037
+ If roots just changed, refresh in the Hall or remove only
2038
+ `~/.cache/agents-city/repos.tsv`. `AGENTS_CITY_ORG` may be filtering the repo;
2039
+ leave it empty to index every remote.
2040
+
2041
+ ### GitHub does not show private repos or organisations
2042
+
2043
+ ```bash
2044
+ gh auth status
2045
+ gh api user --jq .login
2046
+ gh auth refresh -s read:org
2047
+ ```
2048
+
2049
+ Test access directly with `gh`; Agents City only consumes that session. An SSO
2050
+ organisation may require authorising the token in GitHub. Disk selection always
2051
+ works without OAuth.
2052
+
2053
+ ### A repo on the card gets no window
2054
+
2055
+ The card may reference a repo that is not cloned. Run `seat --repos` and accept
2056
+ the clone, or clone it manually under an indexed root. If two names normalise to
2057
+ the same actor (for example, they differ only in punctuation), Agents City
2058
+ rejects the collision instead of mixing credentials.
2059
+
2060
+ ### The bus says it is already starting or running
2061
+
2062
+ Do not delete locks while a process is alive. Inspect scope:
2063
+
2064
+ ```bash
2065
+ agents-city exit <city> --dry-run
2066
+ ```
2067
+
2068
+ If the expected session exists, reattach with `seat`. If it is a managed orphan,
2069
+ `exit <city>` stops it. The hub recovers a stale lock whose PID no longer exists;
2070
+ a newly created unreadable lock is preserved to prevent two simultaneous hubs.
2071
+
2072
+ ### An agent was offline when a task arrived
2073
+
2074
+ Accepted internal envelopes remain in its outbox until ACK, with a 72-hour TTL.
2075
+ Reopen the same city/runtime to drain the queue. If the provider rejected the
2076
+ task, delivery remains failed and no ACK is invented. Use logs and the runtime
2077
+ benchmark to distinguish native rejection, authentication, and latency.
2078
+
2079
+ ### A local road exists but the destination is offline
2080
+
2081
+ `road connect` configures reachability; it does not start the other city. Open
2082
+ both sessions:
2083
+
2084
+ ```bash
2085
+ agents-city seat --city source
2086
+ agents-city seat --city destination
2087
+ ```
2088
+
2089
+ A remote road additionally requires valid `CITY_BUS_URL` and `CITY_BUS_TOKEN` at
2090
+ both ends. A queued message does not mean the destination accepted or agreed.
2091
+
2092
+ ### The committee rejects my command
2093
+
2094
+ Inspect state and schema first:
2095
+
2096
+ ```bash
2097
+ agents-city committee show <id>
2098
+ agents-city committee schema <verb>
2099
+ ```
2100
+
2101
+ Common rejections are deliberate: the seat tries to respond as a member; a
2102
+ member tries to decide; a position is missing without `--proceed-without`; a
2103
+ floor request remains pending; verifier equals executor when another identity is
2104
+ available; or closure is attempted before a passing verification.
2105
+
2106
+ ### I want to start over
2107
+
2108
+ Do not delete all of `~/.agents-city` when only one city needs a reset:
2109
+
2110
+ ```bash
2111
+ agents-city reset <city> --dry-run
2112
+ agents-city reset <city>
2113
+ agents-city seat --city <city>
2114
+ ```
2115
+
2116
+ The output names the backup. Use `exit` when you only need to restart processes.
2117
+
2118
+ ## Development and testing
2119
+
2120
+ ### Full validation
2121
+
2122
+ ```bash
2123
+ git clone https://github.com/jlcases/agents-city.git
2124
+ cd agents-city
2125
+ npm install
2126
+ npm test
2127
+ ```
2128
+
2129
+ `npm test` runs `./bin/test`: Python/shell suites, buses and native runtimes with
2130
+ deterministic doubles, one throwaway tmux for unknown fallback only, a 40-actor
2131
+ stress test, cross-component contracts, and tarball allowlist checks. The default
2132
+ run is offline and uses temporary homes/repos.
2133
+
2134
+ Focused tests:
2135
+
2136
+ ```bash
2137
+ ./bin/test seat runtime-ui
2138
+ ./bin/test channel committee runtime runtime-failures
2139
+ ./bin/test stress benchmark contracts exit
2140
+ ```
2141
+
2142
+ ### Typecheck and bundles
2143
+
2144
+ ```bash
2145
+ cd city/web
2146
+ npm run typecheck
2147
+ npm run build
2148
+
2149
+ cd ../../plugin/channel
2150
+ npm run typecheck
2151
+ npm run build
2152
+ ```
2153
+
2154
+ Generated `plugin/channel` JavaScript ships in the package. Editing TypeScript
2155
+ without rebuilding leaves the tarball running old code.
2156
+
2157
+ ### Validate the exact package without publishing
2158
+
2159
+ ```bash
2160
+ npm pack --dry-run
2161
+ npm pack
2162
+
2163
+ CITY_TEST_PREFIX="$(mktemp -d)"
2164
+ npm install -g --prefix "$CITY_TEST_PREFIX" ./agents-city-*.tgz
2165
+ "$CITY_TEST_PREFIX/bin/agents-city" --version
2166
+ "$CITY_TEST_PREFIX/bin/agents-city" --help
2167
+ ```
2168
+
2169
+ For onboarding tests, also use temporary `HOME`, `AGENTS_CITY_HOME`, and
2170
+ `AGENTS_CITY_USER` values. Never point a suite at real city data.
2171
+
2172
+ The full matrix and invariants live in [docs/testing.md](docs/testing.md).
2173
+ Benchmarks have dedicated guides in
2174
+ [benchmarks/stress/README.md](benchmarks/stress/README.md),
2175
+ [benchmarks/latency/README.md](benchmarks/latency/README.md), and
2176
+ [benchmarks/committee/README.md](benchmarks/committee/README.md).
2177
+
2178
+ ## Editions, license, and trust
2179
+
2180
+ This repository is the **Community Edition**, licensed under
2181
+ [Apache-2.0](LICENSE): free to use, modify, self-host and build on, with an
2182
+ explicit patent grant. The license does not grant rights to the *Agents City*
2183
+ name — code travels, the name stays.
2184
+
2185
+ An **Enterprise Edition** exists on top of this core: semantic city memory
2186
+ (vector search across acts, notices and deliberations), SSO, cross-city audit
2187
+ and fleet management. It is not in this repository. Agents City is built by
2188
+ [Arkatai](https://arkatai.com), an agentic-development studio — for the
2189
+ Enterprise Edition write to <hello@arkatai.com> or open an issue tagged
2190
+ `enterprise`.
2191
+
2192
+ **No telemetry.** The product phones nobody home: everything runs on loopback
2193
+ and local files, and nothing about your work leaves the machine except what
2194
+ you configure yourself — a remote road, or a `--push` to your own worker. The
2195
+ only third-party request the web pages make is loading their typefaces from
2196
+ Google Fonts.