Add detailed checkpoint push progress during pre-push - #1684
Open
SnowingFox wants to merge 4 commits into
Open
Conversation
Replace the dot spinner with phased stderr output aligned with Story CLI: session summary, git transfer progress, sync/rebase steps, and elapsed times. Closes entireio#1683. Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve the push pipeline conflict by preserving main's git-refs safety and SSH auth handling while retaining phased checkpoint push progress. Co-authored-by: Cursor <cursoragent@cursor.com>
7 tasks
gtrrz-victor
added a commit
that referenced
this pull request
Aug 3, 2026
Rework of the pre-push checkpoint-sync progress UX so it is useful to a human at a terminal but silent for the agents and CI that actually run most `git push`es. Now that git-refs is the default checkpoint backend, the old path printed an unconditional "[entire] Pushing N checkpoint ref(s)..." line plus a dot spinner to stderr that nothing downstream reads. - New pushReporter: presence-gated on IsTerminalWriter (non-TTY writes zero bytes), reveals a single in-place line only after a ~2s threshold, and clears it on completion (no scrollback residue). - git-refs default path (flushCheckpointRefsQueue) rewired to the reporter; removed the now-dead startProgressDots. - git --progress transfer detail routed to .entire/logs/ (operational metadata only) on BOTH backends, regardless of TTY. - Legacy git-branch path also silenced for non-TTY; error/actionable-hint lines still print unconditionally on both paths. - Push semantics unchanged (display only, fast-forward-only, never blocks the user's push). Builds on and supersedes #1684. Co-Authored-By: snowingfox <snowingfox@users.noreply.github.com> Entire-Checkpoint: 01KYW08431VR6EKA854NP1A0SR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem / intent
Closes #1683.
When
git pushruns Entire's pre-push hook, checkpoint sync can sit there for a long time — fetch, cherry-pick rebase onto remote tip, retry push, OPF, etc. Previously users only saw:No phase labels, no commit/session context, no transfer stats. A slow push feels stuck even when it's working.
This PR aligns Entire's stderr UX with Story CLI (
story/apps/cli): structured, phased progress on stderr so users always know what phase is running. Display-only — failures still degrade gracefully (user's main push continues) except existing OPF privacy aborts.Before → after
.....)fetching…,remote is N ahead,rebasing i/M…counting/compressing/writingfromgit --progressExample output (happy path + sync recovery)
Notes on the labels:
Checkpoint push: N commits, M sessions— pre-push summary from unpushedentire/checkpoints/v1commits, grouped byEntire-Sessiontrailer.counting/compressing/writing— parsed fromgit push --progressstderr (done state only, avoids spam).conflict (Xs)— generic marker that the first push failed and we're entering sync/recovery (not a merge-conflict UI; cherry-pick is conflict-free by design).rebasing i/M— in-memory cherry-pick onto remote tip, notgit rebase.What changed
New:
push_progress.go+ testsPure parsing/formatting (no I/O), TDD'd against Story's reference:
parsePushSummaryFromLog— group checkpoint commits by sessionformatSessionTree— tree display (max 5 sessions,new branchlabel)parseGitProgressLine/displayGitProgress— git transfer stderr → indented linesinteractive.ShouldStyle(respectsNO_COLOR)push_common.gostartProgressDotswith phased output + elapsed secondsdoPushRef: push → on failureconflict+Syncing with remote...→ retry pushfetchAndRebaseRefCommon: fetch done line, remote-ahead summary, per-commitrebasing i/M,rebasing donemanual_commit_push.goprintPushSummary()before push loop — silent on any failure, never blocks pushcheckpoint/remote/git.go--progresstogit push; capture stdout (porcelain) and stderr (progress) separatelymetadata_reconcile.gocherryPickOntoaccepts optional progress callback forrebasing i/MlinesOut of scope
redact/batch.go)Test plan
mise run check(unit + integration + Vogon canary)push_progress_test.go— parsers/formatterspush_common_test.go—already up-to-date/doneoutput updatedgit pushwith unpushed v1 commits → session tree + transfer linesentire/checkpoints/v1→ full sync sequence above