Deterministic orchestration graph runtime - declarative DAG pipelines with journal-based crash recovery
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-graph-c3c72d1340ef ,按照其中的说明把「graph」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
Run a deterministic orchestration graph from a declarative JSON descriptor.
The runtime consumes the sealed-descriptor and pure-scheduler contracts in
src/graph/* and executes through an independent OS process (omc graph run),
so crash recovery (kill mid-run, rerun, resume from journal) works for real.
/oh-my-claudecode:graph <descriptor.json>
/oh-my-claudecode:graph "build then test then ask me before deploy" (author the descriptor first)
The execution surface is always the CLI subcommand:
omc graph run <descriptor.json> [--runs-root <dir>]
Run it via the Bash tool for non-interactive graphs. Progress lines stream as
[run], [node], [ok], [fail], [join], [done].
.omc/graph-runs/<run_id>/When NOT to use: exploratory one-off work (use conversation or /team); anything needing adaptive re-planning mid-run (graphs are deterministic).
Descriptor given -> go to step 3.
Pipeline described -> author the descriptor JSON (schema below), write
it next to the project (suggest .omc/graphs/<name>.json) and show it to
the user before running. run_id must be unique per logical pipeline;
rerunning with the same run_id RESUMES, not restarts.
Approval nodes: if the descriptor contains any "kind": "human-approval"
node, do NOT run it through the Bash tool (stdin is not interactive there;
EOF fails closed to denied). Tell the user to run interactively instead:
! omc graph run <file>
The ! prefix runs it inside this session with live stdin so y/n works.
Run and relay progress. Exit codes (normative): 0 succeeded | 1 terminal failed | 19 another writer owns this run (busy) 20 corrupt/tampered journal (fail-closed) | 21 descriptor drift on resume | 70 runtime crash (unmapped error)
Resume: rerunning the same command after a crash replays committed transitions and continues. Completed nodes never re-execute.
{ "descriptor_version": 1, "run_id": "unique-pipeline-id", "revision_id": "rev-1", "goal": "one line", "nodes": [ { "id": "n1", "kind": "command", "title": "...", "timeout_ms": 60000, "max_attempts": 2, "effect_policy": { "policy": "side_effect_free" }, "command": "npm test" }, { "id": "a1", "kind": "agent", "title": "...", "timeout_ms": 300000, "max_attempts": 1, "effect_policy": { "policy": "side_effect_free" }, "instructions": "..." }, { "id": "gate", "kind": "human-approval", "title": "...", "prompt": "Proceed?" } ], "edges": [ { "id": "e1", "kind": "fixed", "from": "n1", "to": "a1" } ], "entry_node_ids": ["n1"], "concurrency_limit": 2, "terminal_verification_node_id": "a1" }
Edge kinds: fixed | conditional | fan_out/join pairs | back_edge (bounded retries via max_traversals). See src/graph/schema.ts for the authoritative Zod schema — and read the Capability Boundary section above for what built-in executors actually execute today.
fixed edges and
fan_out/join pairs. conditional and back_edge routes are fully
supported by the runtime and scheduler contracts but require a custom
NodeExecutor that emits route on its results — built-in executors never
produce routes, so graphs relying on them fail fast with
route_required rather than guessing.idempotent commands, the resolved key is available to the
command as GRAPH_IDEMPOTENCY_KEY before it starts and is also recorded for
downstream dedupe. Built-in executors reject reconcile; reconciliation
requires a custom executor with an actual external reconciliation authority.
Exactly-once for external side effects is out of scope for v1.GRAPH_*, and the optional idempotency key), not the host's full secrets.
Commands are not filesystem/process sandboxed.Read, Glob, and Grep, permissionMode: dontAsk, session
persistence disabled, and a provider-specific environment allowlist. Agent
timeouts abort and interrupt the SDK query. Use a custom executor for any
agent that needs mutation or external effects. Treat
.omc/graph-runs/<run_id>/descriptor.json as executable content.