Skip to content

Add version control command center#3177

Open
Quicksaver wants to merge 107 commits into
pingdotgg:mainfrom
Quicksaver:split/version-control-panel-work
Open

Add version control command center#3177
Quicksaver wants to merge 107 commits into
pingdotgg:mainfrom
Quicksaver:split/version-control-panel-work

Conversation

@Quicksaver

@Quicksaver Quicksaver commented Jun 19, 2026

Copy link
Copy Markdown

Summary

Adds a Git-backed Version Control command center to the web right panel and a native mobile route. It is scoped to the active project/repository cwd, works from draft or existing conversations once repository context is available, and keeps Git operations server-authoritative across browser, desktop, VS Code, and remote clients.

The panel focuses on actionable repository work rather than being a full Git dashboard: dirty working trees, local branch sync state, stashes, remotes, sibling worktrees, likely fork branches, and open change-request bases.

What Changed

  • Added SOURCE_CONTROL.md as the branch-specific behavior and validation reference for the Version Control panel.
  • Added server-side SourceControlPanelService RPC support for snapshots, branch/stash/commit/compare data, selected-file commit and stash flows, discard operations, branch actions, remote actions, and provider-derived PR/MR base checks.
  • Extended GitHub, GitLab, Azure DevOps, and Bitbucket source-control provider plumbing so actionable rows can account for open change-request bases while preserving bounded provider diagnostics.
  • Added live VCS refresh support through VcsStatusBroadcaster and VcsLocalWatch, including ref-counted local watchers, .git/ event filtering, gitignore-aware suppression, explicit local refreshes, and sibling worktree watcher retention.
  • Added the React Version Control panel UI with Actionable and Remotes sections, working-tree file selection, inline diffs, branch/stash/commit rows, searchable compare bases, guarded destructive actions, context menus, manual fetch controls, and a conservative five-minute Actionable remote fetch.
  • Added a native mobile Version Control route from the Git menus with touch-oriented Actionable and Remotes sections, selected-file operations, branch/stash/remote actions, dedicated review-diff navigation, and stale-result protections.
  • Centralized right-panel add-surface action metadata so the empty state and add menu share the same Version Control surface gating and action model.
  • Added dirty sibling worktree rows and cwd-scoped right-panel File previews so Git operations and file reads target the checkout that owns the displayed changes.
  • Hardened branch sync behavior around same-name remote tracking, fork branches, open PR/MR base branches, local-only publishing, diverged branch actions, branch names containing slashes, and branch worktree cwd routing.
  • Added concurrency and stale-result protections through per-target operation state, per-thread metadata sequencing, expectedBranch write guards, and environment/thread/cwd-scoped panel state.
  • Hardened self-hosted GitLab open-MR discovery by passing a full project URL to glab mr list --repo instead of an ambiguous scheme-less host/path locator, without duplicating a configured base-URL path prefix already present in the remote path.
  • Preserved typed Git and provider failures as bounded, sanitized diagnostics so process, authentication, API, and command-output causes remain distinguishable without exposing unbounded error payloads.
  • Hardened working-tree handling for renamed files, quoted porcelain paths, mixed staged/unstaged rows, selected-file commit pathspec semantics, discard failures, generated commit failures, and branch deletion resolution.
  • Hardened review follow-ups for source-control thread metadata sequencing after a thread is closed/reopened and default compare ref selection for repositories whose checked-out default branch is not named main or master.
  • Hardened right-panel fallback behavior so an unavailable active Source Control surface falls back to another visible surface instead of forcing the empty right-panel state.
  • Hardened cached Version Control panel restores so cached snapshots show the refresh indicator while revalidating, and restored expanded branch/stash rows hydrate missing detail payloads even when the snapshot fingerprint is unchanged.
  • Hardened restored stash expansion and cached stash details so stash@{n} renumbering after stash create/drop operations does not show details for the wrong stash.
  • Hardened native Version Control navigation and state so diff routes remain workspace overlays, each cwd fetches automatically only once per mounted route, stash detail identity survives positional-ref renumbering, and remote rows bind only to locals tracking the exact remote-qualified ref.
  • Hardened native Version Control publishing and detail loading so repositories with multiple remotes prompt for the destination, interrupted detail requests retry without surfacing cancellation errors, and interrupted diff reads cannot remain stuck on the loading screen.
  • Isolated selected-file commit preparation, message generation, and commit execution through a temporary selected-only Git index across root web, sibling-worktree web, and mobile flows; shared staging and unstaging use literal-pathspec semantics, and selected paths synchronize into the real index only after success, so failures leave the user's staged state untouched while deselected staged changes remain staged. Post-commit index cleanup is best-effort so a cleanup failure cannot report that an already-created commit failed or suppress the caller's refresh.
  • Limited idle Git and filesystem churn with subscription-scoped watcher lifetimes, ignored-path suppression, focus/visibility refreshes, and a five-minute remote fetch interval.
  • Extended shared RPC, IPC, Git, settings, client-runtime, and VCS contracts for the source-control snapshot and operation protocol.
  • Added desktop and web context-menu separator support so destructive source-control actions remain grouped consistently after both automatic and explicit separators.
  • Hardened rebase ref handling with an option separator so ref names cannot be interpreted as command flags.
  • Added focused tests for source-control service behavior, provider base detection, VCS broadcaster/watch behavior, source-control panel state, shared Git contracts, and client-runtime VCS action helpers.

Why

T3 Code needs a compact place to answer "what repository work needs attention now?" without forcing users into a full external Git UI. This change keeps the surface decision-oriented: commit or stash selected changes, inspect branch sync state, publish or sync branches, review stashes, and notice when a PR/MR base has moved.

The server-owned design keeps behavior consistent across clients and avoids browser-side Git execution, while the periodic fetch and local watchers keep the panel current without introducing a high-frequency polling loop.

Validation

  • Focused server coverage passed for SourceControlPanelService, VCS broadcasting and Git driver behavior, provider base detection and error handling, self-hosted GitLab CLI behavior, and desktop context-menu integration.
  • Focused web coverage passed for Version Control panel logic and state, thread source-control metadata handling, and right-panel surface behavior.
  • Focused shared coverage passed for Git contracts/utilities and client-runtime VCS actions.
  • Focused native coverage passed for Version Control request and model behavior.
  • pnpm exec vp check passed with 0 errors and 9 existing warnings in unrelated web files.
  • pnpm exec vp run typecheck passed.
  • pnpm exec vp run lint:mobile passed its available static checks; optional SwiftLint, ktlint, and detekt checks were skipped because those tools are not installed.
  • Playwright against an isolated server on 13782, web client on 5742, and disposable throwaway repository verified that an intentional selected-file commit failure surfaces through vcs.panel.commitStaged without staging either file; after removing the failing hook, the selected-only commit succeeded, included only selected.txt, left deselected.txt unstaged, and left the real index empty.
  • Integrated iOS Simulator verification was not available because no T3 Code Dev client or reusable .app artifact was installed; the TypeScript-only workflow correctly avoided a native rebuild.

Proof

Screenshot 2026-06-16 at 19 26 39 share_6957608233718139520

Note

High Risk
Large cross-cutting surface touching Git mutations, thread metadata, multi-provider auth, and concurrent snapshot/cache behavior across web, mobile, desktop, and server.

Overview
Adds a server-owned Version Control command center on the web right panel and a native full-screen route, wired through new panel RPCs, live VCS watchers, and shared @t3tools/shared/sourceControl sync/compare rules documented in SOURCE_CONTROL.md.

Web and thread integration mounts SourceControlPanel per environment/thread/cwd with cached UI state, Actionable vs Remotes layout, selected-file commit/stash/discard, branch/stash/remotes actions, sibling worktrees, and ChatView metadata routing with expectedBranch guards. Mobile adds VersionControl / VersionControlDiff overlay routes from Git menus, snapshot sequencing, cwd-scoped working-tree enrichment, publish-remote prompting, and model helpers covered by unit tests.

Server and providers extend SourceControlPanelService and VCS broadcasting (debounced local watches, .git/ filtering, conservative fetch cadence). GitHub/GitLab/Azure/Bitbucket gain remote-scoped change-request lookups, optional commit author avatars, and errors normalized through sourceControlProviderError / sanitizeErrorCause so panel RPCs get bounded diagnostics. Desktop context menus now honor explicit separator items and still insert a separator before the first destructive action when it leads the menu. Client runtime adds forceRefresh on atom queries for authoritative panel reads.

Reviewed by Cursor Bugbot for commit 73c923a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add Version Control command center panel to web and mobile apps

  • Introduces a full Version Control panel surface across web (SourceControlPanel.tsx) and mobile (VersionControlRouteScreen.tsx), exposing branch sync, working-tree file changes, commit history, stash management, and file diffs.
  • Adds a SourceControlPanelService on the server and wires ~30 new WebSocket RPC endpoints in ws.ts, covering staging, committing, pull/push, branch operations, remotes, and stash actions; mutating operations trigger a git status refresh.
  • Extends all four source control providers (GitHub, GitLab, Azure DevOps, Bitbucket) with a getCommitAvatarUrl method and adds per-provider showCommitAuthorAvatar settings defaulting to false.
  • Adds local filesystem watchers in VcsStatusBroadcaster that debounce non-.git change events and trigger status refreshes across sibling worktrees.
  • Changes the default automatic git fetch interval from 30 seconds to 5 minutes.
  • Risk: the fetch interval behavioral change may cause slower detection of remote updates for existing users.

Macroscope summarized 73c923a.

- Query open change requests across supported remotes
- Surface actionable branch rows only when local branch is behind the MR/PR base
- Pass remote repository context to GitHub, GitLab, and Azure DevOps CLIs
…ol-panel-work

# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/environmentApi.ts
#	apps/web/src/environments/runtime/service.threadSubscriptions.test.ts
#	packages/client-runtime/src/wsRpcClient.ts
- Extract shared source control panel state and API wiring
- Move VS Code project scope and subagent parent resolution into runtime helpers
- Add tests for presentation state and subagent control resolution
@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 2396601d-ee2b-406a-94ff-fe767663f12a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 19, 2026
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts Outdated
Comment thread apps/web/src/components/source-control/SourceControlPanel.tsx
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts
Comment thread apps/web/src/components/source-control/SourceControlPanel.tsx
Comment thread apps/web/src/components/source-control/SourceControlPanel.tsx Outdated
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts Outdated
@macroscopeapp

macroscopeapp Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Diff is too large for automated approval analysis. A human reviewer should evaluate this PR.

You can customize Macroscope's approvability policy. Learn more.

- Treat same-name remotes as publish/pull upstreams
- Split sync-state logic into shared web module
- Cover publish target behavior with tests and docs
- Add `forceRefresh` support to query runners and runtime execution
- Refresh cached SWR atoms before resolving so panel data stays current
- Cover first-run and cached-refresh behavior with runtime tests
- Move sync refresh feedback into a compact spinner icon
- Keep the banner for non-refresh sync messages
- Sum merged working-tree row stats across both sides

- Keep default compare ref on the repository default branch

- Restrict diverged merge sync to the checked-out branch

- Surface tracked discard failures and rename sources

- Move shared panel logic into the logic module
- Infer rename status for numstat fallback entries
- Align diverged merge sync guard and disabled state
- Clarify aggregate working-tree stats and date buckets
…ol-panel-work

# Conflicts:
#	apps/desktop/src/electron/ElectronMenu.ts
#	apps/server/src/sourceControl/AzureDevOpsCli.ts
#	apps/server/src/sourceControl/AzureDevOpsSourceControlProvider.test.ts
#	apps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts
#	apps/server/src/sourceControl/GitHubCli.ts
#	apps/server/src/sourceControl/GitHubSourceControlProvider.test.ts
#	apps/server/src/sourceControl/GitHubSourceControlProvider.ts
#	apps/server/src/sourceControl/GitLabCli.ts
#	apps/server/src/sourceControl/SourceControlProvider.ts
#	apps/server/src/vcs/VcsStatusBroadcaster.ts
#	apps/server/src/ws.ts
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/Sidebar.logic.ts
#	apps/web/src/hooks/useHandleNewThread.ts
Comment thread apps/vscode-extension/scripts/package-dependencies.mjs Outdated
Comment thread apps/vscode-extension/src/extension.ts Outdated
Comment thread apps/vscode-extension/scripts/package.mjs Outdated
Comment thread apps/web/src/session-logic.ts Outdated
Comment thread apps/server/src/vscodeWorkspaceBootstrap/http.ts Outdated
Comment thread apps/web/src/session-logic.ts Outdated
Comment thread apps/vscode-extension/src/backendManager.ts Outdated
Comment thread apps/vscode-extension/src/webview.ts Outdated
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts Outdated
Comment thread apps/web/src/components/ChatView.tsx Outdated
Comment thread apps/web/src/components/chat/ChatComposer.tsx Outdated

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect Service Conventions: one finding in DesktopBackendManager.ts. See inline comment.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/desktop/src/backend/DesktopBackendManager.ts
- Summarize panel behavior and required reliability safeguards
- Record validation ports and source control reference document
- Reuse server panel actions and shared branch and change models
- Wire the screen into mobile Git menus and navigation
- Configure local iOS signing for Apple team 6JGX8M7Z3L
- Document fork-specific mobile source-control behavior
- Sequence snapshot refreshes and ignore superseded responses
- Invalidate cached details when repository snapshots change
- Preserve add-remote input after command failures
- Refresh equal VCS snapshots and expanded diffs
- Enrich file stats and split staged discard operations
- Gate merge sync on a checkout that owns the branch
- Cover the native presentation helpers
- Keep selection updates pure and clear stale checkout state
- Refresh snapshots after failed actions and isolate enrichment failures
- Guard branch deletion and preserve rename and safe-area details
- Keep mutation failures visible across status-triggered refreshes
- Exclude conflict-only selections from discard counts and actions
- Document and test the corrected native behavior
- Compare tracked stash files against the stash base
- Fall back to the untracked stash parent when needed
- Add coverage for both stash diff paths
- Open file changes in the shared native review diff renderer
- Expand branch commits and expose mobile sync, merge, rebase, and delete actions
- Refine repository summary and document the mobile inspection flow
- Remove stale merge-maintenance snapshot details
- Update GitLab error and validation documentation
…ol-panel-work

# Conflicts:
#	apps/web/src/components/ChatView.tsx
Comment thread apps/mobile/src/Stack.tsx
- Enable the global virtual store
- Resolve patched @effect/vitest and alchemy peer dependencies
- Add incremental working-tree snapshots with full fallback
- Deduplicate automatic all-remotes fetches across worktrees
- Keep manual fetches authoritative and document freshness behavior
- Preserve workspace routing while viewing native diffs
- Keep fetch and stash state stable across navigation
- Match remote branches by their exact tracked upstream
Comment thread apps/mobile/src/features/version-control/VersionControlRouteScreen.tsx Outdated
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts Outdated
- Let mobile users choose a remote and recover interrupted loads
- Isolate selected-file commits from unrelated staged changes
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts Outdated
Comment thread apps/desktop/src/electron/ElectronMenu.ts
Comment thread apps/web/src/components/source-control/SourceControlPanel.tsx
- Preserve the real index when selected-file commits fail
- Keep destructive menus grouped and rebase refs positional
Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts Outdated
Comment thread apps/web/src/components/source-control/SourceControlPanel.tsx
- Treat post-commit index sync as best-effort cleanup
- Apply literal pathspecs to selected commit paths

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c990bc9. Configure here.

Comment thread apps/server/src/sourceControl/SourceControlPanelService.ts
- Match shared stage and unstage pathspec behavior
- Cover glob-shaped selected file names
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant