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
@@ -0,0 +1,39 @@
1
+ # Committee governance benchmark
2
+
3
+ This benchmark measures protocol structure: information leakage before independent
4
+ positions, lateral repo-to-repo edges, ungranted interruptions, unresolved floor
5
+ requests, and closure without independent verification. It deliberately does not
6
+ turn those properties into an answer-quality score.
7
+
8
+ The design choices follow primary findings rather than “more agents is better”:
9
+
10
+ - sparse communication can match or outperform fully connected debate at lower
11
+ cost: [Li et al., 2024](https://arxiv.org/abs/2406.11776);
12
+ - collaboration topology materially affects scaling: [Qian et al.,
13
+ 2024](https://arxiv.org/abs/2406.07155);
14
+ - majority pressure can suppress independent correction: [Wu et al.,
15
+ 2025](https://arxiv.org/abs/2511.07784);
16
+ - the best decision protocol is task-dependent, and extra rounds can hurt:
17
+ [Kaesberg et al., 2025](https://arxiv.org/abs/2502.19130);
18
+ - independent, non-communicating copies make cross-examination meaningful:
19
+ [Brown-Cohen et al., 2023](https://arxiv.org/abs/2311.14125).
20
+ - unguided homogeneous debate can cost more while degrading accuracy through
21
+ conformity, contextual fragility and plurality collapse:
22
+ [Bertalanič and Fortuna, 2026](https://arxiv.org/abs/2605.00914);
23
+ - executive-style integration fails through single-advisor capture and
24
+ historical amnesia even when plans are structurally valid:
25
+ [Dai et al., 2026](https://arxiv.org/abs/2606.17459);
26
+ - not every changed stance is conformity, so influence history is a review
27
+ signal rather than an automatic rejection rule:
28
+ [Hao et al., 2026](https://arxiv.org/abs/2606.00820).
29
+
30
+ Run:
31
+
32
+ ```bash
33
+ python3 benchmarks/committee/run.py
34
+ python3 benchmarks/committee/run.py --json
35
+ ```
36
+
37
+ The checked-in traces make metric changes reviewable. The real state machine is
38
+ tested separately by `bin/test-committee.py`; a claim about task quality still
39
+ requires a preregistered live benchmark across tasks, models and costs.
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env python3
2
+ """Auditable governance metrics for coordination traces."""
3
+
4
+
5
+ def evaluate(trace):
6
+ events = trace.get('events', [])
7
+ lateral = sum(
8
+ event.get('type') == 'message'
9
+ and event.get('from') != 'seat'
10
+ and event.get('to') != 'seat'
11
+ for event in events)
12
+ isolation = sum(
13
+ event.get('type') == 'position' and bool(event.get('saw_peer'))
14
+ for event in events)
15
+ ungranted = sum(
16
+ event.get('type') == 'floor_reply' and not event.get('granted')
17
+ for event in events)
18
+ pending = sum(
19
+ event.get('type') == 'decision'
20
+ and int(event.get('pending_floor', 0)) > 0
21
+ for event in events)
22
+ unattributed = sum(
23
+ event.get('type') == 'decision'
24
+ and not event.get('decisive_contributors')
25
+ for event in events)
26
+ unverified = sum(
27
+ event.get('type') == 'close' and event.get('verification') != 'pass'
28
+ for event in events)
29
+ self_verified = sum(
30
+ event.get('type') == 'close'
31
+ and event.get('verifier') == event.get('executor')
32
+ for event in events)
33
+ evidence = set()
34
+ for event in events:
35
+ for item in event.get('evidence', []):
36
+ evidence.add(str(item).split(':', 1)[0])
37
+ violations = (lateral + isolation + ungranted + pending + unattributed
38
+ + unverified + self_verified)
39
+ return {
40
+ 'strategy': trace.get('strategy', 'unknown'),
41
+ 'coordination_events': len(events),
42
+ 'evidence_sources': len(evidence),
43
+ 'lateral_member_edges': lateral,
44
+ 'pre_barrier_leaks': isolation,
45
+ 'ungranted_replies': ungranted,
46
+ 'decisions_with_pending_floor': pending,
47
+ 'unattributed_decisions': unattributed,
48
+ 'closures_without_pass': unverified,
49
+ 'self_verified_closures': self_verified,
50
+ 'protocol_violations': violations,
51
+ }
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env python3
2
+ """Compare coordination traces without pretending to measure model quality."""
3
+ import argparse
4
+ import json
5
+ import os
6
+
7
+ from metrics import evaluate
8
+
9
+
10
+ def load_all():
11
+ root = os.path.join(os.path.dirname(__file__), 'traces')
12
+ rows = []
13
+ for name in sorted(os.listdir(root)):
14
+ if name.endswith('.json'):
15
+ rows.append(evaluate(json.load(open(os.path.join(root, name),
16
+ encoding='utf-8'))))
17
+ return rows
18
+
19
+
20
+ def table(rows):
21
+ columns = [
22
+ ('strategy', 'strategy'),
23
+ ('events', 'coordination_events'),
24
+ ('evidence', 'evidence_sources'),
25
+ ('lateral', 'lateral_member_edges'),
26
+ ('leaks', 'pre_barrier_leaks'),
27
+ ('ungranted', 'ungranted_replies'),
28
+ ('pending', 'decisions_with_pending_floor'),
29
+ ('unattributed', 'unattributed_decisions'),
30
+ ('unverified', 'closures_without_pass'),
31
+ ('self-check', 'self_verified_closures'),
32
+ ('violations', 'protocol_violations'),
33
+ ]
34
+ widths = [max(len(label), *(len(str(row[key])) for row in rows))
35
+ for label, key in columns]
36
+ lines = [
37
+ ' '.join(label.ljust(width) for (label, _), width in zip(columns, widths)),
38
+ ' '.join('-' * width for width in widths),
39
+ ]
40
+ for row in rows:
41
+ lines.append(' '.join(str(row[key]).ljust(width)
42
+ for (_, key), width in zip(columns, widths)))
43
+ return '\n'.join(lines)
44
+
45
+
46
+ def main():
47
+ parser = argparse.ArgumentParser(
48
+ description='Structural benchmark; it does not claim answer-quality SOTA')
49
+ parser.add_argument('--json', action='store_true')
50
+ args = parser.parse_args()
51
+ rows = load_all()
52
+ if args.json:
53
+ print(json.dumps({
54
+ 'benchmark': 'agents-city/committee-governance@1',
55
+ 'scope': 'protocol structure, not task-answer quality',
56
+ 'results': rows,
57
+ }, indent=2))
58
+ else:
59
+ print(table(rows))
60
+ print('\nStructural only: run live task datasets before any model-quality claim.')
61
+
62
+
63
+ if __name__ == '__main__':
64
+ main()
@@ -0,0 +1,8 @@
1
+ {
2
+ "strategy": "single-agent",
3
+ "events": [
4
+ {"type": "position", "actor": "seat", "saw_peer": false, "evidence": ["seat:inspection"]},
5
+ {"type": "decision", "pending_floor": 0},
6
+ {"type": "close", "verification": "none", "executor": "seat", "verifier": "seat"}
7
+ ]
8
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "strategy": "free-mesh",
3
+ "events": [
4
+ {"type": "position", "actor": "api", "saw_peer": false, "evidence": ["api:test"]},
5
+ {"type": "message", "from": "api", "to": "web"},
6
+ {"type": "position", "actor": "web", "saw_peer": true, "evidence": ["web:e2e"]},
7
+ {"type": "message", "from": "web", "to": "api"},
8
+ {"type": "message", "from": "api", "to": "web"},
9
+ {"type": "message", "from": "web", "to": "ops"},
10
+ {"type": "message", "from": "ops", "to": "api"},
11
+ {"type": "floor_reply", "actor": "ops", "granted": false, "evidence": ["ops:log"]},
12
+ {"type": "decision", "pending_floor": 1},
13
+ {"type": "verification", "actor": "api", "executor": "api", "result": "pass", "evidence": ["api:self-check"]},
14
+ {"type": "close", "verification": "pass", "executor": "api", "verifier": "api"}
15
+ ]
16
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "strategy": "chair-mediated",
3
+ "events": [
4
+ {"type": "assignment", "from": "seat", "to": "api"},
5
+ {"type": "assignment", "from": "seat", "to": "web"},
6
+ {"type": "position", "actor": "api", "saw_peer": false, "evidence": ["api:test"]},
7
+ {"type": "position", "actor": "web", "saw_peer": false, "evidence": ["web:e2e"]},
8
+ {"type": "synthesis", "actor": "seat"},
9
+ {"type": "floor_request", "actor": "api", "evidence": ["api:replay"]},
10
+ {"type": "floor_reply", "actor": "api", "granted": true, "evidence": ["api:replay"]},
11
+ {"type": "decision", "actor": "seat", "pending_floor": 0, "decisive_contributors": ["api", "web"]},
12
+ {"type": "verification", "actor": "ops", "executor": "seat", "result": "pass", "evidence": ["ops:clean-check"]},
13
+ {"type": "close", "verification": "pass", "executor": "seat", "verifier": "ops"}
14
+ ]
15
+ }
@@ -0,0 +1,35 @@
1
+ # Native runtime latency
2
+
3
+ The offline `runtime` test proves the transport contracts deterministically:
4
+ one authenticated city WebSocket fans out to Claude stream-json, Codex
5
+ app-server WebSocket, OpenCode HTTP/SSE and Kimi REST/WebSocket doubles, with no
6
+ tmux or clipboard.
7
+
8
+ The live benchmark deliberately makes real model calls and may consume account
9
+ quota or paid tokens:
10
+
11
+ ```bash
12
+ agents-city benchmark live
13
+ agents-city benchmark live --runtime claude --runtime codex
14
+ agents-city benchmark live --command opencode='opencode --model provider/model --auto'
15
+ agents-city benchmark live --json
16
+ ```
17
+
18
+ Each runtime receives the same read-only marker task. A run is successful only
19
+ when the model submits an evidence-backed committee position. Two clocks are
20
+ reported separately:
21
+
22
+ - `busToNativeAcceptMs`: the native provider protocol accepted the assignment;
23
+ - `endToEndPositionMs`: the agent returned its position through the committee.
24
+
25
+ This distinction prevents a fast HTTP response or stdin acknowledgement from being
26
+ misreported as completed work. By default, metadata-only reports are appended
27
+ to `~/.agents-city/.benchmarks/native-e2e.jsonl` and compared with the previous
28
+ successful run of the same command. Prompts, repo contents and model output are
29
+ not stored in that ledger. Use `--no-save` for an ephemeral run.
30
+
31
+ Claude runs through one persistent official `claude -p` process with streaming
32
+ JSON input/output, exactly like the normal city launcher. It needs no custom
33
+ Channel, development consent, Team policy or terminal keystroke. Codex, OpenCode
34
+ and Kimi use their native server protocols directly. A missing login, such as an
35
+ unconfigured Kimi provider, is reported as a failed runtime.
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ /** Deterministic Claude Code stream-json double. No account or network needed. */
3
+ import { appendFileSync, readFileSync } from 'fs';
4
+ import { createInterface } from 'readline';
5
+
6
+ const capture = process.env.CITY_CLAUDE_FAKE_CAPTURE || '';
7
+ const behaviorPath = process.env.CITY_CLAUDE_FAKE_BEHAVIOR || '';
8
+ const actor = process.env.CITY_BUS_ACTOR || 'claude-agent';
9
+ const queue = [];
10
+ let working = false;
11
+
12
+ if (!capture) throw new Error('CITY_CLAUDE_FAKE_CAPTURE is required');
13
+ if (behavior() === 'exit-before-ready') process.exit(23);
14
+
15
+ emit({
16
+ type: 'system',
17
+ subtype: 'init',
18
+ session_id: `fake-${actor}`,
19
+ claude_code_version: 'fake',
20
+ cwd: process.cwd(),
21
+ model: 'fake-claude',
22
+ tools: [],
23
+ mcp_servers: [],
24
+ });
25
+
26
+ const input = createInterface({ input: process.stdin, terminal: false });
27
+ input.on('line', (line) => {
28
+ let message;
29
+ try {
30
+ message = JSON.parse(line);
31
+ } catch {
32
+ return;
33
+ }
34
+ if (message.shouldQuery === false) {
35
+ emit({ ...message, session_id: `fake-${actor}`, isReplay: true });
36
+ return;
37
+ }
38
+ const mode = behavior();
39
+ appendFileSync(
40
+ capture,
41
+ JSON.stringify({
42
+ provider: 'claude',
43
+ actor,
44
+ behavior: mode,
45
+ receivedAt: new Date().toISOString(),
46
+ request: message,
47
+ args: process.argv.slice(2),
48
+ channelEnabled: process.env.CITY_CLAUDE_CHANNEL || '',
49
+ streamGateway: process.env.CITY_CLAUDE_STREAM_GATEWAY || '',
50
+ }) + '\n',
51
+ );
52
+ if (mode === 'exit-on-prompt') process.exit(24);
53
+ if (mode === 'reject-prompt') {
54
+ emit({
55
+ type: 'result',
56
+ subtype: 'error_during_execution',
57
+ is_error: true,
58
+ session_id: `fake-${actor}`,
59
+ errors: ['fake Claude rejected the prompt'],
60
+ });
61
+ return;
62
+ }
63
+ if (mode === 'no-ack') return;
64
+ if (mode === 'malformed-output') process.stdout.write('not-json\n');
65
+ emit({ ...message, session_id: `fake-${actor}`, isReplay: true });
66
+ queue.push(message);
67
+ runNext();
68
+ });
69
+
70
+ function runNext() {
71
+ if (working || !queue.length) return;
72
+ working = true;
73
+ const message = queue.shift();
74
+ const text = userText(message);
75
+ setTimeout(() => {
76
+ emit({
77
+ type: 'assistant',
78
+ uuid: `assistant-${message.uuid}`,
79
+ session_id: `fake-${actor}`,
80
+ parent_tool_use_id: null,
81
+ message: {
82
+ role: 'assistant',
83
+ content: [{ type: 'text', text: `Fake Claude answer for ${actor}: ${text.slice(0, 80)}` }],
84
+ },
85
+ });
86
+ setTimeout(() => {
87
+ emit({
88
+ type: 'result',
89
+ subtype: 'success',
90
+ is_error: false,
91
+ session_id: `fake-${actor}`,
92
+ result: `Fake Claude answer for ${actor}: ${text.slice(0, 80)}`,
93
+ errors: [],
94
+ });
95
+ working = false;
96
+ runNext();
97
+ }, 5);
98
+ }, 5);
99
+ }
100
+
101
+ function userText(message) {
102
+ const content = message?.message?.content;
103
+ if (typeof content === 'string') return content;
104
+ if (!Array.isArray(content)) return '';
105
+ return content.map((block) => block?.type === 'text' ? String(block.text || '') : '').join('');
106
+ }
107
+
108
+ function emit(value) {
109
+ process.stdout.write(JSON.stringify(value) + '\n');
110
+ }
111
+
112
+ function behavior() {
113
+ if (!behaviorPath) return 'healthy';
114
+ try {
115
+ return readFileSync(behaviorPath, 'utf8').trim() || 'healthy';
116
+ } catch {
117
+ return 'healthy';
118
+ }
119
+ }