Native GPUI staff over Puppetmaster. Named automata speak, then dispatch. Durable state is queried first. Jobs stay out of chat. One local Docker Linux is the shared computer; automata are screens, not VMs.
- Staff surface — rail, composer, factory, inspector
- Computer — Docker Linux box, screens, Take control
- Jobs — analyze, implement, box-shell, land, and ship
- Durable state — store, claims, keys
- Contributor contract — invariants for agents and humans
Needs Bun, Docker, and a Puppetmaster CLI on PATH.
OpenRouter is configured in Settings (or ~/.automaton/keys.json).
bun install
bun test
bun run appOn macOS, bun run app opens macos/Automaton.app so the Dock and the
menu bar say Automaton. That wrapper is a Mach-O stub plus bun copied into
the bundle; Homebrew bun in the Dock is a terminal tile. bun src/main.tsx
still works, but a bun process spawned from Cursor stays under Cursor's
menu (Cmd+Plus / Cmd+Minus go to the editor). The in-window titlebar paints
Automaton next to the focused mouth.
--hot remounts can leave a zombie window. If clicks miss, quit leftover
Automaton windows and run bun run app (or bun src/main.tsx).
bun test is the suite. CI runs that job on macOS. bun scripts/replay-tough-eval.ts measures recall safety (avoidance, false-hit rate, stale-hit rate, cost) on a seeded mixed workload. It is not the 95% repeated-work replay. bun run doctor checks
Puppetmaster. bun scripts/probe-kernel.ts launches a read-only analyze
job. Never run an implement worker against this checkout; implement work
uses a sandbox.
Layout:
@gpuix/reacton Zed GPUI (src/main.tsx)- Domain and session:
src/domain.ts,src/session.ts - Durable SQLite:
src/runtime/store.ts - Mouth:
src/runtime/mouth.ts - Jobs:
src/runtime/pm.ts,src/runtime/jobs.ts - Tokens:
src/tokens.ts - Mark:
brand/mark.svg(control-bar marionette) - Box image:
box/Dockerfile
MIT. See LICENSE.