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