All notable changes to Claude Code Studio are documented here. Format loosely follows Keep a Changelog.
- Claude Opus 5.5 and Claude Fable 5.1 in the model picker. Both new models are selectable from the model dropdown and the
/modelcommand, and Opus 5.5, Opus 5, and Fable 5.1 are now available as fallback models. Cost tracking in the Usage window knows their rates, including the lower cache-read prices on the newer models (Opus 5.5 reads at $0.20 per 1M, Fable 5.1 at $0.25), and a model id likeclaude-opus-5-5is no longer mis-priced as Opus 5.
- A session resumed from History lost its context after the first reply (#19). Loading a session from History and sending a query continued that conversation, but the resume only applied to that one turn: the next query was sent with no session to continue, so the CLI started a fresh, empty session. The first reply had context, the second did not, and the second query was written to a brand new session instead of the resumed one. The resumed (or branched) session id is now carried forward across turns, so every query after the first stays in the same conversation.
- A model that needs usage credits showed a doubled, dead-end error. When a model that isn't on your plan requires paid usage credits (for example Fable), the CLI reported the error both as a message and as a result, so the same text rendered twice in the bubble. The duplicate is removed, and the error now raises a dedicated card explaining the model needs credits, with a Choose another model button and a link to manage credits, instead of a raw bubble. The same de-duplication now covers any error the CLI surfaces both ways, not just this one.
- Plan approval modal now displays Markdown, opens wider, and is resizable (#17). When approving a plan in plan mode, the dialog now renders the plan with full Markdown formatting (headings, lists, code blocks, task lists) instead of plain text, and the content area grows to fit taller plans. The plan modal opens wider by default and can be dragged to any width to read more; long tool inputs (like a subagent prompt) are draggable too, while short permission prompts stay compact. The plan font follows the chat's Ctrl+Scroll size, so the whole plan zooms in or out proportionally.
- Clicking a file link in a plan navigated the whole panel to a "file not found" page with no way back. The plan modal renders Markdown, and a link in it used to load in the panel itself, replacing the chat with a dead error page. File links in a plan now open in the Visual Studio editor (like the ones in chat), external links open in the browser, and a navigation guard keeps the panel from ever leaving the app.
- A full session left the chat stuck failing with "Prompt is too long". Once a conversation grows past the model's context window, every path that carries it forward (the next turn, auto-resume, or an explicit resume) fails on the way in, because the history alone is over the limit. The chat showed a plain error bubble and, with Auto-resume on, kept dragging the dead session back so every new message failed again. That error now raises a "This session is full" card with a Start new session button, and auto-resume is suppressed for the next send so a fresh message is no longer pulled back into the full session.
- Subscription plan limits in the Usage window (#15). Above the token and cost tiles, a "Plan limits" panel shows your Current session and This week windows (percent used and reset time) as progress bars, with a refresh button. It reads the same data as Claude Code's
/usage, so it matches what you would see on the web without leaving Visual Studio. The last snapshot is cached and shown instantly when the window opens, while a background run (the CLI takes a few seconds) refreshes it.
- Question picker mode (⚙ → Chat) (#10). Controls how the AskUserQuestion picker submits. Instant (the default, and the previous behavior) sends a single-choice question as soon as you click an option, and picking an option and typing in "Other" are mutually exclusive. Always Submit never sends on click: the Submit button is always shown, clicking a selected option again clears it, and you can keep an option selected while adding your own text in "Other", in any order, which is sent as
Choice 1 (your text).
- The chat panel could open but stay completely unresponsive on some machines (#12). The panel loads from a
file://URL, and on some systems (seen on a non-UTF-8 Windows locale) the browser decoded the panel's scripts with the system code page instead of UTF-8, which corrupted their non-ASCII characters so the scripts failed to parse. With the scripts dead, no click handlers were wired up and every button was inert. The scripts are now tagged as UTF-8 so they decode correctly regardless of the system locale, and, as a safety net, storage access is guarded so a blockedlocalStoragecan no longer halt the panel. - Permission dialog buttons lost their colors under the Light theme. The 1.1.2 light-theme sweep added a neutral grey style for modal buttons, which also matched the permission actions (they share the modal button class) and outweighed their own red, blue and green. Deny, Allow for session and Allow keep their colors in the Light theme again; the neutral modal buttons (Close, Cancel) still get the light styling.
- The Doctor output was unreadable under the Light theme. Its panel kept a fixed dark background with no light override, so the dark text sat on a dark box. It now uses a light panel in the Light theme.
1.1.2 - 2026-08-28
- The MCP and Usage tool windows follow the theme instead of a fixed dark palette. These two native windows are not styled by the chat's CSS, so they ignored the theme and always rendered dark. They now follow the same Appearance choice as the chat (⚙ → Appearance): Auto tracks the Visual Studio theme, Dark and Light force one, and a custom accent applies. The choice is persisted, so a window opened before the chat still matches, and it lives in a small reusable theming layer so future native windows can follow it too. The enable/disable toggle's off state and the scrollbars in these windows are themed along with everything else.
- The chat window failed to open when ReSharper was installed (#4). Visual Studio loads every extension into one process, and ReSharper ships its own, older, strong-named copy of the WebView2 WPF assembly. Because the panel declared its browser in XAML, which binds that assembly by simple name, the loader could build the control from ReSharper's copy and then fail to assign it to our own, differently versioned type:
Set connectionId threw an exceptionwrapping anInvalidCastExceptionbetween twoMicrosoft.Web.WebView2.Wpf.WebView2types. The browser is now created in code against the exact version the extension ships, so the two copies no longer collide. (This was not a missing WebView2 Runtime, which the error's top-level message can suggest.) - The chat's light theme left several surfaces dark or low-contrast (#9). The light palette had been applied piecemeal, so under the Light theme parts of the UI stayed dark-on-dark. Native form controls (checkbox, radio, the select drop-down, the color input, and scrollbars) now follow the theme through
color-scheme, and the remaining gaps are filled: settings rows, the question/status/context card family, the usage and diff modals, modal titles and footer buttons, the About footer, the history title, toggles, the top bar hover, and the per-message rewind and branch buttons.
1.1.1 - 2026-08-16
- A permission prompt left open for more than about ten minutes could let the tool run unapproved. The permission gate in ask and plan mode is the CLI's
PreToolUsehook, and a hook that hits its own timeout does not block the tool: the call proceeds, which under the mode'sbypassPermissionsmeans it executes. Since 1.1.0 made "wait for the answer" the default while the CLI's hook timeout stayed at its 600-second default, a prompt sitting past that window would fire the tool and orphan the modal (thepipe is brokenline the Output window showed). The hook is now given an explicit timeout that outlives the modal's own ceiling, so the extension always denies first. The Unanswered permission setting's wait option is now labelled Wait for answer (max 1 hour) to make that ceiling explicit.
- Editor selection actions (#6). Right-clicking a selection in the code editor now opens a Claude Code Studio submenu with Explain, Add Summary, Add Comments, Add Unit Tests, Refactor, and Security Check, alongside the existing Send Selection. The six actions send the selection as one turn with a fixed instruction; Send Selection still just places the code in the composer for you to send yourself. All of them are disabled when nothing is selected, and if a turn is already running the prompt is kept in the composer instead of dropped.
- Check background tasks in the ⌘ menu (#5). A background shell that Claude starts reports nothing back once the turn ends, because the CLI has no completion event to wake it. This on-demand item sends a follow-up that asks Claude to poll its background tasks and summarise their status.
- Copy button on code blocks. Every code block in a response now has a Copy button beside Apply, and code blocks in your own messages get Copy as well. Apply stays on assistant blocks only, where writing back to a file makes sense.
- "Prompt is too long" no longer renders twice in the same bubble. When a turn overflowed the context window, the CLI delivered the overflow both as a synthetic assistant message and as an error result carrying the same text, and both were appended, so the bubble read
Prompt is too longPrompt is too long. The error result is now de-duplicated against the synthetic text, so the message appears once. - A CLI build missing an optional flag no longer blocks the whole extension (#7). The launch passes some experimental flags (such as
--forward-subagent-text) that not every Claude CLI build has; a build without one exited at startup withunknown option, which surfaced assession not started or already exitedand left the chat unusable. The launch now detects a rejected optional flag, drops it, and retries, so the session starts without that one feature instead of failing outright. Load-bearing flags are never dropped: if one of those is ever rejected, the CLI's own message is shown instead. - A second, newer Claude CLI on your PATH is now flagged (#7). The extension prefers the CLI in
~\.local\bin, so when a newer build sits on the PATH the older copy was used silently and could behave differently from the one on your command line. A one-time line in the Output window now names both versions and their paths and suggests removing the older install or setting the CLI path in Settings. It only appears when the PATH copy is strictly newer than the one in use. - A solution reload mid-turn could wedge the chat with "agent pipe not reachable". When Claude edited a project file and Visual Studio reloaded the solution, the extension reset the session and stopped the agent; if the agent was busy answering a turn it was force-killed, and because that only killed the agent and not the
claudeprocess it had spawned, the orphaned CLI kept running and firing permission hooks at a pipe whose server (the dead agent) was gone. The agent is now stopped by killing its whole process tree, so the CLI never outlives it. - Home and End navigated the tab group instead of moving the caret (#2) whenever the panel was docked alongside other windows. WPF's
TabControl, which Visual Studio's docking wells are built on, claims both keys inside its ownOnKeyDown; floating the panel was the only workaround, since a floating window has noTabControlabove it. Both keys now reach the panel normally while it has focus, without touching tab navigation anywhere else in the IDE. Ctrl+Home / Ctrl+End still switch tabs.
1.1.0 - 2026-08-08
- Tool calls that skipped the permission prompt are now gated. In ask and plan mode the CLI runs under
bypassPermissionsso the extension's own hook is the only checkpoint, and that hook matched a hard-coded list of tool names. Anything absent from the list ran with no prompt at all — includingPowerShell, which is the default shell tool on Windows in Claude Code 2.1.226, so shell commands could execute unprompted. The check is now inverted: every tool is gated except a known read-only set (Read,Glob,Grep,NotebookRead,ToolSearch,TodoWrite,BashOutput,WebSearch), so a tool introduced by a future CLI defaults to asking.
- Re-authenticate in the ⌘ menu, and an inline card when a session expires mid-turn. An expired session used to surface as a plain error with no way forward, because the pre-flight check can only see whether an account exists in
~/.claude.json, not whether its credentials still work. - Unanswered permission setting (⚙ → Claude Code): how long a permission prompt may sit before it is denied for you. Defaults to waiting for the answer, matching the CLI's own prompt — cancelling the turn still releases it.
- Permission rules dialog now ships clickable examples (exact command, glob, prefix, whole tool, MCP), collapsible once you know the format.
- Auto-decisions are written to the Output window (
permission auto: <tool> — allowed by rule: …), so a rule that silently approves is no longer indistinguishable from a tool that never needed permission.
-
Permission rules in
.claude/settings.jsonhad no effect (#1). Only rules typed into the extension's own settings panel were consulted, because the CLI's native evaluation is switched off in ask and plan mode. Rules are now also read from.claude/settings.json,.claude/settings.local.jsonand the user-levelsettings.json. A rule naming just an MCP server (mcp__github) now covers every tool that server exposes, instead of requiring each tool's full name.One deliberate limit:
allowrules are not taken from the project's.claude/settings.json, since that file travels with the repository and granting permissions is not something a cloned project should be able to do to you.denyandaskare honoured from it — they can only ever be more restrictive. Putallowrules in.claude/settings.local.json, the user-levelsettings.json, or ⚙ → Permission rules; if any are found in the project file, the Output window says so and points at where to move them. -
Sign-in ran
claude login, which Claude Code 2.1.226 no longer accepts as a command — it was parsed as a prompt, and the terminal opened a session asking what you meant. Now usesclaude auth login, falling back to the old spelling on older CLIs. -
The sign-in overlay never closed when you re-authenticated while already signed in: it only reacted to an account appearing in
~/.claude.json, which does not change in that case. Closing the terminal now dismisses it too. -
A permission prompt left unanswered was denied silently while its modal stayed on screen; answering it afterwards failed with
no pending permission request. Prompts resolved without you — by timeout, cancel or shutdown — now retract their card and say why. -
Malformed permission rules were accepted, listed as if active, and then discarded by the agent's parser.
PowerShell *matched nothing. They are now rejected when you add them, with a message pointing at the right form.
1.0.2 - 2026-07-27
- Opus 5 (
claude-opus-5) in the model picker and pricing table, alongside Opus 4.8.
- The turn timer no longer keeps ticking while a permission-prompt modal is open — it now pauses the same way it already did for
AskUserQuestioncards, and resumes (or stays paused, if another request is already queued) once the prompt is answered.
1.0.1 - 2026-07-24
- Marketplace listing metadata (categories, tags, license, preview image) and an extension icon, packed into the VSIX.
- Marketplace overview and README: corrected the chat-access instructions to Extensions → Claude Code Studio → Chat.
- VSIX packaging:
$(Version)is now stamped into the final packed manifest instead of a placeholder.
1.0.0 - 2026-05-15
Initial release. See the README for the full feature set, including:
- Streaming chat panel (WebView2) with live turn indicators, auto-compact feedback, and subagent trace.
- Inline permission prompts, permission modes (ask/plan/bypass/don't-ask), and permission rules.
- Native diff viewer, rewind, and branch.
- Per-workspace session history with rename, view, and fork.
- Composer
@file picker, slash commands & skills, editor-selection send, image/file paste, prompt history. - Usage dashboard with cost tracking and per-session filtering.
- Command palette (⌘): Doctor, MCP status & reconnect, context usage, build-errors-to-agent.
- Workspace/trust management, integrated sign-in, working-directory cascade.
- Searchable settings panel, model picker, fallback model, configurable CLI path, status line, theme awareness.