Skip to content

Finish the roadmap: history, remotes, conflicts and the agent workflow - #4

Merged
letrquan merged 3 commits into
mainfrom
feat/complete-the-roadmap
Sep 3, 2026
Merged

letrquan merged 3 commits into
mainfrom
feat/complete-the-roadmap

Conversation

@letrquan

@letrquan letrquan commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Closes the remaining roadmap items. Every box in docs/ROADMAP.md is now ticked.

What's here

Phase 4 — history. Paginated, HEAD-anchored log per worktree with a lane-aware graph, commit detail, file history that follows renames, Monaco gutter blame, four explicit search modes, cherry-pick, revert, and an interactive rebase planner.

Phase 5 — remotes. Fetch, pull, push and tag push under a credential-aware network intent, detached from the bridge with live progress and cancellation. Force is always --force-with-lease. Plus PR integration through gh, kept at arm's length behind the same failure classification as git.

Phase 6 — conflicts. One four-pane Monaco surface — base, ours, theirs, editable result — shared by merge, rebase, cherry-pick, revert, mailbox apply and stash restore, each keeping its own continue/skip/abort semantics.

Phase 8 — the differentiators. Cross-worktree comparison, accept an agent's work into main, reject and reset, batch review, agent session links, and a per-worktree review watermark.

Cross-cutting. Clone as a detached operation; a repository-wide write lease; .gitattributes; a preview for every destructive action; and a keyboard path to everything the mouse can reach.

Two things worth a reviewer's attention

The write lease and the network path. Every mutation takes a short repository-wide lease, held from re-reading state to classifying git's result — but fetch, push and push-tag deliberately run without it. Neither can change the worktree, both legitimately run for minutes, and holding a two-second lease across a transfer turned any stage made during a push into a refusal. Pull still takes it, because it merges into the working tree.

Previews ask git rather than guessing. Force-push runs push --dry-run against the remote and names the commits the server would stop having, because --force-with-lease is decided against a tip only the server has. Worktree removal lists ignored content, which git's own check omits — the case where nothing refuses is the one where a .env disappears quietly.

Verification

  • dotnet build clean, tsc --noEmit clean
  • 595 tests pass, 24 skipped (they need local validation repos that aren't on CI)
  • Driven in the built app: refs panel keyboard navigation, history paging, Ctrl+B/Ctrl+H from inside the editor, clone dialog

Note

There is no PR workflow in this repository — the only one is release.yml, which fires on v* tags. The numbers above are from a local run.

🤖 Generated with Claude Code

letrquan and others added 2 commits September 4, 2026 01:56
…workflow

The remaining phases, landed together because they were built together and
because each one needed the others' plumbing: history reads what the operation
banner pauses on, conflict resolution is entered from merge, rebase, cherry-pick
and stash alike, and the agent-workflow actions are compositions of all of it.

Phase 4 — history. A paginated, HEAD-anchored log per worktree with a lane-aware
graph, commit detail, file history that follows renames, Monaco gutter blame,
four explicit search modes, cherry-pick, revert, and an interactive rebase
planner. A mutation validates the full object against the displayed HEAD, so a
stale overlay cannot apply an unrelated commit.

Phase 5 — remotes. Fetch, pull, push and tag push run under a credential-aware
network intent, detached from the bridge with live progress and cancellation.
GCM may open its own sign-in UI; terminal prompts stay disabled and embedded URL
credentials are redacted everywhere they could surface. Force is always
--force-with-lease. Pull rebases, merges or requires fast-forward, on request.

Phase 6 — conflicts. One four-pane Monaco surface — base, ours, theirs and an
editable result — shared by merge, rebase, cherry-pick, revert, mailbox apply and
stash restore, each keeping its own continue/skip/abort semantics. Marker regions
are first-class, binary sides are byte-exact, and rerere is available.

Phase 8 — the differentiators. Cross-worktree comparison, accept an agent's work
into main, reject and reset it, batch review with [ and ], the agent session link,
and a per-worktree review watermark that ignored build output cannot bless.

Also: PR integration through gh, kept at arm's length behind the same failure
classification as git; clone as a detached operation with its destination checked
before git starts; a repository-wide write lease so two Chapter windows cannot act
on each other's stale snapshot; and .gitattributes, which pins the LF the index
already holds so that an app which now writes files cannot start committing line
endings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every item is now ticked, so the two cross-cutting ones say what they are:
standing rules rather than closed boxes. A new destructive action needs a preview
unless it is one of the named exceptions, and a new action of any kind needs a
keyboard path.

The notes keep the roadmap's habit of recording what running the thing taught,
not only that it is done — that `worktree prune --verbose` reports on stderr, that
a force push has to ask the remote what it would replace because the lease is
decided against a tip only the server has, that the refs panel documented three
shortcuts which fired only after a mouse click had moved focus out of its filter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
chapter Error Error Sep 3, 2026 6:59pm UTC

The repository had one workflow and it fires on tags, so a pull request's only
status was a Vercel deployment of an app that has no web target — failing
identically on main, and saying nothing about whether the code builds.

Windows-only because the app is: Chapter.App targets net10.0-windows and hosts
WebView2, so the whole suite runs here rather than a portable subset. The
front-end is built before .NET because `dotnet build` only warns when
src/Chapter.Web/dist is empty — a job that skipped npm would go green having
packaged an empty window. That warning is an error here for the same reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@letrquan
letrquan merged commit 3a888a3 into main Sep 3, 2026
2 of 3 checks passed
@letrquan
letrquan deleted the feat/complete-the-roadmap branch September 3, 2026 19:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant