Gas City: the gc CLI. Fork of gastownhall/gascity, kept here so its defects have a home and a tracker.
  • Go 93.2%
  • TypeScript 4.9%
  • Shell 1.5%
  • JavaScript 0.2%
  • Python 0.1%
Find a file
Peter Banka 3ca5717e36
Some checks failed
CI / Runner policy (push) Has been cancelled
CodeQL / Runner policy (push) Has been cancelled
Cyclomatic complexity / Report complexity (push) Has been cancelled
gc edge publish / Publish gc edge build (push) Has been cancelled
Go Vulnerability Scan / Runner policy (push) Has been cancelled
Notify Image Rebuilds / notify (push) Has been cancelled
Review Formulas / Runner policy (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Preflight / static checks (push) Has been cancelled
CI / Preflight / unit cover (noncmdgc) (push) Has been cancelled
CI / Preflight / unit cover (cmd/gc 1 of 6) (push) Has been cancelled
CI / Preflight / unit cover (cmd/gc 2 of 6) (push) Has been cancelled
CI / Preflight / unit cover (cmd/gc 3 of 6) (push) Has been cancelled
CI / Preflight / unit cover (cmd/gc 4 of 6) (push) Has been cancelled
CI / Preflight / unit cover (cmd/gc 5 of 6) (push) Has been cancelled
CI / Preflight / unit cover (cmd/gc 6 of 6) (push) Has been cancelled
CI / Preflight / acceptance A (push) Has been cancelled
CI / Contract / bd CLI (minimum supported) (push) Has been cancelled
CI / Contract / acceptance A (bd current) (push) Has been cancelled
CI / Contract radar (gc HEAD x bd main HEAD) (push) Has been cancelled
CI / Preflight / generated artifacts (push) Has been cancelled
CI / Check (push) Has been cancelled
CI / Release config (push) Has been cancelled
CI / cmd/gc process / shard 1 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 10 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 11 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 12 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 2 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 3 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 4 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 5 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 6 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 7 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 8 of 12 (push) Has been cancelled
CI / cmd/gc process / shard 9 of 12 (push) Has been cancelled
CI / cmd/gc product metrics testhook (push) Has been cancelled
CI / Credential provider / Windows process tree (push) Has been cancelled
CI / Integration / packages-cmd-gc-integration (push) Has been cancelled
CI / Integration / packages-core-1-of-4 (push) Has been cancelled
CI / Integration / packages-core-2-of-4 (push) Has been cancelled
CI / Integration / packages-core-3-of-4 (push) Has been cancelled
CI / Integration / packages-core-4-of-4 (push) Has been cancelled
CI / Integration / packages-runtime-tmux-1-of-6 (push) Has been cancelled
CI / Integration / packages-runtime-tmux-2-of-6 (push) Has been cancelled
CI / Integration / packages-runtime-tmux-3-of-6 (push) Has been cancelled
CI / Integration / packages-runtime-tmux-4-of-6 (push) Has been cancelled
CI / Integration / packages-runtime-tmux-5-of-6 (push) Has been cancelled
CI / Integration / packages-runtime-tmux-6-of-6 (push) Has been cancelled
CI / Integration / rest-smoke-1-of-2 (push) Has been cancelled
CI / Integration / rest-smoke-2-of-2 (push) Has been cancelled
CI / Integration / bdstore (push) Has been cancelled
CI / Integration / rest-full-1-of-16 (push) Has been cancelled
CI / Integration / rest-full-10-of-16 (push) Has been cancelled
CI / Integration / rest-full-11-of-16 (push) Has been cancelled
CI / Integration / rest-full-12-of-16 (push) Has been cancelled
CI / Integration / rest-full-13-of-16 (push) Has been cancelled
CI / Integration / rest-full-14-of-16 (push) Has been cancelled
CI / Integration / rest-full-15-of-16 (push) Has been cancelled
CI / Integration / rest-full-16-of-16 (push) Has been cancelled
CI / Integration / rest-full-2-of-16 (push) Has been cancelled
CI / Integration / rest-full-3-of-16 (push) Has been cancelled
CI / Integration / rest-full-4-of-16 (push) Has been cancelled
CI / Integration / rest-full-5-of-16 (push) Has been cancelled
CI / Integration / rest-full-6-of-16 (push) Has been cancelled
CI / Integration / rest-full-7-of-16 (push) Has been cancelled
CI / Integration / rest-full-8-of-16 (push) Has been cancelled
CI / Integration / rest-full-9-of-16 (push) Has been cancelled
CI / Worker core (Claude) (push) Has been cancelled
CI / Worker core (Codex) (push) Has been cancelled
CI / Worker core (Gemini) (push) Has been cancelled
CI / Worker core summary (push) Has been cancelled
CI / Worker core phase 2 (Claude) (push) Has been cancelled
CI / Worker core phase 2 (Codex) (push) Has been cancelled
CI / Worker core phase 2 (Gemini) (push) Has been cancelled
CI / Worker core phase 2 summary (push) Has been cancelled
CI / Pack compatibility gate (push) Has been cancelled
CI / Dashboard SPA (push) Has been cancelled
CI / openclaw-bridge Node tests (push) Has been cancelled
CI / MCP mail conformance (push) Has been cancelled
CI / Docker session (push) Has been cancelled
CI / K8s session (push) Has been cancelled
CI / CI / preflight (push) Has been cancelled
CI / CI / integration (push) Has been cancelled
CI / CI / required (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Go Vulnerability Scan / Go module vulnerabilities (push) Has been cancelled
Review Formulas / review-formulas routing (push) Has been cancelled
Review Formulas / Integration / review-formulas (basic-1-of-2) (push) Has been cancelled
Review Formulas / Integration / review-formulas (basic-2-of-2) (push) Has been cancelled
Review Formulas / Integration / review-formulas (retries-1-of-2) (push) Has been cancelled
Review Formulas / Integration / review-formulas (retries-2-of-2) (push) Has been cancelled
Review Formulas / Integration / review-formulas (recovery) (push) Has been cancelled
Review Formulas / Integration / review-formulas (push) Has been cancelled
fix(herdr): resolve the session socket the way herdr does, not via os.UserConfigDir
socketPath() used os.UserConfigDir() to find the herdr session-server
socket. On darwin that returns $HOME/Library/Application Support and
IGNORES XDG_CONFIG_HOME entirely (Go's XDG branch is Unix-only), while
the herdr binary binds its sockets under $XDG_CONFIG_HOME or
$HOME/.config. On macOS every liveness dial therefore hit a socket no
herdr server ever binds: serverAlive() read false against a healthy
server, every agent spawn failed at configure-server with 'did not
become ready', each retry spawned a redundant herdr server that exited
'already running', and the reconciler could not start a single
session. Measured live: a Go dial to ~/.config/herdr/sessions/
gc-scratch/herdr.sock succeeds while the Library path fails with
ENOENT, and the spawned-server retry loop burns its full 10s budget
every cycle.

Resolve the config dir exactly as herdr does — XDG_CONFIG_HOME if set,
else $HOME/.config, on every platform. The sandbox case ga-nqlb8q was
fixing (XDG set while HOME points elsewhere) keeps working, because the
env var wins here exactly as it wins in herdr.

The prior comment claimed os.UserConfigDir() matches herdr's
resolution 'on this platform'; that is true on Linux and false on
macOS. Corrected, and pinned with a regression test that fails against
the os.UserConfigDir() implementation on darwin.
2026-09-01 15:48:00 -07:00
.agents chore: commit a shared project skill tree (Claude/Codex/Gemini) + gascity-docs 2026-06-15 09:54:16 -07:00
.claude/skills/gascity-docs fix(githooks): fail closed on OpenAPI drift without npm (#4750) 2026-07-28 02:17:11 -07:00
.devcontainer fix(beads): run the conditional-release CAS against a bd that has the flags (ga-nv0i3) (#5147) 2026-08-09 16:51:21 -07:00
.githooks fix(githooks): fail closed on OpenAPI drift without npm (#4750) 2026-07-28 02:17:11 -07:00
.github ci: add advisory cyclomatic complexity reporting (#5786) 2026-08-30 23:03:24 -07:00
cmd fix(hooks): stop Pi/OMP hooks leaking gc stderr around the host TUI 2026-08-31 14:42:16 -07:00
contrib fix(k8s): controller + beads-runner uid 1000->1001 (match baked gcagent) (#3693) 2026-08-14 15:55:34 +00:00
docs feat(api): publish the bead delete endpoint's soft-delete contract in the spec (#4901) 2026-08-31 12:21:27 -07:00
engdocs ci: add advisory cyclomatic complexity reporting (#5786) 2026-08-30 23:03:24 -07:00
examples fix: preserve fresh managed-Dolt bootstrap with bd 1.2 (#5294) 2026-08-31 17:44:04 +00:00
internal fix(herdr): resolve the session socket the way herdr does, not via os.UserConfigDir 2026-09-01 15:48:00 -07:00
pkg/eventexport feat(events): anchor runs to source work beads (#5406) 2026-08-18 23:45:25 -07:00
plans feat(runproj): event-sourced Runs view — Go projection over events.jsonl (P0–P4) (#3804) 2026-07-03 03:28:03 -07:00
release-gates fix(hook): keep routed work scoped during store fallback (#5807) 2026-08-31 11:42:02 -07:00
schemas fix(status): stop publishing unobserved agents as absent in JSON and stdout (#5320) 2026-08-30 09:24:56 -07:00
scripts test: tier the live herdr journeys behind an opt-in lane (#5809) 2026-08-31 06:27:21 -04:00
specs/plans feat: keep the city cockpit in the OSS dashboard (#4261) 2026-07-14 22:07:51 +00:00
test fix(test): stop cmd/gc real-tmux server leaks at the source; fail-closed teardown guard (#5215) 2026-08-29 22:24:52 +00:00
.dockerignore chore: add container scanning workflow 2026-04-30 00:35:16 +00:00
.gitattributes feat(dashboard): structured transcript rendering + hardened structured stream (adopts #3718) (#3931) 2026-07-19 01:45:12 -07:00
.gitignore test(dashboard): Playwright render smoke over seeded city + close-edge corpus (#4398) 2026-07-17 21:45:15 -07:00
.golangci.yml fix(lint): keep module checksums read-only 2026-08-04 11:05:11 +00:00
.goreleaser.yml feat(productmetrics): activate gc command-usage telemetry 2026-07-22 23:36:51 +00:00
.mcp.json docs(diagrams): add Excalidraw toolchain setup and comparison scaffolding 2026-05-22 22:03:33 +02:00
.node-version Migrate supervisor API to Huma/OpenAPI and restore dashboard SPA (#877) 2026-04-18 22:24:17 -10:00
.nvmrc Migrate supervisor API to Huma/OpenAPI and restore dashboard SPA (#877) 2026-04-18 22:24:17 -10:00
.trivyignore-config Harden gascity container config scanning (#1508) 2026-04-29 17:41:30 -10:00
.trivyignore.yaml fix: waive kubectl x/text vulnerability 2026-08-05 14:37:40 +00:00
AGENTS.md Document safe Git checkout practices in shared worktrees (#4820) 2026-07-29 10:10:27 +00:00
CHANGELOG.md Split whitespace-joined mail message IDs (#4923) 2026-08-28 15:27:19 -07:00
CLAUDE.md chore: commit a shared project skill tree (Claude/Codex/Gemini) + gascity-docs 2026-06-15 09:54:16 -07:00
CODE_OF_CONDUCT.md Revert "Add supervisor status API for init progress display" 2026-03-18 01:35:26 +01:00
codecov.yml Follow-up for #1237: City init bridge architecture invariants (#1574) 2026-05-01 15:29:04 +00:00
CONTRIBUTING.md fix(githooks): fail closed on OpenAPI drift without npm (#4750) 2026-07-28 02:17:11 -07:00
deps.env fix(beads): run the conditional-release CAS against a bd that has the flags (ga-nv0i3) (#5147) 2026-08-09 16:51:21 -07:00
GEMINI.md chore: commit a shared project skill tree (Claude/Codex/Gemini) + gascity-docs 2026-06-15 09:54:16 -07:00
go.mod fix(beads): bump the beads library to v1.3.0-rc.1 so native_open stops refusing 2026-08-31 14:42:21 -07:00
go.sum fix(beads): bump the beads library to v1.3.0-rc.1 so native_open stops refusing 2026-08-31 14:42:21 -07:00
LICENSE chore(license): attribute copyright to Gas City Contributors 2026-08-27 19:30:50 -07:00
Makefile test: tier the live herdr journeys behind an opt-in lane (#5809) 2026-08-31 06:27:21 -04:00
mint.sh Migrate supervisor API to Huma/OpenAPI and restore dashboard SPA (#877) 2026-04-18 22:24:17 -10:00
README.md brew install CLI fix 2026-07-08 18:16:09 -07:00
RELEASING.md fix(release): split RC tag creation from publish so each RC drafts once (#5310 follow-up) (#5699) 2026-08-28 07:20:05 -07:00
renovate.json chore: bump Beads and Dolt automation pins 2026-05-14 19:33:46 -07:00
repo-policy.py fix(pool): review-formulas root fix — GC_BD_PROBE_TIMEOUT + scale_check --limit=0 + NoFormula (WP-A/B/C) (#3561) 2026-06-18 08:10:12 -07:00
schemas_embed.go feat: add JSON for config and supervisor status (#2253) 2026-05-17 16:09:47 -07:00
SECURITY.md docs(security): warn about malicious "fix" attachment spam (#4054) 2026-07-07 21:17:17 +00:00
SUPPORT.md Revert "Add supervisor status API for init progress display" 2026-03-18 01:35:26 +01:00
taplo.toml Revert "Add supervisor status API for init progress display" 2026-03-18 01:35:26 +01:00
TESTING.md test: tier the live herdr journeys behind an opt-in lane (#5809) 2026-08-31 06:27:21 -04:00
TRACK3_CONTRACT.md snapshot: restack track1 snapshot on main 2026-04-14 22:42:02 +00:00

Gas City

Composable orchestration infrastructure for multi-agent coding workflows.

Build status Documentation GitHub release Discord MIT License

Gas City is an orchestration-builder SDK for multi-agent systems. It extracts the reusable infrastructure from Gas Town into a configurable toolkit with runtime providers, work routing, formulas, orders, health patrol, and a declarative city configuration.

Sponsors

Powered by Blacksmith

Coming from Gas Town?

Start with Coming from Gas Town?. It maps Town roles, commands, plugins, convoys, and directory habits onto Gas City's primitive-first model so experienced Gas Town users can ramp without trying to port the entire Town architecture literally.

What You Get

  • Declarative city configuration in city.toml
  • Multiple runtime providers: tmux, subprocess, exec, ACP, Kubernetes, and herdr
  • Beads-backed work tracking, formulas, molecules, waits, and mail
  • A controller/supervisor loop that reconciles desired state to running state
  • Packs, overrides, and rig-scoped orchestration for multi-project setups

Quickstart

See the full install guide at docs/getting-started/installation.md.

Prerequisites

Gas City requires the following tools on your system. gc init and gc start check for these automatically and report any that are missing.

Dependency Required Min Version Install (macOS) Install (Linux)
tmux Always brew install tmux apt install tmux
git Always brew install git apt install git
jq Always brew install jq apt install jq
pgrep Always (included in macOS) apt install procps
lsof Always (included in macOS) apt install lsof
dolt Beads provider bd 2.1.0 or newer brew install dolt releases
bd Beads provider bd 1.0.0 releases releases
flock Beads provider bd brew install flock apt install util-linux
gh Optional GitHub gates brew install gh cli.github.com
claude / codex / gemini Per provider See provider docs See provider docs

tmux is the default session backend and the fallback, so it stays required even if you run agents on another backend. herdr is an optional alternative backend — see herdr Session Provider to enable it per-agent, per-rig, or city-wide.

The bd (beads) provider is the default. To use a file-based store instead (no dolt/bd/flock needed), set GC_BEADS=file or add [beads] provider = "file" to your city.toml.

Managed Dolt checks require a final Dolt 2.1.0 or newer. Older and pre-release builds are below Gas City's managed bd/Dolt compatibility floor; releases before 1.86.2 can also miss the upstream GC/writer deadlock fix in dolthub/dolt commit ccf7bde206, which can hang dolt_backup sync under heavy write load.

Install from Homebrew:

brew install gascity
gc version

Or build from source (requires make, Go 1.26.4+, and ICU for a transitive Dolt CGO dependency — brew install icu4c on macOS, apt install libicu-dev on Linux; on macOS the Makefile auto-detects the keg-only icu4c paths):

make install

gc init ~/bright-lights
cd ~/bright-lights
gc start

mkdir hello-world
cd hello-world
git init
gc rig add .

bd create "Create a script that prints hello world"
gc session attach mayor

Nix/Flox machines (ICU not on the default CGO path)

On NixOS / Flox-managed Linux toolchains, system include/lib dirs are not searched, so the build fails with fatal error: unicode/uregex.h: No such file or directory. Point CGO at the Nix-store ICU dev headers + matching runtime lib (pick the dev output whose propagated lib matches your gc/dolt link, to avoid ICU version skew), and disable the Makefile's /usr/lib fallback so the Nix and system toolchains don't get mixed:

# Re-resolve the dev header path if the store path changes:
#   find /nix/store -maxdepth 3 -path '*icu4c*-dev/include/unicode/uregex.h'
# Match the lib to what your installed binary links: ldd $(which gc) | grep icu
ICU_DEV=/nix/store/dvhx24q4icrig4q1v1lp7kzi3izd5jmb-icu4c-76.1-dev
ICU_LIB=/nix/store/i4lj3w4yd9x9jbi7a1xhjqsr7bg8jq7p-icu4c-76.1

CGO_ENABLED=1 \
CGO_CPPFLAGS="-I$ICU_DEV/include" \
CGO_LDFLAGS="-L$ICU_LIB/lib" \
SYS_USR_CGO_FALLBACK=0 \
  make build      # or: go build -o bin/gc ./cmd/gc

CGO-backed tests (e.g. go test ./internal/beads) take the same three CGO_* vars — no CGO_ENABLED=0 workaround needed once ICU is pointed at correctly.

For the longer walkthrough, start with Tutorial 01.

Documentation

📖 Read the docs online: docs.gascityhall.com

The docs now use a Mintlify structure rooted in docs/.

Preview the docs locally:

make docs-dev

# or directly from the repo root
./mint.sh dev

Repository Map

Path What it contains
cmd/gc/ CLI entrypoints, controller wiring, runtime assembly, and command handlers
internal/runtime/ Runtime provider abstraction plus tmux, subprocess, exec, ACP, K8s, hybrid, and herdr implementations
internal/config/ city.toml schema, validation, composition, packs, patches, and override resolution
internal/beads/ Store abstraction and provider implementations for beads (work, mail, convoys) and waits
internal/session/ Session bead metadata, wait lifecycle helpers, and session identity utilities
internal/orders/ Order parsing and scanning for periodic dispatch
internal/convergence/ Bounded iterative refinement loops and gate handling
internal/api/ HTTP API handlers and resource views
docs/ Mintlify docs site (tutorials, guides, reference)
engdocs/ Contributor-facing architecture, design docs, proposals, and archive
examples/ Example cities, packs, formulas, and reference topologies
contrib/ Helper scripts, Dockerfiles, and integration support assets
test/ Integration and support test packages

Where to start

  • CLI behaviorcmd/gc/, then the command-specific helper it calls.
  • Runtime/provider workinternal/runtime/runtime.go and the provider package you're changing.
  • Config and pack behaviorinternal/config/config.go, compose.go, and pack.go.
  • Work dispatch (sling)cmd/gc/cmd_sling.go and internal/beads/.
  • Supervisor, sessions, wake/sleepcmd/gc/, internal/session/, and internal/runtime/.

For the concepts these packages implement, see How Gas City Works. For a deeper package walkthrough, see engdocs/contributors/codebase-map.md.

Contributing

Read CONTRIBUTING.md and engdocs/contributors/index.md before opening a PR.

Useful commands:

  • make setup
  • make check
  • make check-docs
  • make test-integration

License

MIT