diff --git a/README.md b/README.md index 5052147b..007110ea 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

GraphCode — graphs of live, steerable Claude Code sessions on macOS

+

GraphCode — graphs of live, steerable coding-agent sessions on macOS

Release Platform License: FSL-1.1-MIT @@ -8,13 +8,15 @@ Website · Download .dmg · All releases · Shortcuts

-You can run one Claude Code session in a terminal. GraphCode lets you run ten — connected, unattended, and +You can run one coding-agent session in a terminal. GraphCode lets you run ten — connected, unattended, and still yours to attach to and correct mid-run. Each node is a unit of work inside a real CLI coding-agent -session; each edge is a hand-off, message, or spawn between them. They are live terminals, not headless jobs. +session: **Claude Code, GitHub Copilot CLI, Codex, or OpenCode**, chosen per loop. Each edge is a hand-off, +message, or spawn between them, and an edge never asks which agent is on either end — a Codex loop hands off +to a Claude Code loop that messages a Copilot one. They are live terminals, not headless jobs. **[Graph Engineering, simplified →](https://graphcode.app/)** — the mental model, then the machinery. -![Two projects and their connected loops on one GraphCode canvas — every node a live terminal you can attach to](screenshots/graph-hero.png) +![Seventeen seconds of GraphCode: jumping between live child sessions, the canvas where an orchestrator fanned them out, and a new loop created with its own agent and done check](docs/assets/graphcode-demo-hero.gif) ## How it works @@ -32,14 +34,16 @@ Two design choices explain most of the rest: - **GraphCode schedules nothing.** A time-based loop's recurrence lives *inside* its session, written into the prompt with the agent's own `/loop` skill; the daemon only keeps the session alive. That is what makes a running loop something you can attach to and correct, rather than a job that already finished somewhere. + Codex and OpenCode have no such skill, so a time-based loop on them needs the experimental **Daemon + heartbeat** switched on in Settings. - **Sessions outlive everything.** Each loop's terminal is a [`zmx`](https://zmx.sh) session, so it survives quitting the app and rebooting — the backend's session ID is persisted, so relaunching resumes the conversation with `--resume` rather than starting a duplicate. ## Install -Requires **macOS 15+ on Apple Silicon** (arm64), with **Claude Code on your `PATH`** — GraphCode launches it, -it doesn't bundle it. +Requires **macOS 15+ on Apple Silicon** (arm64), with at least one agent CLI on your `PATH` — `claude`, +`copilot`, `codex`, or `opencode`. GraphCode launches whichever one a loop names; it bundles none of them. ```sh brew install --cask scgopi/graphcode/graphcode @@ -52,12 +56,16 @@ Releases are Developer ID signed and notarized. 1. **Add a project** — the sidebar's ⊕ menu: a local folder, a clone from a URL, or a remote repository over SSH (key auth and zmx on the server; loops run there while this Mac steers them). -2. **Create a loop** — ⊕ on the canvas. Write the prompt and hit Create; the type chooser explains what - each kind hands off, and a goal's done check has a **Test** button that runs it as the daemon will. +2. **Create a loop** — ⊕ on the canvas. Write the prompt, pick the agent it runs as (Claude Code unless you + change **Settings ▸ New loops use**), and hit Create; the type chooser explains what each kind hands off, + and a goal's done check has a **Test** button that runs it as the daemon will. From a shell, + `graphcode node create` takes the same choice as `--backend claudeCode | copilotCLI | codex | openCode`; + a loop that creates children without naming one hands them its own. 3. **Open it** — click the node for that loop's terminal workspace: tabs, splits, ⌘K to jump to any loop, ⌘⇧R to walk the ones asking for you ([shortcuts](https://graphcode.app/shortcuts.html)). You attach to the live session. 4. **Connect loops** — drag between nodes. An edge is a hand-off by default (fires when the source - resolves); it can also be a message or a spawn, with a condition and a cycle guard. + resolves); it can also be a message or a spawn, with a condition and a cycle guard. The agents on + either end can differ. ## Parts diff --git a/docs/assets/graphcode-demo-hero.gif b/docs/assets/graphcode-demo-hero.gif new file mode 100644 index 00000000..2df55a5a Binary files /dev/null and b/docs/assets/graphcode-demo-hero.gif differ