Repository navigation
One new tool and three changes to how the extension feels during a turn. User-facing reference: docs/QOL.md and docs/SEMANTIC.md.
Features
vs_solution_model- Claude reads the evaluated project graph instead of guessing from.csprojtext. A project file in a modern repo is missing most of what matters: theLangVersion,NullableandTreatWarningsAsErrorsaDirectory.Build.propssets two folders up, the package versions that Central Package Management moved intoDirectory.Packages.props, and the entire transitive package closure. The newvs-semantictool returns what MSBuild and NuGet actually resolved: real target frameworks (multi-targeting included), packages with resolved versions split into direct and transitive, each flagged when its version is centrally managed or SDK-implicit and with arequestedfield only when resolution moved the version, project references, the active configuration and platform per project, the startup projects, and whichDirectory.Build.*files each project inherits. Passproject(a name or the path of any file in it) for the transitive closure withrequestedBynaming what pulled each package in, the analyzer set grouped by origin, and the evaluated MSBuild properties that most often diverge from the project text;propertiesevaluates any other property by name. Package data is NuGet's own restore output, located through the evaluatedProjectAssetsFileproperty so a redirectedobj/still resolves; a project without one falls back to the compiler's reference list and says so. New fixture:demo/GraphProbe, whose project files say nothing about any of it.- Edit the proposal before you accept it. The review diff's right pane is a live editor. Change what Claude proposed - rename something, drop a line it shouldn't have touched - and click Accept: the file gets your version, and Claude is told the file now differs from its proposal so it re-reads before touching it again. The edit gate is a PreToolUse hook, and the hook contract lets it replace the tool's input on the way through; the bridge rebuilds the CLI's own
Edit/Writeinput from the file as it is and the pane as you left it, so the CLI remains the only writer. Editing everything back to the file's current content and accepting counts as "leave this file alone" and writes nothing. An untouched Accept behaves exactly as before. - The panel shows what Claude is doing right now. A live activity card: elapsed time, the prompt being worked on, the tool call in flight (
⚙ Edit Pricing.cs,⚙ vs_build BuildBreak.App), and Claude's own task list when the session has one. It settles intoFinished · 2m 05s · 14 tool callsbetween turns and takes no space before the first one. Turn boundaries come from the two hooks the extension already installs; the detail in between is read from the session transcript the CLI appends to as it works, so nothing is added per tool call - no hook, no process, no latency. (Newer models get no task-list tool by default from CLI 2.1.268; the card shows the list when a session has one and omits it otherwise.) - Generate Tests in the editor's context menu. The seventh entry in the Claude Code flyout, and the complement of Fix This Test: it resolves the function at the caret through Roslyn and composes the ask with what the solution already has - which project is the test project and on which framework (xUnit, NUnit, MSTest, TUnit, detected from what each project compiles against), whether it already references the code under test, and which existing tests already call this member so Claude extends rather than duplicates - then asks for a
vs_build+vs_run_testverification of the new tests. It hides in test files, where Fix This Test appears instead.
Fixes
- Accepting an
openDiffin the IDE no longer leaves the terminal's own prompt waiting. On the protocol path (a session connected without the extension's hook), the accept reply wasDIFF_ACCEPTED, which the CLI does not recognize - it treats it as "not accepted" and leaves its own permission prompt up as a second gate. Accept now sendsFILE_SAVEDwith the file's final contents, the reply the official VS Code extension sends and the one the CLI acts on, which also carries edits made in the right pane on this path. - Non-ASCII text in a reject reason reaches the CLI intact. The permission hook printed its decision through PowerShell 5.1's console encoding (the OEM code page), which mangled any non-ASCII character in a "Reject with feedback" reason. The hook now writes raw UTF-8, and the bridge sends the accept-with-edits decision as pure ASCII so the same encoding can never touch it.