From 92b4f454ebb7e13c3b4955af1330184ad29436a4 Mon Sep 17 00:00:00 2001
From: Ashmit Biswas
Date: Sun, 31 May 2026 07:40:52 +0530
Subject: [PATCH] chore: move VSCode extension to ashmitb95/canopy-dashboard
The extension lives at https://github.com/ashmitb95/canopy-dashboard now.
Git history for the extension's 26 commits was preserved via
`git filter-repo --subdirectory-filter vscode-extension`.
- Deletes vscode-extension/ (62 files, ~22.6k lines)
- Drops the extension-build job from .github/workflows/ci.yml (the
extension has its own CI on the new repo)
- README: adds an inline pointer to the new repo next to the existing
Marketplace link
The extension and the CLI/MCP are at different release cadences and
toolchains (TS+esbuild vs Python+hatchling). The split lets each ship
on its own clock and unblocks the dashboard's perf rework (reading
.canopy/state/*.json directly instead of round-tripping through MCP).
---
.github/workflows/ci.yml | 35 -
README.md | 2 +-
vscode-extension/.gitignore | 5 -
vscode-extension/.vscodeignore | 14 -
vscode-extension/CHANGELOG.md | 128 -
vscode-extension/LICENSE | 21 -
vscode-extension/README.md | 82 -
vscode-extension/esbuild.config.mjs | 71 -
vscode-extension/jest.config.ts | 22 -
vscode-extension/media/canopy-icon.png | Bin 18892 -> 0 bytes
vscode-extension/media/canopy-icon.svg | 588 --
.../media/screenshots/dashboard-feature.png | Bin 487829 -> 0 bytes
.../media/screenshots/dashboard-global.png | Bin 429711 -> 0 bytes
vscode-extension/package-lock.json | 9054 -----------------
vscode-extension/package.json | 297 -
vscode-extension/src/__mocks__/vscode.ts | 98 -
vscode-extension/src/canopyCli.test.ts | 196 -
vscode-extension/src/canopyCli.ts | 862 --
vscode-extension/src/canopyClient.ts | 704 --
vscode-extension/src/cliResolver.test.ts | 122 -
vscode-extension/src/cliResolver.ts | 134 -
.../src/commands/createFeature.ts | 161 -
.../src/commands/createFeatureFromIssue.ts | 85 -
.../src/commands/installBackend.ts | 218 -
vscode-extension/src/commands/setupWizard.ts | 103 -
vscode-extension/src/extension.ts | 828 --
vscode-extension/src/mcpResolver.ts | 130 -
vscode-extension/src/stateReader.test.ts | 273 -
vscode-extension/src/stateReader.ts | 287 -
vscode-extension/src/statusBar.ts | 96 -
vscode-extension/src/types.ts | 192 -
.../src/views/GlobalDashboardPanel.ts | 1020 --
.../src/views/canopyTreeProvider.ts | 269 -
vscode-extension/src/views/themeShim.ts | 113 -
vscode-extension/src/watchers.ts | 79 -
vscode-extension/src/webview/cockpitPanel.ts | 395 -
.../src/webview/components/branchLedger.ts | 72 -
.../src/webview/components/bridge.ts | 72 -
.../src/webview/components/capReachedModal.ts | 112 -
.../src/webview/components/focusTile.ts | 139 -
.../src/webview/components/newFeatureForm.ts | 174 -
.../src/webview/components/styles.ts | 691 --
.../src/webview/components/triageFeed.ts | 91 -
.../src/webview/components/util.ts | 40 -
.../src/webview/components/worktreeRow.ts | 71 -
.../src/webview/dashboardPanel.ts | 904 --
.../webview/global-dashboard/Dashboard.tsx | 137 -
.../webview/global-dashboard/FeatureView.tsx | 972 --
.../webview/global-dashboard/GlobalView.tsx | 649 --
.../webview/global-dashboard/Skeletons.tsx | 38 -
.../src/webview/global-dashboard/diff.ts | 118 -
.../src/webview/global-dashboard/index.tsx | 17 -
.../src/webview/global-dashboard/protocol.ts | 129 -
.../src/webview/global-dashboard/vscode.ts | 30 -
.../src/webview/newFeaturePanel.ts | 322 -
.../src/webview/shared/pastel.css | 801 --
vscode-extension/src/webview/themes/index.ts | 42 -
.../src/webview/themes/minimal.ts | 62 -
vscode-extension/src/webview/themes/navy.ts | 60 -
vscode-extension/src/webview/themes/render.ts | 96 -
vscode-extension/src/webview/themes/types.ts | 104 -
vscode-extension/tsconfig.json | 20 -
62 files changed, 1 insertion(+), 22646 deletions(-)
delete mode 100644 vscode-extension/.gitignore
delete mode 100644 vscode-extension/.vscodeignore
delete mode 100644 vscode-extension/CHANGELOG.md
delete mode 100644 vscode-extension/LICENSE
delete mode 100644 vscode-extension/README.md
delete mode 100644 vscode-extension/esbuild.config.mjs
delete mode 100644 vscode-extension/jest.config.ts
delete mode 100644 vscode-extension/media/canopy-icon.png
delete mode 100644 vscode-extension/media/canopy-icon.svg
delete mode 100644 vscode-extension/media/screenshots/dashboard-feature.png
delete mode 100644 vscode-extension/media/screenshots/dashboard-global.png
delete mode 100644 vscode-extension/package-lock.json
delete mode 100644 vscode-extension/package.json
delete mode 100644 vscode-extension/src/__mocks__/vscode.ts
delete mode 100644 vscode-extension/src/canopyCli.test.ts
delete mode 100644 vscode-extension/src/canopyCli.ts
delete mode 100644 vscode-extension/src/canopyClient.ts
delete mode 100644 vscode-extension/src/cliResolver.test.ts
delete mode 100644 vscode-extension/src/cliResolver.ts
delete mode 100644 vscode-extension/src/commands/createFeature.ts
delete mode 100644 vscode-extension/src/commands/createFeatureFromIssue.ts
delete mode 100644 vscode-extension/src/commands/installBackend.ts
delete mode 100644 vscode-extension/src/commands/setupWizard.ts
delete mode 100644 vscode-extension/src/extension.ts
delete mode 100644 vscode-extension/src/mcpResolver.ts
delete mode 100644 vscode-extension/src/stateReader.test.ts
delete mode 100644 vscode-extension/src/stateReader.ts
delete mode 100644 vscode-extension/src/statusBar.ts
delete mode 100644 vscode-extension/src/types.ts
delete mode 100644 vscode-extension/src/views/GlobalDashboardPanel.ts
delete mode 100644 vscode-extension/src/views/canopyTreeProvider.ts
delete mode 100644 vscode-extension/src/views/themeShim.ts
delete mode 100644 vscode-extension/src/watchers.ts
delete mode 100644 vscode-extension/src/webview/cockpitPanel.ts
delete mode 100644 vscode-extension/src/webview/components/branchLedger.ts
delete mode 100644 vscode-extension/src/webview/components/bridge.ts
delete mode 100644 vscode-extension/src/webview/components/capReachedModal.ts
delete mode 100644 vscode-extension/src/webview/components/focusTile.ts
delete mode 100644 vscode-extension/src/webview/components/newFeatureForm.ts
delete mode 100644 vscode-extension/src/webview/components/styles.ts
delete mode 100644 vscode-extension/src/webview/components/triageFeed.ts
delete mode 100644 vscode-extension/src/webview/components/util.ts
delete mode 100644 vscode-extension/src/webview/components/worktreeRow.ts
delete mode 100644 vscode-extension/src/webview/dashboardPanel.ts
delete mode 100644 vscode-extension/src/webview/global-dashboard/Dashboard.tsx
delete mode 100644 vscode-extension/src/webview/global-dashboard/FeatureView.tsx
delete mode 100644 vscode-extension/src/webview/global-dashboard/GlobalView.tsx
delete mode 100644 vscode-extension/src/webview/global-dashboard/Skeletons.tsx
delete mode 100644 vscode-extension/src/webview/global-dashboard/diff.ts
delete mode 100644 vscode-extension/src/webview/global-dashboard/index.tsx
delete mode 100644 vscode-extension/src/webview/global-dashboard/protocol.ts
delete mode 100644 vscode-extension/src/webview/global-dashboard/vscode.ts
delete mode 100644 vscode-extension/src/webview/newFeaturePanel.ts
delete mode 100644 vscode-extension/src/webview/shared/pastel.css
delete mode 100644 vscode-extension/src/webview/themes/index.ts
delete mode 100644 vscode-extension/src/webview/themes/minimal.ts
delete mode 100644 vscode-extension/src/webview/themes/navy.ts
delete mode 100644 vscode-extension/src/webview/themes/render.ts
delete mode 100644 vscode-extension/src/webview/themes/types.ts
delete mode 100644 vscode-extension/tsconfig.json
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5699827..a1bc7fa 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -39,38 +39,3 @@ jobs:
- name: Run pytest
run: pytest tests/ -v --maxfail=5
-
- extension-build:
- name: VSCode extension build
- runs-on: ubuntu-latest
- defaults:
- run:
- working-directory: vscode-extension
- steps:
- - uses: actions/checkout@v4
-
- - uses: actions/setup-node@v4
- with:
- node-version: "20"
- cache: npm
- cache-dependency-path: vscode-extension/package-lock.json
-
- - name: Install dependencies
- run: npm ci
-
- - name: Type-check
- run: npx tsc --noEmit
-
- - name: Bundle with esbuild
- run: npm run build
-
- - name: Package VSIX (sanity check)
- run: npx vsce package --allow-missing-repository
-
- - name: Upload VSIX artifact
- uses: actions/upload-artifact@v4
- with:
- name: canopy-vsix
- path: vscode-extension/*.vsix
- if-no-files-found: error
- retention-days: 14
diff --git a/README.md b/README.md
index 0fe289e..e7b4dbd 100644
--- a/README.md
+++ b/README.md
@@ -226,7 +226,7 @@ canopy doctor # diagnose drift / staleness
-The CLI and MCP server are thin wrappers over the same actions — `canopy state X` and `mcp__canopy__feature_state(feature='X')` return identical bytes. There's also a [VSCode extension](https://marketplace.visualstudio.com/items?itemName=SingularityInc.canopy) reading the same state the agent reads.
+The CLI and MCP server are thin wrappers over the same actions — `canopy state X` and `mcp__canopy__feature_state(feature='X')` return identical bytes. There's also a [VSCode extension](https://marketplace.visualstudio.com/items?itemName=SingularityInc.canopy) (source at [`ashmitb95/canopy-dashboard`](https://github.com/ashmitb95/canopy-dashboard)) reading the same state the agent reads.
Full CLI reference: [docs/commands.md](docs/commands.md).
diff --git a/vscode-extension/.gitignore b/vscode-extension/.gitignore
deleted file mode 100644
index 261183f..0000000
--- a/vscode-extension/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-node_modules/
-dist/
-out/
-*.vsix
-.vscode-test/
diff --git a/vscode-extension/.vscodeignore b/vscode-extension/.vscodeignore
deleted file mode 100644
index 9c84562..0000000
--- a/vscode-extension/.vscodeignore
+++ /dev/null
@@ -1,14 +0,0 @@
-.vscode/**
-.vscode-test/**
-src/**
-out/**
-node_modules/**
-canopy-*.vsix
-jest.config.ts
-.gitignore
-.yarnrc
-esbuild.config.mjs
-tsconfig.json
-**/*.map
-**/*.ts
-**/*.test.*
diff --git a/vscode-extension/CHANGELOG.md b/vscode-extension/CHANGELOG.md
deleted file mode 100644
index edf0058..0000000
--- a/vscode-extension/CHANGELOG.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Change Log
-
-## 0.7.1
-
-- README points at the new dashboard screenshots via absolute
- raw.githubusercontent.com URLs so the marketplace listing renders
- them. Stale pre-rebuild screenshots removed.
-
-## 0.7.0
-
-Pastel dashboard rebuild + the action surface for the new backend commands (`ship` / `draft-replies` / `conflicts` / `worktree-bootstrap` / `pr-checks`).
-
-### Dashboard
-
-- **One panel, two modes.** New `Canopy: Open Dashboard` (and activity-bar tree title bar) opens a React webview that mode-shifts between **global** (canonical / warm / cold lanes + triage rail) and **feature** (issue body + per-repo cards + threads + diff stack + 4-section action drawer). Click any feature in global to drill in; "Back to Global" returns. Auto-opens on first activation per VS Code user.
-- **Theme system.** `canopy.dashboard.theme` offers `minimal` (default — near-monochrome dark), `pastel` (soft blue-grey cream), `navy` (legacy). Live-updates on change — no reload. Tokens reused from `webview/themes/.ts`; `themeShim.ts` maps them onto the shared pastel CSS contract so swapping a theme is a `:root` override, not a CSS rewrite.
-- **Progressive cache + per-section streaming.** Module-level `FEATURE_CACHE` + `GLOBAL_CACHE` survive panel disposal. Each fetch (`feature_state`, `feature_status`, `feature_diff`, `review_comments`, `bot_status`, `issueGet`) writes its slot and posts its own `patch` message — the slowest sibling no longer blocks the focus card. Re-opens are instant. File-watchers trigger silent revalidation in place; write actions wipe and refetch with skeleton flash.
-- **Inline shape-of-data skeletons.** Topbar / breadcrumb / section heads / sidebar render real data immediately. Shimmers appear inline only where async data is in flight, sized + shaped to the slot they'll fill (issue body paragraphs inside `.issue-body`, branch-name shimmer in repo cards, thread-card skeletons grouped by repo, diff-block skeletons with monospace body lines).
-
-### Action surfaces
-
-- **Ship feature** — `canopy ship` capstone in the Commit & push rail. Push + open/update one PR per repo with cross-repo body links.
-- **Draft replies for addressed threads** — `canopy draft-replies` quick-pick per template, clipboard-on-select.
-- **Cross-feature conflicts** — `canopy conflicts` from the Checks rail with toast summary.
-- **Bootstrap worktrees** — `canopy worktree-bootstrap` for env-files + install + `.code-workspace`.
-- **Mark addressed** on bot threads — `canopy commit --address --amend` keeps the bot-resolution log in sync.
-- **CI chips on repo cards** — passing / pending / failing from `feature_state.repos[*].pr.ci_status`.
-- **CTA buttons in focus card** — `next_actions` from `feature_state` map to webview messages (preflight / commit / push / stash / open-feature / refresh).
-
-### Transport + sidebar
-
-- **CLI transport.** `canopyCli.ts` is the dashboard's data plane: direct subprocess to `canopy` with TTL cache, login-shell PATH resolution, and a `cliResolver` that finds the binary across pipx / brew / venv. Typed wrappers added for `ship`, `draftReplies`, `conflicts`, `worktreeBootstrap`, `prChecks`, `switchFeature`, `setConfig`.
-- **Sidebar trimmed to three sections.** ACTIVE (canonical, expandable per-repo), LAUNCHERS (Open Dashboard, New Feature from issue, Open canopy.toml), ISSUES (provider inbox). The legacy FEATURES section moves into the dashboard.
-- **Per-repo target branch.** Feature view's repo cards render `feature/ → ` from canopy.toml's per-repo `target_branch` augment.
-- **Preflight chip.** Repo cards in feature view show passed / stale / failed against `.canopy/state/preflight.json`.
-- **Address-in-agent plumbing.** Review threads copy context to clipboard + open Claude Code (terminal fallback if extension missing).
-
-### Build
-
-- `.vscodeignore` drops `node_modules/` (esbuild bundles everything). Vsix size 4.5 MB → 460 KB.
-- esbuild copies `pastel.css` to `dist/webview/` so it ships in the packaged extension.
-- React 19 + react-dom added; tsconfig gets `jsx: "react-jsx"` + `lib: [..., "DOM"]`.
-
-## 0.4.0
-
-- **Single sidebar tree.** The five separate views (Features, Worktrees, Changes, Review Readiness, Linear Issues) are collapsed into one unified `Canopy` tree with three sections: ACTIVE (canonical feature, expandable to per-repo rows with `↑N · M dirty`), FEATURES (other lanes with repo count + Linear ID), and LINEAR INBOX (todo issues, collapsed by default).
-- Right-click menus and title-bar buttons (Cockpit, New Feature, Refresh, Reinit) all rebind to the new view.
-- Bundle dropped ~7 KB from removing the per-domain providers.
-
-## 0.3.3
-
-- **Progressive dashboard rendering with per-feature cache.** Dashboards used to leave the panel blank for several seconds while five backend calls completed serially, and switching features re-fetched everything every time. Now sections render section-by-section as data arrives, and per-feature caches (race-protected) make repeat opens instant.
-
-## 0.3.2
-
-- **Self-contained vsix.** Bundles `@modelcontextprotocol/sdk` so a fresh install no longer throws `Cannot find module '@modelcontextprotocol/sdk/client/index.js'` at activation. Phase G's stub providers + diagnostic commands live inside `bootstrap()`, so the require-time failure was bricking the extension on first run.
-
-## 0.3.1
-
-- **Workspace-scope cockpit panel** (`Canopy: Open Cockpit`). New theme-pluggable webview that summarizes all features, the canonical-slot model state, and triage feed. Coexists with the per-feature dashboard.
-- **New-feature panel** (`Canopy: Spin up a new feature from Linear`). Linear issue picker → repo selector → slot chooser (canonical vs. worktree). Replaces the bare quick-pick.
-- **State-file watchers.** `.canopy/state/{active_feature,heads,preflight}.json` changes drive auto-refresh, so a `canopy switch` from the CLI surfaces in the dashboard immediately.
-- **Theme system** (`canopy.dashboard.theme`): `navy` (default — deep navy with signal accents) and `minimal` (near-monochrome).
-- **Self-healing activation.** Diagnostic commands (`Show Log`, `Retry Connect`, `Install Backend`) are now registered before the MCP probe, so a missing `canopy-mcp` no longer leaves the user with "no data provider registered" + zero canopy commands in the palette.
-- **Switch fix.** Right-click "Switch to Feature" was calling the deleted `feature_switch` MCP tool; now uses the canonical-slot `switch` action with proper blocker handling.
-- BlockerError plumbing through real CTAs; cap-reached modal for worktree-budget overflow; worktree row + branch ledger + triage feed in cockpit.
-
-## 0.2.5
-
-- **Linear Issues sidebar view.** Lists open Todo / In Progress issues from your Linear workspace; right-click → "Start Feature from Linear Issue" wires the Linear ID into the new feature.
-- `canopy.createFeatureFromIssue` command and `linear-mcp-server` integration.
-- Dashboard upgrades: richer per-repo state, GitHub PR context, status pills.
-- MCP client gains multi-source merge for `feature_list` (explicit + worktree-discovered + workspace_status active features).
-
-## 0.1.9
-
-- Trimmed `installBackend` command — relies on the resolver in 0.1.3 instead of duplicating discovery logic.
-
-## 0.1.7
-
-- README split — top-level README is now a brief intro; long-form docs moved to `docs/architecture.md`, `docs/commands.md`, `docs/mcp.md`, `docs/workspace.md`.
-- New `setupWizard` command flow for first-time `canopy init`.
-
-## 0.1.6
-
-- **Fixed dashboard crash (`i.map is not a function`)** — list-returning MCP tools (`feature_list`, `log`, `linear_my_issues`, etc.) now come through as arrays again. FastMCP wraps non-dict returns in `{ "result": }` to satisfy the spec's object-only `structuredContent`; the client now unwraps that convention before handing the value to callers.
-- Features view and Worktrees view light up together after a reinit.
-
-## 0.1.5
-
-- **Fixed post-reinit crash** — the MCP client now reads `structuredContent` first (MCP 2025-06 spec) before falling back to text blocks. This prevents `{}` responses that caused *"Cannot read properties of undefined (reading 'length')"* after `Force Reinit Workspace`.
-- Hardened every tree provider, the reinit toast, and the status bar against any missing or malformed fields from the MCP — each failure now logs a stack trace to the Canopy output channel instead of silently emptying the view.
-- `refresh()` no longer throws synchronously when the status bar can't compute ahead/behind; errors are caught per-slice with traces.
-
-## 0.1.4
-
-- **Force Reinit Workspace** — `…` menu on the Features view (or the command palette) re-runs Canopy's repo/worktree discovery and overwrites `canopy.toml`. Useful after adding/removing repos or worktrees outside Canopy.
-- **Preview Reinit (dry run)** — opens the would-be new `canopy.toml` in an editor tab without writing. Runs through the same modal confirmation as the real reinit.
-- Backed by a new `workspace_reinit` MCP tool (Canopy now exposes 30 tools).
-
-## 0.1.3
-
-- **Features view now merges three data sources** — `features.json` (explicit features), `.canopy/worktrees/*` on disk (implicit worktrees), and `workspace_status.active_features` (multi-repo branches). Worktrees created outside `canopy feature create` (e.g. by an older Canopy or plain `git worktree add`) now appear in Features instead of being invisible.
-- Resolver now scans `~/projects/*`, `~/src/*`, `~/code/*`, `~/Developer/*`, `~/dev/*`, `~/workspace/*` for any sibling checkout with a `.venv/bin/canopy-mcp`. Finds existing Canopy installs automatically — no more false *"can't start canopy-mcp"* when Canopy is already installed in a neighbouring project's venv.
-- Last-ditch resolver fallback: asks system `python3` whether it can import `canopy`, and derives the `canopy-mcp` entry point from `sys.executable`.
-- Also scans the extension's managed venv (`~/.canopy-vscode/venv/bin/canopy-mcp`) so post-install reconnects work without needing the configured setting.
-
-## 0.1.2
-
-- **Install Backend command**: one-click installer creates a managed venv at `~/.canopy-vscode/venv`, installs `canopy` from PyPI / a local checkout / a git URL, and points the extension at the new `canopy-mcp`. Triggered from the sidebar's *Install Canopy for me* button or from the error toast.
-- Retry Connect re-reads the setting so a fresh install takes effect immediately.
-- New `canopy.pythonPath` setting to pin the python3 used by the installer.
-
-## 0.1.1
-
-- Auto-resolve `canopy-mcp` via the user's login shell and common venv locations, so GUI-launched VSCode windows work without pre-setting PATH.
-- Rewrote the sidebar welcome so it stops falsely saying "No Canopy workspace detected" when the real problem is a missing backend binary.
-- Collapsed per-provider error toasts into a single up-front activation error with **Open Settings / Show Log** actions.
-- New commands: `Canopy: Retry Connect`, `Canopy: Show Log`.
-
-## 0.1.0 — Initial release
-
-- Activity-bar entry with four sidebar sections: Features, Worktrees, Changes, Review Readiness
-- Per-feature dashboard webview with branch state, Linear/GitHub status, recent commits, and overlap warnings
-- "Create Feature" quick pick with Linear-issue autocomplete
-- Status-bar items for active feature, repo count, and aggregate ahead/behind
-- File watching on `.canopy/features.json` and worktree HEADs for live refresh
-- All data flows through the existing `canopy-mcp` server over stdio
diff --git a/vscode-extension/LICENSE b/vscode-extension/LICENSE
deleted file mode 100644
index a2f670b..0000000
--- a/vscode-extension/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2026 Ashmit Biswas
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/vscode-extension/README.md b/vscode-extension/README.md
deleted file mode 100644
index e284269..0000000
--- a/vscode-extension/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# Canopy — Multi-Repo Worktree Manager
-
-**A switch-first dashboard for multi-repo workspaces. One canonical feature in focus, the rest hibernating in worktrees, every PR / preflight / draft reply one click away.**
-
-Canopy coordinates real Git branches and worktrees across multiple repositories — no proprietary abstractions, no virtual branches. This extension is a VSCode-native surface on top of the [Canopy CLI](https://github.com/ashmitb95/canopy); the same JSON contract the CLI ships. What the dashboard shows is exactly what `canopy state` / `canopy triage` / `canopy feature status` would show in a terminal.
-
-
-
----
-
-## What it does
-
-### One panel, two modes — global and per-feature
-
-Global mode is the focus board. Three vertical lanes mirror Canopy's canonical-slot model: the **canonical** feature (what's currently in your main checkout), **warm** features (linked worktrees, instantly switchable), and **cold** features (branch-only, switching creates a worktree on demand). A right-hand triage rail surfaces the priority list across every PR — changes-requested, bot reviews, review-required, approved.
-
-
-
-Click any feature to drill in. The feature view stacks: linked Linear/GitHub issue body → per-repo cards with branch + target + dirty + PR + actionable threads + CI chips → temporally classified review threads grouped by repo (each with **Address in agent** / **Reply** / **Mark addressed** for bot threads) → unified-diff stack with click-to-open in VSCode's native diff viewer. The right rail is the action drawer: Priority list of actionable threads, Checks (preflight + cross-feature conflicts + worktree bootstrap), Commit & push (per-repo Stage / Commit / Push / Open PR + the **Ship feature** capstone + draft-replies generator), State (stash / pop / back to global), Open (IDE / issue / PRs).
-
-### `switch` is the wedge
-
-Clicking a warm feature's **Switch into main** evacuates the current canonical to a warm worktree (instant to switch back) and promotes the clicked feature into the main checkout. Cold features auto-create a worktree; if you're at cap, the LRU warm worktree gets evicted (the button label tells you which one). The "Raise cap" affordance is permanent in the Worktrees section header — no modals, no interruptions.
-
-### Progressive cache, every section streams
-
-Each fetch (`feature_state`, `feature_status`, `feature_diff`, `review_comments`, `bot_status`, issue body) writes to a module-level cache and posts its own UI patch as soon as it returns. Re-clicking a feature you've seen before is essentially instant — the cache survives panel disposal. File-watchers on `.canopy/state/*.json` and `.canopy/features.json` revalidate silently, sections updating in place without skeleton flash. Skeletons appear only inline where async data is genuinely missing, not as full-page silhouettes.
-
-### Sidebar trimmed to launchers + active + issues
-
-Three sections: **ACTIVE** (canonical feature, expandable per-repo), **LAUNCHERS** (Open Dashboard, New Feature from Issue, Open canopy.toml), **ISSUES** (Linear / GitHub Issues inbox). The dashboard owns the rest.
-
----
-
-## Install
-
-1. Install the extension from the VSCode Marketplace (or `code --install-extension canopy-x.y.z.vsix` for a local build).
-2. Open a folder containing a `canopy.toml`. The first time you click the activity-bar canopy icon the dashboard auto-opens; this is per-user, not per-workspace.
-3. If the sidebar offers **Install Canopy for me**, click it — the extension sets up a managed venv at `~/.canopy-vscode/venv` and installs the Canopy backend. Otherwise `pipx install canopy` from a terminal works.
-
-The extension shells out to two binaries: `canopy` (the CLI) for the dashboard, and `canopy-mcp` (the MCP server) for the legacy panels + status bar. Both are auto-discovered via login-shell PATH; absolute paths in settings override.
-
----
-
-## Settings
-
-| Setting | Default | What it does |
-| --- | --- | --- |
-| `canopy.cliPath` | `canopy` | Path to the `canopy` CLI used by the dashboard. Set absolute if auto-detection fails. |
-| `canopy.canopyMcpPath` | `canopy-mcp` | Path to the `canopy-mcp` executable used by the sidebar + status bar. |
-| `canopy.dashboard.theme` | `minimal` | `minimal` (near-monochrome dark, default), `pastel` (soft blue-grey cream surfaces), `navy` (legacy). Live-updates on change. |
-| `canopy.refreshIntervalSeconds` | `30` | How often to poll Canopy for updated sidebar state. `0` disables periodic refresh. |
-| `canopy.pythonPath` | *(empty)* | Optional Python 3.10+ binary used by *Install Backend*. Leave empty to auto-detect. |
-
----
-
-## Commands (palette via `Cmd-Shift-P`)
-
-| Command | What it does |
-| --- | --- |
-| `Canopy: Open Dashboard` | Opens the new pastel dashboard. The activity-bar tree's title bar has the same shortcut. |
-| `Canopy: Switch to Feature` | Quick-pick feature → promote to canonical slot. |
-| `Canopy: Run Preflight` | Stages all repos in the canonical feature + runs hooks (no commit). |
-| `Canopy: Sync All Repos` | `git pull --rebase` per repo. |
-| `Canopy: Spin up a new feature from Linear` | Picks an open Linear / GH issue → creates branches + worktrees. |
-| `Canopy: Mark Feature Done` | Archives a feature: removes worktrees, deletes branches. |
-| `Canopy: Open Feature Worktrees in New Window` | One VSCode window per repo worktree for the chosen feature. |
-| `Canopy: Run Doctor` | 17-category diagnostic + `--fix` for auto-repairable. |
-| `Canopy: Force Reinit Workspace` | Rescan repos + regenerate canopy.toml. |
-| `Canopy: Connect Linear` | Drops a Linear MCP entry into `.canopy/mcps.json`. |
-
-The action drawer in feature view exposes: **Run preflight**, **Cross-feature conflicts**, **Bootstrap worktrees** (env files + `install_cmd` + `.code-workspace`), per-repo **Stage / Commit / Push / Open PR**, **Ship feature** (commits + push + opens/updates one PR per repo with cross-repo body links), **Draft replies for addressed threads**, **Stash / Pop**, **Back to global**.
-
----
-
-## Links
-
-- **[Canopy on GitHub](https://github.com/ashmitb95/canopy)** — CLI, MCP server, full architecture docs
-- **[Changelog](CHANGELOG.md)**
-- **[Report a bug](https://github.com/ashmitb95/canopy/issues)**
-
-MIT licensed.
diff --git a/vscode-extension/esbuild.config.mjs b/vscode-extension/esbuild.config.mjs
deleted file mode 100644
index 357daa9..0000000
--- a/vscode-extension/esbuild.config.mjs
+++ /dev/null
@@ -1,71 +0,0 @@
-import * as esbuild from "esbuild";
-import { copyFileSync, mkdirSync } from "node:fs";
-
-const watch = process.argv.includes("--watch");
-
-/**
- * Copy assets that the bundle needs at runtime but esbuild doesn't
- * inline. Today it's just `pastel.css` — the dashboard controller
- * reads it off disk and inlines it into the panel's HTML so editing
- * the CSS doesn't require a webview rebuild. The file MUST live under
- * `dist/` because `.vscodeignore` excludes the whole `src/` tree from
- * the packaged .vsix.
- */
-function copyAssets() {
- mkdirSync("dist/webview", { recursive: true });
- copyFileSync("src/webview/shared/pastel.css", "dist/webview/pastel.css");
-}
-
-/**
- * Two builds, in one config:
- * 1. extension.js — node, runs in the VS Code host. Imports `vscode`.
- * 2. webview/global-dashboard.js — browser, runs inside the dashboard
- * panel's webview. Bundles React + the pastel CSS.
- *
- * Webview bundles target `es2020` because the webview's `
-