Claude Mission Control
Mission control for Claude Code, right inside your editor.
Claude edits fast. You end up with changes you never read, in files you never opened.
Mission Control puts a sidebar next to it. Review, accept and undo every change, without git.
Watch your 5-hour and weekly limits. Put subagents on a cheaper model. Read the plans Claude
wrote, and keep an eye on background agents.
Local by default: no servers, no telemetry, one optional API call. Details ↓
⚠️ Unofficial. This is a community extension and is not affiliated with, endorsed by, or
sponsored by Anthropic. "Claude" and "Claude Code" are trademarks of Anthropic.
Why
|
|
| Read every change |
Diff, accept or undo each source, config and project file Claude touched. Yours and your scripts' edits too. Any folder, git repo or not. |
| Undo without git |
Restores the last version you accepted. New files are deleted, deleted files come back. |
| See the wall coming |
Live 5-hour and weekly usage, so you can throttle before you get cut off. |
| Cut token burn |
One click puts every subagent on Sonnet or Haiku while you stay on Opus. Agent-heavy work is where the tokens actually go. |
| See what it's worth |
What this project's work would have cost at API list price — computed locally, so you can see what a flat plan is actually covering. |
| Never miss a prompt |
An optional native ping when Claude finishes, or when it's stuck waiting on a question or a plan. |
Features
🗂 Changes
Mission Control's own change tracking — no git involved. Like Copilot's edit review: the first open
snapshots your workspace as the baseline; from then on every change to a recognized developer
file (by you, Claude, or a script) shows up with +/- stats. Click a row for a diff vs the
last accepted version, Accept to approve it (the baseline moves forward), Undo to restore
the last accepted version (new files are deleted, deleted files come back). Accept all and
Undo all sit in the header. Works in any folder — git repo or not.
Signal only, by design. Tracking is allowlist-based: ~140 source, markup, config and project
file extensions plus ~65 exact names (Makefile, Podfile, Dockerfile, .gitignore, …).
Everything else is deliberately invisible, so build output and IDE junk never pollute the list —
node_modules, dist, build, Pods, DerivedData, vendor, any dot-folder, *.xcresult /
*.xcarchive bundles, media and binaries, and .DS_Store-style OS files. Brand-new files over
1 MB aren't picked up either. Working in a format Mission Control doesn't know? Add it with
missionControl.tracking.alsoTrack — an extension (.xyz) or an exact name (Procfile) — and it applies
live, no reload. (Known binary/media types stay out regardless.)
Moved a folder and everything looks NEW? Mission Control matches moved files by content automatically, and
if a baseline really has gone stale it offers a one-click Re-baseline — also available any time
from the Command Palette. Re-baselining never touches your files, only Mission Control's record of what
you've accepted.
Mission Control tracks the first folder of your workspace.
How this differs from Claude Code's own review. Claude Code offers Accept / Reject per edit
before it lands, and Rewind per turn — and its own dialog says "Rewinding does not affect files
edited manually or via bash." Mission Control's Changes tab is cumulative: every on-disk change by
anyone, per file, since the state you last accepted, with or without git.
📋 Plans
Browse the plans Claude produced in plan mode — expand inline as rendered markdown, or hit ↗
to open a plan in a styled, read-only plan view tab (like Claude Code's own plan review). Scope
it to this project or to every saved plan with missionControl.plans.scope.
Plans are read from Claude Code's global folder and, when a project sets plansDirectory, from the
project's own folder too. A plan a subagent wrote is listed with a subagent tag; the workshop and
rejected-ultraplan drafts Claude Code leaves beside a plan are not plans and are not listed. Claude
Code deletes old plans in its periodic cleanup, and the tab says so when the folder is gone rather
than looking empty for no reason. Claude Code itself opens only the live plan; this is the archive.
📊 Plan usage
At the top of the panel, on every tab: live 5-hour and weekly limits — including any per-model weekly limit your plan has, such as Weekly Fable — with percentage, reset countdown and last-checked time, read
using Claude Code's own local credential — shown next to what the work would have cost, and flagged
when a reading's reset time has already passed. Optional and fully disableable — this is the only
part of Mission Control that touches the network.
⚙️ Subagents
The control that saves money. Four buttons under Subagents — Inherit · Opus · Sonnet · Haiku —
set the model your subagents, agent teams and workflow agents run on while you stay on your main model.
Agent-heavy work is where tokens actually go, so this is the single biggest saving available, and
it's one click instead of hand-editing settings.
- Writes
env.CLAUDE_CODE_SUBAGENT_MODEL in ~/.claude/settings.json. Takes effect on the next
subagent spawned; no restart.
- Since Claude Code 2.1.251 that key is a default, not an override: an agent whose definition
names a model, or a spawn that asks for one, keeps its own. The override
(
CLAUDE_CODE_SUBAGENT_MODEL_FORCE) is no longer offered — it takes the choice away from every
agent and workflow, which is rarely wanted. If it is already on, set by hand or by an older version,
the panel shows it with a plain way to turn it off.
- Inherit switches both keys off rather than deleting them —
inherit and 0 — because Claude
Code re-applies a changed settings file to chats that are already open, but never unsets a key that
disappeared from it. Deleting would look right in the file and leave every open chat on the old
model until it was restarted.
- Effort is shown, not set: Claude Code has no separate effort setting for subagents — they run at the
main chat's effort unless an agent definition sets its own. The Tasks tab shows the model and
effort each agent actually ran on, which is also how you check the button is being honoured.
- Every write is guarded: if
settings.json isn't valid JSON right now, Mission Control changes nothing and
tells you, instead of clobbering your hooks, permissions and env.
Nothing here is about the main agent. Claude Code's own composer shows the main model and effort,
and that is where you change them (/model, /effort).
💸 What it would have cost
Mission Control prices this project's work at Anthropic's published API rates — today and over
the last 7 days, and per agent in the Tasks tab. On a subscription no money moved, so it is
shown as a comparison and never as a bill: the useful reading is what a flat plan is covering.
Every figure is computed on your machine from the token counts Claude Code already writes to its
own logs — nothing is sent anywhere to produce it. Each response is priced by the rates that apply to
that response (fast mode's premium, a model's own cache-read rate), sub-agent and workflow
transcripts are counted as well as the main session, and a response split across several log records
is charged once rather than three times. Where a model has no published rate — a local model behind
a custom backend, or a model released after this version — its tokens are counted but its dollars are
not, and the card says so: the last request shows a dash rather than an older priced one, and every
figure missing it says it is incomplete.
Those figures survive a tidy-up. Claude Code's logs get cleaned — by its own retention sweep, by a
cleanup script, or by hand — and until 1.10.0 the spend they recorded went with them, which on this
machine was 37% of a week. Mission Control keeps its own small record of what each piece of work
cost, outside those logs. It holds amounts and token counts only, never any part of a conversation,
and runs to a few megabytes a year; missionControl.storage.recordSpend turns it off. It cannot
recover what was lost before it existed, and it marks a figure as "at least this much" rather than
exact whenever there is a stretch no panel was open for.
It can read a little higher than Claude Code's own /cost, on purpose: a response that was retried on
another model is charged for every call it made, where /cost counts only the last one. Web searches
are charged per search, as the price list does. The rates were last checked against the live price
list and against Claude Code 2.1.280 on 23 September 2026, when Opus 5.5 was added
(docs/AUDIT-pricing-2026-09-14.md has the full audit).
🧹 Storage
What Claude Code is keeping on this Mac, and what can go. Sizes in plain words, a sentence saying
what each thing is, and beside it the list of everything that is never touched — your chats, anything
a running chat owns, your memory and skills and settings, and the record of what your work cost.
Cleaning moves things to a trash rather than deleting them; anything cleaned can be put back for seven
days, or you can empty it yourself. A chat is never removed by age — only one you archived in the session
list, and if that list can't be read, none are considered at all. An archived chat leaves with its
own notes, and the panel says what that costs first: you can't reopen it, and a plan saved from it
drops off that project's list. What it cost stays. Whether a chat is running is read
from the running process, never from how quiet its files look, so a long tool call or a background
loop is never mistaken for finished. missionControl.storage.enabled hides the tab.
🤖 Background tasks
A live view of background work with accurate statuses (running / completed / stopped), read from
Claude Code's own task lifecycle records. Active and Cleared are separate panes, so clearing
something files it away rather than destroying it — anything cleared can be put back. Workflow runs
group their agents under one expandable card with a progress bar over them: tokens, cost, tool
calls, and an inline transcript per agent. A running agent shows the tool it is in right now and
how long it has been going, and opening a transcript pins the agent's answer at the top instead
of leaving it behind several clicks of "Load more".
🔔 Ping me when Claude needs you
Step away while Claude works. When its turn ends — or when it's blocked on a question or a plan
awaiting approval — Mission Control fires a native OS notification with sound that reaches you even
over a fullscreen app. It only fires when that window isn't focused, and each window checks its own
focus, so a finish in a background window pings you while you keep working in another. Every chat
in the folder is followed separately, so a busy session can't swallow another one's ping, and two
windows open on the same project won't both announce the same turn.
On macOS (Apple Silicon) and Windows, clicking the notification focuses the exact VS Code
window that workspace is open in — macOS uses a bundled signed + notarized helper so the click still
works on current macOS. Intel Macs fall back to a non-clickable banner; Linux uses notify-send
(not clickable), with an in-app notification if notify-send is missing.
Off by default — flip the bell switch in the controls row at the top of the panel, or set
missionControl.notifyOnComplete.
It stays quiet for the chat you're sitting in: if the window is focused and you've touched the
keyboard or mouse in the last few minutes, an answer you're already reading doesn't ping. Step away
and it does, however long the run — that's the whole reason to be told. To be pinged for every
completion regardless, turn off missionControl.silenceWhenWatching.
Commands
All from the Command Palette (⇧⌘P / Ctrl+Shift+P), prefixed Claude Mission Control:
| Command |
What it does |
Accept Current State of Workspace |
Makes everything currently on disk the accepted state — the fix after a big move or reorg makes every file look NEW. Your files are never modified, only Mission Control's record. |
Undo All Tracked Changes |
Restores every tracked file to its last accepted version and deletes files that are new since then. Asks for confirmation first. |
Refresh |
Force a re-read of changes, plans, tasks and usage. |
Your own model and effort are Claude Code's business: change them in its composer, or with /model
and /effort.
Privacy — what Mission Control touches
Everything happens on your machine. Mission Control runs no servers, collects no telemetry or
analytics, and makes exactly one network request — described at the end.
What it reads
- Your local Claude Code data in
~/.claude — sessions, plans, settings.json, task records.
- Background-task output from Claude Code's own temp dir:
/tmp/claude-<uid> (macOS/Linux) or
\tmp\claude-0 on the current drive (Windows — Claude Code has no Windows branch here, so it
builds the same POSIX-shaped path).
- For the Changes tab, files in the folder you have open — but only the recognized developer
files described above.
.env files, keystores, certificates, binaries, media, build output,
node_modules and dot-directories are never read.
- On macOS, the Plan usage card reads Claude Code's OAuth token from your login keychain
(item
Claude Code-credentials) — that's where Claude Code keeps it instead of
~/.claude/.credentials.json. Turn the usage card off and this read never happens.
What it writes
- To make Undo possible without git, Mission Control keeps its own copy of the last accepted version of
every tracked file under
~/.claude/.mission-control/tracking/<workspace>/. These copies never leave
your disk — delete that folder any time to wipe them, and baselines for folders that no longer
exist are pruned automatically after 30 days. Note the copy is of the file as-is: if a tracked
source or config file contains a credential, so does the copy. Real .env files are never copied
(.env.example / .sample / .template are).
- Your workspace files are written only when you click Undo (or run Undo All Tracked
Changes) — that's what Undo is. Accept and Re-baseline move Mission Control's own baseline and never
touch your files.
~/.claude/settings.json — only the two subagent env keys (CLAUDE_CODE_SUBAGENT_MODEL and
CLAUDE_CODE_SUBAGENT_MODEL_FORCE), merged into the file, and only when you click. Every other key
is left exactly as it was. If that file isn't valid JSON, Mission Control refuses to write at all.
- With
missionControl.notifyOnComplete on, macOS: the bundled notification helper is copied to
~/.claude/.mission-control/bin/ (and de-quarantined) so clickable notifications work. Notifications are
also the only reason Mission Control runs OS commands: alerter / osascript / open on macOS,
powershell.exe on Windows, notify-send on Linux.
- Small bookkeeping files in
~/.claude/.mission-control/, none of them sensitive:
usage-cache.json (your last usage reading, so the card isn't blank on open),
dismissed-tasks.json (which task cards you cleared), notify-claims/*.claim (which window
announced which turn, so two windows on one project don't both ping), and inside tracking/ a
.last-prune marker plus one .owner file per workspace. Older builds also left a
usage-history.json there; nothing reads it any more and it is safe to delete.
The one network call: the Plan usage card sends Claude Code's own local OAuth token to
Anthropic's usage endpoint (api.anthropic.com) to read your 5-hour and weekly limits. Nothing else
is sent anywhere. Set "missionControl.usage.enabled": false and Mission Control is fully offline.
Don't take my word for any of it. The source is on
GitHub, so you can read exactly what it does
before you trust it with your ~/.claude. It isn't open source, and the licence says so, but nothing
about it is hidden. Questions still get answered: supportcutex@gmail.com.
Requirements
- VS Code 1.89+
- Claude Code installed and used at least once (so
~/.claude
exists).
- A local workspace — Mission Control needs real filesystem access, so remote virtual workspaces aren't
supported.
Settings
| Setting |
Default |
Description |
missionControl.usage.enabled |
true |
Show the live Plan Usage card (the only network call). Its reading also tells the cost card where the plan's week begins; without one, the card shows plain 7-day figures. |
missionControl.usage.refreshSeconds |
60 |
Min seconds between usage requests (≥30). |
missionControl.backgroundTasks.enabled |
true |
Show the Background Tasks tab. |
missionControl.notifyOnComplete |
false |
Native OS notification (with sound) when Claude finishes or needs you. See 🔔 above. |
missionControl.storage.enabled |
true |
Show the Storage tab. |
missionControl.storage.recordSpend |
true |
Keep a small record of what each piece of work cost, outside Claude Code's logs, so cleaning them never lowers a figure. Amounts and token counts only. |
missionControl.silenceWhenWatching |
true |
Stay quiet when the chat that just finished is the one you're sitting in. If the window has gone untouched for a few minutes it still pings — you stepped away. |
missionControl.plans.scope |
project |
project (plans made in this workspace) or all. |
missionControl.tracking.alsoTrack |
[] |
Extra file types for the Changes tab beyond the built-in developer-file list — an extension (.xyz) or an exact name (Procfile). Applies live, no reload. |
missionControl.support.url |
"" |
Optional https:// URL for the Buy me a coffee button. Blank uses the built-in link; a value that isn't https:// hides the button. |
Support
Mission Control is free and unofficial. If it saves you time, there's a Buy me a coffee cup in the
panel's controls row, visible on every tab, which opens my
GitHub Sponsors page. Entirely optional, and there's no
tracking either way.
Questions or a bug? Email supportcutex@gmail.com (also linked inside the panel's controls row), or
open an issue on GitHub.
Built by Suraj Kumavat. @levelupwithsk on Instagram.
License
Proprietary © Suraj Kumavat. Free to install and use. The source is published so you can read it, but
publishing it doesn't make it open source: you may view, clone, fork and modify it for yourself, not
redistribute or sell it. Full terms in LICENSE, which also ships with the extension as
LICENSE.txt. Bundled third-party components keep their own licences, listed in
THIRD-PARTY-LICENSES.md.