* fix: source commit pushed status from git remote, not PR commits
Commits showed as "not pushed" whenever the branch had no open PR,
since the UI derived pushed status by matching local SHAs against
the PR's commit list. Sourcing it from the upstream tracking ref in
agentctl's GetLog keeps the answer correct without a PR, after
rebases, and across multi-repo workspaces.
* fix: treat PR-matched commits as pushed alongside the git remote signal
mergeCommits now flags a commit as pushed when EITHER the backend's
git-sourced flag is true OR a PR commit matches by SHA. The git signal
fixes the original "no PR = unpushed" bug; the PR signal preserves the
"PR exists ⇒ commit is on remote" assumption that the E2E mocks rely
on (and that holds in practice, since GitHub PRs require pushed
branches). Also corrects the validation-path comment in
markPushedCommits to describe the actual non-branch fall-through.
* perf: bound rev-list walk in markPushedCommits to result length
Without -n the walk was unbounded — a branch with many local-only
commits would traverse full unpushed history per GetLog call. Capping
at len(commits) keeps the two walks proportional. rev-list walks
newest-first like GetLog, so the cap covers every commit we mark.
---------
Co-authored-by: Kandev Agent <agent@kandev.dev>
* fix(changes-panel): scope commits/diff to live branch divergence; flatten single-repo
Two bugs in the COMMITS panel made it surface commits and file changes
that were already on main:
1. The commit list and the cumulative diff both anchored to a stale base.
Commit list used `git merge-base HEAD <local-branch>` and the file diff
used the session's stored base SHA captured once at session start. On
long-lived worktrees the local main ref lags far behind origin/main, so
the merge-base lands on an old SHA; once the agent merges main back in,
the stored base is also stale. Both end up sweeping in dozens of main
commits as if they were the branch's work.
2. `git log <base>..HEAD` follows both parents of a merge commit by
default, surfacing main commits brought in via merges from main.
Fixes:
- agentctl computes merge-base against `origin/<target_branch>` (with a
local-ref fallback for unfetched/local-only branches), and uses that
for both the commit log and the cumulative diff. Mirrors GitHub's
three-dot PR diff semantics — anchor to live divergence with the
upstream, not a session-start snapshot.
- `git log` now passes `--first-parent` so only the branch's own line of
work plus its merge commits show up; commits brought in via merges from
main are excluded.
Frontend: drop the per-repo "REPOSITORY" sub-header in the COMMITS panel
for single-repo workspaces. CommitsRepoGroup gains a `showHeader` prop;
when the workspace has one untagged group the section renders flat with
the per-repo Push / PR (and Stage all / Commit / Unstage all) buttons
lifted into the section header. Multi-repo rendering unchanged.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: address PR review feedback
- Scope --first-parent to the divergence-range path only (Greptile P1).
The flag is wrong for open-ended history calls — future activity
widgets etc. need the full graph.
- Log empty merge-base case in cumulative diff (Greptile P2). Silent
fallback to stored base was invisible during diagnostics.
- Rename TestRunGitCumulativeDiffForRepo_PrefersOriginRef →
TestComputeMergeBase_CorrectAnchorForCumulativeDiff (Claude). Test
exercises computeMergeBase, not the runGitCumulativeDiffForRepo
conditional; new name reflects what it actually proves.
- Add TestGetLog_NoBaseReturnsFullGraph to lock in the --first-parent
scoping.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: address PR review round 2
- Drop dead ActionButtonsSection from changes-panel-timeline.tsx (unused
export, no consumers anywhere). Brings the file from 640 → 516 lines,
comfortably under the 600-line TS limit Claude flagged.
- Extract isSingleRepoGroup helper into lib/group-by-repo.ts and use it
in all three sites (CommitsSection, FileListBody, FileListSection) so
single-repo detection has one source of truth.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>