Patchwire — VS Code Extension
Chat with an AI coding agent that runs on a machine you control — your Mac Mini, a homelab, any box — and review every change as a diff before it touches your code.
Your workspace stays on your laptop. Only the code you sync crosses the wire — your .env and anything git ignores never leave your machine — and the agent's edits come back as diffs you apply locally. So a Flutter dev keeps the phone on USB and runs/hot-reloads locally as usual, while the heavy AI runs on the shared box.
Prerequisites
patchwire CLI on this laptop — install per the root README. The extension shells out to it for every operation.
- Mac Mini reachable over Tailscale with
patchwire running as the agent. The setup wizard provisions this for you on first run.
- VS Code 1.80+ and Node 20+.
The extension does not bundle the CLI. Run patchwire --version in a terminal to confirm it is on your $PATH before launching VS Code.
Install the extension
You have two paths. Pick (A) if you are using the extension, (B) if you are developing it.
A. Install a packaged .vsix (end users)
# from repo root
pnpm install
pnpm --filter patchwire-vscode build
pnpm --filter patchwire-vscode package
This produces patchwire-vscode-0.3.0.vsix. Install it in VS Code:
- GUI: Extensions sidebar →
… menu (top right) → Install from VSIX… → pick the file.
- CLI:
code --install-extension patchwire-vscode-0.3.0.vsix
Reload VS Code when prompted. A Patchwire icon (speech bubble) appears in the activity bar.
B. Run from source (developers)
pnpm install
pnpm --filter patchwire-vscode build
Open the extension/ folder in VS Code and press F5. A new "Extension Development Host" window launches with the extension loaded. Edit code in the original window; reload the dev host with Ctrl/Cmd+R to pick up changes. For watch-mode builds use pnpm --filter patchwire-vscode dev.
First-time setup (≤ 3 minutes)
- Open any folder in VS Code — empty repo or existing.
- Open the command palette (
Ctrl/Cmd+Shift+P) and run Patchwire: Setup….
- The wizard walks four steps:
- Pick a peer. Lists your Tailscale peers; choose the Mac Mini, or type an
IP/hostname if Tailscale isn't running.
- Authenticate once. Enter your SSH username and system password. A per-project SSH key is installed via vendored
sshpass + ssh-copy-id; the password is held in memory and zeroed afterward.
- Bootstrap the project. Provide a Git URL. The extension
git clones locally; the agent git clones into ~/workspace/<project> on the remote and writes patchwire.yml.
- Doctor. Health checks the agent, then offers to reload the window so the extension picks up the new config.
You are done. The status bar should now show Patchwire: in sync.
Daily use
Start a chat
- Click the Patchwire activity-bar icon, or run Patchwire: New Chat from the palette.
- Type a prompt. Claude streams its reply into the chat panel.
- File changes appear as diff cards at the end of the turn.
Review and apply diffs
Each diff card has three actions:
- Open diff — VS Code's native diff editor opens with the proposed change on the right.
- Apply — runs
git apply --3way for that file (or the whole turn).
- Reject — discards the proposed change for that file.
You stay in control: nothing is written to your working tree until you click Apply. Per-file selective apply is supported.
Multi-turn chat
- The remote process is
claude --resume <session-id> per chat, so each chat keeps full conversational context across turns.
+ New chat to start fresh; chat list to switch; Delete chat to remove it locally and tear down the remote session.
Sync state
- Sync-on-ask is the default: before sending a turn, the extension rsyncs your tree to the remote.
- Live sync toggle (status bar) — turn it ON during focused pairing. A file watcher + debounced rsync keeps the remote up-to-date as you type. Turn it OFF when you're hacking locally and don't want every save shipped.
- Out-of-sync indicators — file decorations in the Explorer mark dirty paths; the status bar shows
in sync / syncing… / out of sync.
- Ask-time guard — if live sync is OFF and your tree is dirty when you hit Send, a modal warns before proceeding.
Commands
| Palette title |
Command id |
| Patchwire: Setup… |
patchwire.openSetup |
| Patchwire: New Chat |
patchwire.newChat |
| Patchwire: Toggle Live Sync |
patchwire.toggleLiveSync |
| Patchwire: Show Output |
patchwire.viewOutput |
Troubleshooting
| Symptom |
Try |
| Extension never activates |
Check the Patchwire output channel (Patchwire: Show Output). Most failures log the underlying CLI error there. |
patchwire: command not found |
The extension can't find the CLI. Reinstall it on your $PATH, then reload VS Code. |
| Setup wizard hangs on Step 2 |
Tailscale or SSH connectivity issue. Confirm ssh <user>@<peer> works in a terminal. |
| Chat replies arrive in fragments / interleaved |
A previous version had a streaming throttle bug; pull latest and rebuild (pnpm -r build). |
| Reload mid-turn shows "session was in flight" |
Expected — v1 surfaces a system message and resets. Stream reattach is a v1.1 item. |
| Apply fails with conflict |
The remote tree drifted from the local tree. Re-sync (status bar) and try again, or open the diff and resolve manually. |
For agent-side problems, also run patchwire doctor in a terminal.
Known v1 limitations
- Reload reconciliation does not reattach to an in-flight stream — it surfaces a system message and resets.
- Tool-use frames from Claude are summarized as plain text, not rendered specially.
- One in-flight turn per chat. Concurrent turns are deferred.
- Single-root workspaces only; one
patchwire.yml per project.
- Multi-dev isolation relies on per-user SSH accounts on the remote.