Diffchestrator — VS Code Extension
Why Diffchestrator?Claude Code works best when you can see what it changed, across every repo it touched. Diffchestrator gives you that visibility: a sidebar tree of all your repos, real-time change tracking, one-click diffs, and direct terminal integration with Diffchestrator vs Multi-Root WorkspacesVS Code's multi-root workspaces let you group repos into a
They're complementary — you can use Diffchestrator inside a multi-root workspace. A workspace says "here are my repos." Diffchestrator says "here's what changed, where, and lets you act on it." Team Orchestration with Claude CodeDiffchestrator shines when multiple Claude Code agents work across repos simultaneously — whether you're running parallel agents on an epic, reviewing a multi-service change, or just keeping tabs on what Claude touched while you were away. Parallel Agent WorkflowsWhen you spawn multiple Claude Code sessions (one per repo or per story), Diffchestrator gives you a single pane of glass:
Multi-Repo Claude SessionsFor changes that span multiple repos (e.g., API contract changes across backend + frontend):
Dashboard as Mission ControlThe dashboard (
Typical Orchestration Workflow
Works with External AgentsDiffchestrator doesn't require Claude to run inside VS Code. The file watcher monitors FeaturesClaude Code Integration
Active Repos & Workspace Switching
Repository Discovery & Organization
Sidebar Views (3 sections)
Diff Viewing & Review Workflow
Git Operations
Branch & Stash Management
Search & Navigation
File Watcher
Performance
Dashboard (
|
| Chord | Action |
|---|---|
Alt+D, Tab |
Cycle through recent active repos |
Alt+D, Shift+Tab |
Close all active repos |
Alt+D, Q |
Close current active repo |
Alt+D, Shift+Q |
Pick which active repo to close |
Alt+D, N |
Next changed file |
Alt+D, Shift+N |
Previous changed file |
Alt+D, M |
Commit with message (conventional prefix picker) |
Alt+D, C |
AI Commit (Claude) |
Alt+D, L |
Open Claude Code (continues session) |
Alt+D, Alt+L |
Open Claude Code (new session) |
Alt+D, Y |
Yolo (Claude Sandbox) |
Alt+D, Alt+Y |
Yolonew (Claude Sandbox) |
Alt+D, S |
Scan for repositories |
Alt+D, Shift+S |
Switch scan root |
Alt+D, Shift+T |
Open terminal at scan root |
Alt+D, T |
Open terminal at repo |
Alt+D, J |
Cycle terminal (rotate through alive terminals) |
Alt+D, Alt+K |
Close terminal (active or pick) |
Alt+D, ↓ |
Next terminal (across all repos) |
Alt+D, ↑ |
Previous terminal (across all repos) |
Alt+D, R |
Switch active repo |
Alt+D, Alt+R |
Switch repo (all roots) |
Alt+D, F |
Browse files in repo |
Alt+D, P |
Push |
Alt+D, Shift+P |
Force push (--force-with-lease) |
Alt+D, Shift+M |
Amend last commit |
Alt+D, U |
Pull |
Alt+D, D |
Toggle changed-only filter |
Alt+D, H |
Commit history |
Alt+D, B |
Switch branch |
Alt+D, A |
Stash management |
Alt+D, G |
Toggle inline blame |
Alt+D, E |
Favorite current repo |
Alt+D, / |
Search in repo (git grep) |
Alt+D, . |
Search active repos |
Alt+D, Shift+/ |
Search all repos |
Alt+D, W |
Open repo in new VS Code window |
Alt+D, K |
Show keyboard shortcut cheatsheet |
Alt+D, X |
Clean up merged branches |
Alt+D, I |
Filter repos by tag |
Alt+D, Z |
Undo last commit (soft reset) |
Alt+D, Shift+B |
Save workspace snapshot |
Alt+D, Shift+L |
Load workspace snapshot |
Alt+D, Backspace |
Swap to previous repo (across roots) |
Alt+D, O |
Reveal repo in system file explorer |
Alt+D, V |
Open Dashboard |
On macOS, use
Option+Das the chord prefix.
Context Menu Actions
Right-click a repository in the tree:
- View Diff / Commit / Push / Pull / Fetch / AI Commit / Undo Commit
- Commit History / Switch Branch / Stash Management
- Browse Files / Open Repo in New Window
- Open Terminal / Open Claude Code / Yolo / Yolonew
- Copy Repo Info / Open Remote in Browser / Set Tags / Reveal in File Explorer
- Toggle Favorite / Select (for multi-repo operations)
Right-click a directory in the tree:
- Open Terminal / Open Claude Code / Yolo / Yolonew (launches with cwd set to the directory)
- Reveal in File Explorer
- Toggle Favorite
Right-click a changed file:
- Stage / Unstage (also available as inline icon buttons)
- Discard Changes (with confirmation)
Editor title bar (top-right of diff editor):
- Prev/Next Changed File (↑↓ buttons to browse without staging)
- Stage This File / Unstage This File (with auto-advance to next file)
Changed Files view title:
- Stage All / Unstage All / Discard All
Configuration
| Setting | Default | Description |
|---|---|---|
diffchestrator.scanRoots |
[] |
Root directories to scan for repos |
diffchestrator.scanMaxDepth |
6 |
Maximum directory depth for scanning |
diffchestrator.scanExtraSkipDirs |
[] |
Additional directory names to skip |
diffchestrator.scanOnStartup |
true |
Auto-scan configured roots on VS Code start |
diffchestrator.changedOnlyDefault |
false |
Show only changed repos by default |
diffchestrator.autoRefreshInterval |
10 |
Auto-refresh interval in seconds (0 to disable) |
diffchestrator.claudePermissionMode |
acceptEdits |
Permission mode for Claude CLI |
diffchestrator.showInlineBlame |
true |
Show inline git blame on current line |
diffchestrator.showFavorites |
true |
Show favorites in Active Repos view |
diffchestrator.fetchOnScan |
false |
Auto-fetch during scan for accurate ahead/behind counts |
diffchestrator.autoPushAfterCommit |
false |
Auto-push after successful commit via Alt+D, M |
diffchestrator.favorites |
[] |
Persisted favorite paths (managed by extension) |
diffchestrator.repoTags |
{} |
Repo tags for filtering (managed by extension) |
diffchestrator.snapshots |
{} |
Workspace snapshots (managed by extension) |
diffchestrator.pinnedRepos |
[] |
Pinned repo paths in Dashboard Sync Overview (managed by extension) |
diffchestrator.autoTerminals |
[] |
Terminal types to auto-open on repo switch (shell, claude, claudenew, yolo, yolonew). Closing a repo also closes its terminals |
Getting Started
Installation
Install from the VS Code Marketplace, Open VSX, or build locally with make package && make install.
First-Time Setup
Add scan roots — tell Diffchestrator where your repos live. Open VS Code settings (
Ctrl+,) and add one or more root directories:{ "diffchestrator.scanRoots": ["/home/user/projects"] }You can add multiple roots (e.g., work projects + personal projects). Switch between them with
Alt+D, Shift+S.Tip: If you skip this step, Diffchestrator auto-detects repos in your open workspace folders.
Scan — press
Alt+D, Sor open the Diffchestrator sidebar (click the icon in the Activity Bar). Repos populate automatically on startup ifscanOnStartupis enabled (default:true).Select a repo — click any repo in the Repositories view. The Changed Files panel shows its staged/unstaged/untracked files. Click a file to open the native diff editor.
Optional: Enable fetch on scan — for accurate ahead/behind counts, enable auto-fetch:
{ "diffchestrator.fetchOnScan": true }This runs
git fetchfor each repo during scan. Disable if you have many repos or slow network.Optional: Configure Claude Code — if you use Claude Code, the default permission mode for AI commits is
acceptEdits. Change it in settings:{ "diffchestrator.claudePermissionMode": "acceptEdits" }Options:
default,acceptEdits,full.Optional: Install claude-sandbox — the Yolo and Yolonew commands (
Alt+D, Y/Alt+D, Alt+Y) require claude-sandbox, which provides Docker-based sandboxed Claude Code sessions. Supported on Linux/WSL and macOS. Install it and source the aliases in your shell to enable these features.
Quick Tour
| Action | Shortcut |
|---|---|
| Scan repos | Alt+D, S |
| Switch repo | Alt+D, R |
| View changed files + diff | Click a repo |
| AI commit with Claude | Alt+D, C |
| Open Claude Code | Alt+D, L |
| Commit with message | Alt+D, M |
| Push | Alt+D, P |
| Open Dashboard | Alt+D, V |
| Show all shortcuts | Alt+D, K |
Release
make release # Auto-detect bump from conventional commits
make release-patch # Force patch bump
make release-minor # Force minor bump
make release-major # Force major bump
make install # Install latest .vsix locally
make publish # Publish to both VS Code Marketplace and Open VSX
make publish-marketplace # Publish to VS Code Marketplace only
make publish-openvsx # Publish to Open VSX only
make clean # Remove build artifacts
The release script reads commit messages since the last v* tag, picks the semver bump (feat: = minor, fix: = patch, BREAKING CHANGE = major), updates CHANGELOG.md, commits the version bump, tags, builds, and packages two .vsix files:
diffchestrator-X.Y.Z.vsix— VS Code Marketplace (publisher:andrevops-com)diffchestrator-X.Y.Z-openvsx.vsix— Open VSX Registry (publisher:andrevops)
Pushing a v* tag to GitHub triggers CI to create a GitHub Release with both files and auto-publish to Open VSX.
Verify Release Integrity
Every GitHub Release includes checksums.txt (SHA-256) and checksums.txt.sig (ED25519 signature), plus GitHub build provenance attestation.
# Verify build provenance
gh attestation verify diffchestrator-*.vsix --repo Andrevops/diffchestrator
# Verify checksum signature
curl -fsSL https://raw.githubusercontent.com/Andrevops/diffchestrator/main/public_key.pem -o public_key.pem
xxd -r -p checksums.txt.sig | openssl pkeyutl -verify -pubin -inkey public_key.pem -rawin -in checksums.txt -sigfile /dev/stdin
Development
# Install dependencies
npm install
cd webview-ui && npm install && cd ..
# Build
make build # Extension + webview
make compile # Extension only (fast)
make watch # Watch mode
# Debug
# Press F5 in VS Code to launch Extension Host
Architecture
src/
├── extension.ts # Activation entrypoint
├── constants.ts # Command/view/config IDs
├── types.ts # Shared TypeScript interfaces
├── git/
│ ├── gitExecutor.ts # Git CLI wrapper (child_process.execFile)
│ │ # status, diff, stage, unstage, commit, push, pull, fetch,
│ │ # log, branches, checkout, stash, blame, show, clean, grep
│ └── scanner.ts # BFS directory scanner
├── providers/
│ ├── activeReposProvider.ts # Favorites + recent repos with terminal indicators
│ ├── repoTreeProvider.ts # Repo tree with health badges + tag indicators + tooltips
│ ├── changedFilesProvider.ts # Changed files with diff stats
│ └── gitContentProvider.ts # TextDocumentContentProvider for diff/show URIs
├── commands/
│ ├── scan.ts # Scan/rescan
│ ├── stage.ts # Stage/unstage file + all + auto-advance
│ ├── commit.ts # Commit with prefix picker (single + bulk) + auto-push
│ ├── push.ts # Push (single + bulk)
│ ├── pull.ts # Pull with progress
│ ├── aiCommit.ts # Claude CLI AI commit with .git watcher
│ ├── openClaude.ts # Open Claude Code terminal (per-repo tracking)
│ ├── terminal.ts # Terminal management + CLI validation
│ ├── favorites.ts # Toggle favorites + favorite current repo
│ ├── fileSearch.ts # Browse files + switch repo + open in new window
│ ├── commitHistory.ts # Commit history viewer
│ ├── discard.ts # Discard file/all changes (tracked + untracked)
│ ├── switchBranch.ts # Branch switcher + create
│ └── stash.ts # Stash push/list/pop/apply
├── services/
│ ├── repoManager.ts # Central state + MRU + cycle + tag filter + snapshots
│ ├── fileWatcher.ts # .git directory watcher with suppression
│ ├── statusBar.ts # Status bar items with debounce
│ ├── inlineBlame.ts # Current-line git blame decorations
│ └── workspaceAutoScan.ts # Auto-scan workspace folders (async)
├── views/
│ ├── diffWebviewPanel.ts # Multi-repo diff webview
│ └── dashboardWebviewPanel.ts # Dashboard webview (sync, branches, heatmap, session)
└── utils/
├── time.ts # Shared timeAgo / timeAgoShort utilities
├── paths.ts # Path manipulation (basename, dirname)
├── shell.ts # Terminal argument escaping
├── fileItem.ts # File item resolution
└── disposable.ts # DisposableStore helper
webview-ui/ # React apps (diff + dashboard)
├── src/
│ ├── App.tsx # Diff viewer with react-diff-view
│ ├── vscode.ts # VS Code API wrapper
│ └── dashboard/ # Dashboard webview
│ ├── DashboardApp.tsx # Main dashboard with tabs
│ ├── SyncOverview.tsx # Sync table with actions
│ ├── BranchMap.tsx # Branch grouping
│ ├── ChangeHeatmap.tsx # Activity heatmap
│ ├── SessionSummary.tsx # Session commits
│ ├── StashOverview.tsx # Stash management
│ ├── ActivityLog.tsx # Activity tab with filters
│ ├── SettingsPanel.tsx # Settings tab
│ └── ShortcutRef.tsx # Shortcuts tab
├── vite.config.ts # Builds diff webview → dist/webview/
└── vite.dashboard.config.ts # Builds dashboard → dist/webview-dashboard/
scripts/
└── release.mjs # Auto-detect semver bump + changelog + commit + tag + dual build (Marketplace + Open VSX)
Tech Stack
- Extension: TypeScript, VS Code Extension API, esbuild
- Git:
child_process.execFile(no shell=true) - Webview: React 19, Vite, react-diff-view
- AI: Claude Code CLI integration
- CI/CD: GitHub Actions with ED25519 release signing and build provenance attestation
- No backend server — everything runs in-process via the VS Code extension host
Andrevops Ecosystem
Diffchestrator is the hub of the Andrevops tool suite. It exposes a public API that sibling extensions consume, and integrates directly with the CLI tools.
┌──────────────────┐
│ Diffchestrator │
│ (public API) │
└──┬──────┬─────┬──┘
consumes │ │ │ yolo / yolonew
┌────────────┘ │ └──────────┐
▼ ▼ ▼
┌────────────┐ ┌─────────────┐ ┌────────────────┐
│ Makestro │ │ Epic-Lens │ │ claude-sandbox │
│ (Makefile │ │ (Jira/MR │ │ (sandboxed │
│ runner) │ │ tracking) │ │ Claude Code) │
└────────────┘ └─────────────┘ └───────┬────────┘
sessions
▼
┌──────────────┐
│ claude-stats │
│ (analytics) │
└──────────────┘
| Tool | Integration | How |
|---|---|---|
| Makestro | Consumes DiffchestratorApi |
Auto-discovers Makefiles from the selected repo — no config needed |
| Epic-Lens | Consumes DiffchestratorApi |
Filters Jira epics and MRs by the currently selected repo |
| claude-sandbox | yolo / yolonew commands |
Launches sandboxed Claude Code sessions per-repo via Alt+D, Y (Linux/WSL and macOS) |
| claude-stats | Complementary | Analyzes session data generated by Claude Code / claude-sandbox workflows |
Public API
Diffchestrator exports an API that any VS Code extension can consume:
interface DiffchestratorApi {
getCurrentRoot(): string | undefined;
getSelectedRepo(): string | undefined;
onDidChangeSelection: vscode.Event<void>;
}
Collaboration
@giankpetrov
Hardened the codebase with security-focused tests and performance improvements. Added path traversal prevention tests for GitExecutor, git ref validation tests that caught a stash@{N} bug, and improved DisposableStore error resilience. Also optimized switchRepo sorting from O(N^2) to O(1) lookups — ~590x faster on large repo sets.