Pull requests
One branch. Many PRs. Review each change independently.
clean branchesSyncwheel coordinates every Git lane used by humans, AI agents, CI and delivery systems—without sacrificing review, safety or recovery.
$ syncwheel validate && syncwheel plan
✓ OK · no actions needed
One declared system. Every active PR has a place.
Three to set up, four that loop forever — click through, or just watch.
$ syncwheel stack sync feature-a
$ syncwheel stack create feature-c
Two PRs existed already — declare them in the manifest. The third is born managed, with create-only ref CAS and recoverable ledger intent.
$ syncwheel int rebuild --reason "refresh integration projection"
Every declared commit lands in one integration branch — grouped stack by stack, in manifest order.
$ syncwheel stack absorb feature-b --staged
New work lands on integration first — absorb sends each change to the PR that owns it, file by file or hunk by hunk.
$ syncwheel reconcile
Dry-run: compare manifest, branches, and remote tips. Nothing mutates.
$ syncwheel sync
Same changes, same commits: each drifted branch is replayed onto the new base, reproducibly, with a backup first and without creating a worktree.
$ syncwheel publish
$ syncwheel stack close feature-a --reason absorbed
Push managed branches, then close a squash or rebase delivery by verified final content. A normal absorbed close does not need --force. Read the exact nested --help before the first mutating subcommand in a session.
$ syncwheel resume
Another device or agent worked? Converge from the ledger.
PR management is only the beginning. Syncwheel separates Git responsibilities into dedicated projections, then coordinates them as one system.
One branch. Many PRs. Review each change independently.
clean branchesAll active PRs tested together before merge.
system testedPin and promote the exact tested composition for deployment inputs.
digest verifiedGeneration-bound create and close intents let a human or agent recover exactly where work stopped. Absorbed closes bind their proof to a fetched delivery SHA and the composed final content.
state protectedA channel is an ordered snapshot of exact stack revisions. Syncwheel rebuilds and publishes the Git branch; your deployment platform remains the authority for the environment.
Each stack owns the commits and PR branch for one change. Updating a stack does not silently move an existing channel pin.
main-integration combines every active stack for daily work. It is disposable and rebuildable, not an environment contract.
dev, test, or a preview branch can contain only the selected stack revisions, in a declared order.
A published channel proves a Git ref and composition digest. It never claims that a runtime deployed or became healthy.
$ create_plan="$(syncwheel channel create dev --lifecycle shared --stack core-api --operation-id create-dev-001)"
$ create_digest="$(printf '%s' "$create_plan" | python3 -c 'import json,sys; print(json.load(sys.stdin)["planDigest"])')"
$ syncwheel channel create dev --lifecycle shared --stack core-api --operation-id create-dev-001 --plan-digest "$create_digest" --apply
$ add_plan="$(syncwheel channel add dev checkout-v2 --operation-id add-checkout-001)"
$ add_digest="$(printf '%s' "$add_plan" | python3 -c 'import json,sys; print(json.load(sys.stdin)["planDigest"])')"
$ syncwheel channel add dev checkout-v2 --operation-id add-checkout-001 --plan-digest "$add_digest" --apply
$ apply_plan="$(syncwheel channel plan dev --operation apply --operation-id apply-dev-001)"
$ apply_digest="$(printf '%s' "$apply_plan" | python3 -c 'import json,sys; print(json.load(sys.stdin)["planDigest"])')"
$ syncwheel channel apply dev --operation-id apply-dev-001 --plan-digest "$apply_digest" --apply
$ publish_plan="$(syncwheel channel plan dev --operation publish --operation-id publish-dev-001)"
$ publish_digest="$(printf '%s' "$publish_plan" | python3 -c 'import json,sys; print(json.load(sys.stdin)["planDigest"])')"
$ syncwheel channel publish dev --operation-id publish-dev-001 --plan-digest "$publish_digest" --apply
Promotion copies exact tested pins; ephemeral previews expire as visible cleanup candidates and are never deleted remotely by surprise. Read the deployment channel guide.
Built for human–AI teams: no checkout is authoritative. Agents follow the declared contract, while people retain intent and approval.
Agent contract → Agent procedure →Everything advanced lives in the docs.
Install the CLI, create the default manifest for the current repository, then inspect what Syncwheel would change.
Install the command on your machine, then verify the executable before touching a repo.
$ uv tool install "git+https://github.com/NestDevLab/syncwheel"
$ syncwheel self status
syncwheel init creates the manifest with the standard base and integration defaults. Repository tracking remains an explicit policy choice.
$ syncwheel init
Validation and planning are read-only until you explicitly apply a reviewed plan.
$ syncwheel validate && syncwheel plan
$ syncwheel init # create the manifest
$ syncwheel validate && syncwheel plan # inspect, no mutation
Shorthands (rec, s, i, -p, -u), repo aliases, and self update live in the
README.