Skip to main content

onepipeline

Execute a task DAG over oneagentgraph and onevcs, merging their event streams into one.

onepipeline is the composition layer. It owns the plan — a dependency graph mixing direct agent nodes, repository lifecycle nodes, and explicit human actions — executes it continuously, dispatching each node the moment its dependencies settle, through a pluggable executor seam, and keeps a live channel open to the planner supervising the run. The agents come from oneagentgraph; the clones, worktrees, publications, and change requests come from onevcs. Nothing here verifies a change: that is the repository's own merge path — the host's required checks where a change publishes remotely, and the repository's pre-push hook at the publishing push where it publishes locally. Dependency direction is one-way: neither sibling depends on this crate.

The public types, traits, config schemas, and CLI surface are the approved contract in docs/contract.md, compiled — and implemented behind it. onevcs is linked and called: sessions, publication, and a session's event stream are library calls, so what a publication did is a typed value rather than a line of prose to parse. oneagentgraph is still run as a CLI, so a build of it that refuses will make the dispatches this crate starts refuse too; the composition layer itself is complete.

Install

pip install onepipeline-cli      # prebuilt binary, no Rust toolchain
npm install -g onepipeline-cli   # the same binary, via npm
cargo install onepipeline        # from crates.io, compiled locally

To install a revision that has not been released yet — which today is every revision, since the crate depends on its siblings by git and a git dependency cannot be published — build it from the repository:

cargo install --git https://github.com/nickderobertis/onepipeline onepipeline --locked

The package name is not optional: cargo install --git searches the whole repository, and this one also carries the onepipeline-testfakes test harness, so an unqualified command fails with multiple packages with binaries found.

Prebuilt archives for Linux (x86-64, arm64), macOS (Intel, Apple silicon), and Windows (x86-64) are attached to every release, with sha256 checksums.

What it does

onepipeline start plan.json --heartbeat-interval 1800

start drives the run itself: a node — and each step within a lifecycle node — dispatches the moment its dependencies settle, and settlement triggers integration and publication immediately. No agent is required. The only pauses are decision points: a ready kind: human node, or any surface declared blocking, holds back the subtree that depends on it while every other branch carries on, and clearing it with attest or reply resumes that subtree inside the running loop.

--dag-graph REF attaches an agent graph as an observer — the shipped one is a monitor member that watches the stream and raises what does not line up, plus a resettable-cron check-in member that surfaces a status when nobody has reported one for a while. It never drives the engine. Attached, start returns when the run settles; exit 3 means nothing is driving the run, and onepipeline adopt RUN attaches a fresh driver to the intact ledger.

A lifecycle node states the title its change request opens under, and may state its body too. --pr-author-graph REF names an agent graph that drafts that body instead, from the branch's own diff, once the branch is verified and before the change request is opened; naming none is the default, and a drafting dispatch that does not get there costs the change request its body and nothing else. It costs no visibility either: a drafting dispatch that was configured, attempted, and produced no body is recorded against the node under one of three endings — dispatch-failed for one that could not be run or ran without succeeding, schema-refused for one whose every answer the schema rejected, and no-body for one that answered inside the schema and put nothing in it, which are three different fixes — and the node's own settlement says the same thing, so results shows it. Naming no graph and writing the body yourself spend no dispatch and are not reported.

A publication that fails does not always finish the node. onevcs says which failure it was, and five of them settle under a word of their own — checks-failed for a required check the host reports concluded red, checks-unsettled for a bound that elapsed with the change still outstanding, push-rejected for a push the merge path refused, sync-conflict for a base that moved under the publication, and pushed-unverified for a push that reached the remote with the merge path unreadable behind it. Each of the five leaves the rejected tree on the branch the session handed back, so the node is dispatched again on that branch, with no step recorded as completed and with the failure's reason and the id of every artifact its publication recorded delivered as that dispatch's own context — the worker meets the diagnosis, on the tree that has to change. Everything else settles publication-failed as it always did and is not retried: the repository's own gate, a request refused at a trust boundary, and a seam with no implementation behind it all answer the same way however many times they are asked. The loop is bounded by ONEPIPELINE_PUBLICATION_ATTEMPTS, three by default, and a node that spends it settles failed under the last failure's word, saying how many attempts were made and what each one ended with.

The planner supervises over the channel:

onepipeline next run-1                                   # read the next surface
onepipeline reply run-1 <<<'{"version":1,"commands":[    # edit the live graph
  {"op":"retry","id":"failed","node":{"id":"retry","task":"..."}}]}'
onepipeline attest run-1 design-approval                 # complete a human action

Every edit is applied or rejected with a reason: reply exits 0 when the reconciler applied it, 1 when it is queued but not yet reconciled, and 2 when it was refused.

Read-only views — runs, status, host, monitor, results, goals, transcript, telemetry — report unread surfaces, driver liveness, and provider health without touching a run. status says what each in-flight node is doing right now, with an event count and an age; transcript RUN [NODE] renders a dispatched turn's tools and its words; telemetry reports what each party spent and where the wall clock went, in eight buckets that sum exactly. Anything nothing in the stack measures is reported absent, never as a zero.

Where a dispatch runs

The executor seam decides. v1 ships the local executor only; the trait and the rules grammar are shaped so a dispatch-server or Kubernetes executor is a config change rather than a code change.

executors:
  - {name: local, type: local, max_load1: 8.0, min_free_mem: 2GiB}
rules:
  - when: {executor_has_capacity: local}
    use: local
  - use: local

Ordered: the first rule whose when holds decides, and a rule with no when is the fallback. A when tests an executor's capacity, the node's own labels (when: {node_label: {persona: reviewer}}), or both — several conditions in one when all have to hold.

Development

just bootstrap   # from a clean clone
just check       # the deterministic gate
just gate        # check + the diff-scoped llmlint tier

just --list is the full command surface. docs/contract-divergences.md records every place the code could not compile the contract exactly as written, and what the planner who owns the contract ruled on each.

License

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

onepipeline_cli-0.14.0-py3-none-win_amd64.whl (7.0 MB view details)

Uploaded Python 3Windows x86-64

onepipeline_cli-0.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

onepipeline_cli-0.14.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

onepipeline_cli-0.14.0-py3-none-macosx_11_0_arm64.whl (6.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

onepipeline_cli-0.14.0-py3-none-macosx_10_12_x86_64.whl (6.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file onepipeline_cli-0.14.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for onepipeline_cli-0.14.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 93a5a02ae7f39db3e1c89eae4ebd615b1a16be674dc1d8cc5afa4cb79a86c39b
MD5 0e2eaba43b8400c0bc4339f8c2d411b9
BLAKE2b-256 7558deea0797d844d07d368197b14d24044f570b2c300bb09a89e86c036f7267

See more details on using hashes here.

File details

Details for the file onepipeline_cli-0.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for onepipeline_cli-0.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 be79f204b673a7d854760032a1fcbb183a194cd5e62d86cebbaca5ca155f9b7c
MD5 288041e9e760d7517897a9f1235693e1
BLAKE2b-256 7eb230b1e5cf5ca162f061607e294385f86674cecaca58a48b4edf94308c49f3

See more details on using hashes here.

File details

Details for the file onepipeline_cli-0.14.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for onepipeline_cli-0.14.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1405b2d6e7249fb6ede3d826bb9ea264aac9bf19a8ce73ba1efc2e808e981cb5
MD5 ef8a3f0f27f2e90ce90f38399532a7f2
BLAKE2b-256 7f277078fe236bd65d5ca54897bc9adeac3a93457b9e12231e68626ff09ddbc6

See more details on using hashes here.

File details

Details for the file onepipeline_cli-0.14.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for onepipeline_cli-0.14.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1e2a26e374a2671e36c925c82daab8c3f5902d21bdf77f4d41b1c4f9ba828c7
MD5 102dcce958270a7b9fadea16179ee144
BLAKE2b-256 6dc8d2cf783f0ec2f5221f6cf8f24d7d702ac5838f48379fb7a37608d60cb337

See more details on using hashes here.

File details

Details for the file onepipeline_cli-0.14.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for onepipeline_cli-0.14.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e4f0694e267ae5312461f12ebaeb74a3f52378e2c23715037a33dbaf3c25a6af
MD5 f80ef2c3c2c3bbefbb1e48e0a6b1e4ac
BLAKE2b-256 c22e24049f58ae58c171fdf0f3a4e95dbb688e3a75008ce1032283851abbb8c9

See more details on using hashes here.

Release history Release notifications | RSS feed

0.18.3

5 files

0.18.2

5 files

0.18.1

5 files

0.18.0

5 files

0.17.5

5 files

0.17.4

5 files

0.17.3

5 files

0.17.2

5 files

0.17.1

5 files

0.16.4

5 files

0.16.3

5 files

0.16.2

5 files

0.16.1

5 files

0.15.2

5 files

0.15.1

5 files

0.15.0

5 files

0.14.2

5 files

0.14.1

5 files

This release

0.14.0 This release

5 files

0.13.0

5 files

0.12.4

5 files

0.12.3

5 files

0.12.2

5 files

0.12.1

5 files

0.12.0

5 files

0.11.0

5 files

0.10.1

5 files

0.10.0

5 files

0.9.0

5 files

0.8.6

5 files

0.8.5

5 files

0.8.4

5 files

0.8.3

5 files

0.8.2

5 files

0.8.1

5 files

0.8.0

5 files

0.7.5

5 files

0.7.4

5 files

0.7.3

5 files

0.7.2

5 files

0.7.1

5 files

0.7.0

5 files

0.6.3

5 files

0.6.2

5 files

0.6.1

5 files

0.6.0

5 files

0.5.0

5 files

0.4.0

5 files

0.3.1

5 files

0.3.0

5 files

0.2.0

5 files

0.1.15

5 files

0.1.14

5 files

0.1.13

5 files

0.1.12

5 files

0.1.11

5 files

0.1.10

5 files

0.1.9

5 files

0.1.8

5 files

0.1.7

5 files

0.1.6

5 files

0.1.5

5 files

0.1.4

5 files

0.1.3

5 files

0.1.2

5 files

0.1.1

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page