Manifest is the lens
One JSON file declares which commits belong to which PR.
Hack in one place. Syncwheel rebuilds, reconciles, and publishes every PR branch from one declared manifest.
You work in one place. Syncwheel projects it into clean PRs.
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.
$ syncwheel int rebuild
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 --worktree-root ../wt
Same changes, new commits: each drifted branch is replayed onto the new base — in a worktree, backup first.
$ syncwheel publish --worktree-root ../wt
Push managed branches with --force-with-lease.
$ syncwheel resume
Another device or agent worked? Converge from the ledger.
One JSON file declares which commits belong to which PR.
Test everything together. Throw it away. Rebuild it identically.
Edits on integration get assigned — per file or per hunk — to their stack.
Append-only history. Any machine resumes where the last stopped.
Built for AI agents: no checkout is authoritative — agents follow the manifest, not memory.
Agent contract → Agent procedure →Everything advanced lives in the docs.
Python 3.11+, Git, uv.
$ uv tool install "git+https://github.com/NestDevLab/syncwheel"
$ syncwheel --help
# developing syncwheel itself? `uv tool install --editable /path/to/syncwheel`
$ syncwheel init # writes .syncwheel/manifest.json
$ syncwheel stack create feature-a --branch pr/feature-a -u # --include-in-integration
$ syncwheel stack set feature-a origin/main..HEAD
$ syncwheel reconcile # dry-run plan first, always
$ syncwheel sync --worktree-root ../wt
$ syncwheel publish --worktree-root ../wt
Shorthands (rec, s, i, -p, -u), repo aliases, and self update live in the
README.