Setup
Install at least one CLI coding agent (Gas City calls these “providers”) and put it on the PATH. Gas City supports many, including Claude Code (claude),
Codex (codex), Gemini (gemini), Grok Build (grok), OpenCode (opencode),
Groq (groq), and Cerebras (cerebras). Configure each with its token or API
key so it can run — the more the merrier.
Then install the Gas City CLI and put it on the PATH:
NOTE: the gascity installation is a great way to get the right dependencies in place, but may not be enough to keep up with the changes we’re making on the way to 1.0. Best practice right now is to build your ownNew to the vocabulary? Read How Gas City Works first — the canonical model for the six primitives (Agent, Bead, Formula, Rig, Pack, Event) this tutorial puts into practice. The city is the local (root) pack; it imports shared packs.gcbinary from HEAD on themainbranch of the gascity repo to get the latest and greatest bits before running these tutorials.
Creating a city
A city is the directory holding the agents, formulas, rigs, orders, and local settings the orchestrator needs to run multi-agent workflows on this machine. Inside it, a pack is the portable part — the definitions worth sharing with other cities. A city is a pack plus deployment details. Create one withgc init:
pack.toml— the portable pack definition layercity.toml— city-local deployment and runtime settings
mayor agent. The mayor’s prompt lives at
agents/mayor/prompt.template.md, and pack.toml defines the always-on mayor
session that uses it. Assuming you chose the default gascity config template
and Claude Code, city.toml keeps the shared runtime settings:
[workspace] section in city.toml sets shared runtime defaults such as
the provider. The [providers.claude] table registers your chosen provider
against the builtin claude preset. The [defaults.rig.imports] table lists
packs that every rig you add imports automatically. The v2 formula compiler is
on by default, so nothing is written for it (you’ll meet formulas in
Tutorial 05). The [imports] entries
in pack.toml are explicit pack composition, not hidden load-time behavior.
core and, for cities on the default bd beads provider, bd are bundled
system packs that resolve offline from the user-global pack cache. Their
sha:<pinned commit> version names the copy of each pack bundled with your
gc binary, not a commit you fetch or choose yourself. The gc
import is the public Gas City planning and implementation skills pack pinned
to the registry release embedded with this gc binary. If required builtin
imports go missing, gc doctor --fix restores them. The machine-local
workspace identity lives in .gc/site.toml instead, which is how gc cities, gc status, and other commands still know this city is named
my-city.
The mayor session comes from the scaffolded agents/mayor/ content and the
explicit [[named_session]] entry, so you can talk to it at any time. When
you add more agents later, Gas City creates agents/<name>/, with
prompt.template.md for the prompt and agent.toml for any per-agent
overrides.
Gas City also derives a worker template for each provider declared in
city.toml’s [providers] table — so claude is available as a template
name (and, once you add a rig, <rig>/claude) even though it is not a
hardcoded role. Provider-derived workers use the core pack’s stock
pool-worker prompt and get mol-do-work as their default sling formula —
more on that in a moment. (The mol- prefix is v1 naming carried by the
formula’s name; it doesn’t change what the formula is — a reusable method.)
To check on the status of your city, use gc status:
reserved-unmaterialized until the orchestrator
materializes it; once the mayor session is up, its state reads awake (or
active — the two are equivalent).
The dolt.dog pool is a background utility agent from the bundled dolt pack
(pulled in transitively through the explicit bd import you saw in
pack.toml — the dolt. prefix is the import binding it arrived through).
It handles Dolt database housekeeping for the beads backend. control-dispatcher is platform
infrastructure: the orchestrator uses it to advance formula workflows. You don’t
need to interact with either — ignore them for now.
Adding a rig
If another Gas City workspace is already registered (check
gc cities),
commands inside ~/my-city may resolve to that city and fail. Pass --city ~/my-city explicitly when that happens. These examples assume a single
registered city.my-project) and
set up work tracking in it. The portable declaration lands in city.toml; the
path binding stays machine-local in .gc/site.toml:
gc rig list:
Slinging your first work
You assign work to agents by “slinging” it. Target the rig-scoped agent explicitly to keep the work on this rig; hop into the rig directory to inspect the results:mol-do-work — read the bead, do
the work, close it), and the orchestrator spawned a session to run it.
--watch:
BLOCKS line is the input convoy sling created to track your bead. When
the agent finishes, the status flips from OPEN to CLOSED — and the file is
there:
What’s next
You’ve created a city, added a project as a rig, and slung work to an agent on that rig. From here:- Agents — go deeper on agent configuration: prompts, sessions, scope, working directories
- Sessions — interactive conversations with agents, on-demand workers and persistent worker pools
- Formulas — write a method for how a job gets done and let the orchestrator run it as a graph: fan steps out across many agents, gate them on dependencies, retry failures, and drive the job to completion outside your session