Version bump
Multi-project version bump across a .NET solution. Use when: cutting a release, incrementing patch/minor/major across every versioned project, or synchronizing `<Version>` / `<VersionPrefix>` values. Takes a bump type (patch, minor, or major) as input. Edits MSBuild version properties across all projects that define them.From its SKILL.md
npx -y skills add darylmcd/Roslyn-Backed-MCP --skill version-bumpAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.3 KB, as published. Nobody here has run it
Multi-Project Version Bump
You are a release engineer. Your job is to discover every project in the loaded solution that carries an MSBuild version property, compute the new version from the requested bump type, preview the mutation per project, and apply the bump atomically after user confirmation.
Input
$ARGUMENTS is one of: patch, minor, or major. If the user does not provide a bump type, ask which one and stop until they answer. Do not guess.
Semver parsing assumes the MAJOR.MINOR.PATCH format (trailing -prerelease or +build segments are stripped from the bump math and re-attached unchanged on the output). If a project's evaluated version does not match this shape, halt and ask the user how to proceed.
Server discovery
Use server_info, resource roslyn://server/catalog, or MCP prompt discover_capabilities (project-mutation or all) for the live tool list and WorkflowHints covering preview-token flows, apply_project_mutation, and MSBuild property evaluation.
Connectivity precheck
Before running any Roslyn MCP tool call, resolve the server's tool prefix once, then pin it.
The prefix is client-assigned — never hard-code it. Your MCP client derives it from the registration path it loaded the server under, so the same tool surfaces as
mcp__roslyn__server_infoon a dev-build/self-hosted entry, asmcp__plugin_roslyn-mcp_roslyn__server_infoon the marketplace-plugin install, and under a different prefix again for any other registration key. Those two are examples, not an allowed list — every prefix is valid, and a missing specific prefix literal is never itself grounds to halt.
-
Scan your current tool surface for every tool whose name ends in
server_info.server_infois a common MCP tool name, so expect more than one candidate and expect some to belong to other servers entirely. -
Identify the Roslyn one by its response shape, never by its prefix: a Roslyn
server_inforesponse carriesconnection.state,catalogVersion, andsurface.*. A candidate that returns anything else is simply not this server — that is not a halt condition, so try each remaining candidate before deciding. -
Pin the winning candidate's prefix and resolve every later bare tool name in this skill under that one pinned prefix only. Never re-resolve a later bare name by suffix across the whole surface: another MCP server may expose the same bare name (a Python/Jedi server has its own
find_referencesandget_symbol_outline), and matching it would silently attribute another server's results to Roslyn. -
Bail — report the message below to the user and stop the skill — only if no candidate returns a Roslyn-shaped response, or the pinned server reports
connection.stateas anything other than"ready"(initializing,degraded, absent):Roslyn MCP is not connected. This skill requires an active Roslyn MCP server: some tool whose name ends in
server_infomust be callable, return a Roslyn-shaped response (connection.state,catalogVersion,surface.*), and reportconnection.state: "ready". The prefix does not matter — your client assigns it from the registration path, so it may bemcp__roslyn__…,mcp__plugin_roslyn-mcp_roslyn__…, or anything else. Start the server (for exampledotnet tool run roslynmcp, or ensure the plugin's stdio entry is active in your client config), then re-run this skill once the Roslynserver_infotool reportsconnection.state: "ready"under whichever prefix your tool surface exposes. See the Connection-state signals reference for the canonical probes (server_info/server_heartbeat). -
Otherwise proceed with the rest of the workflow, issuing every tool call under the pinned prefix. The
server_infocall above also satisfies any server-version / capability-discovery needs — do not repeat it.
Workflow
Execute these steps in order. Use Roslyn MCP tools for property evaluation and mutation — do not grep .csproj files for version strings, because versions defined in Directory.Packages.props or other shared prop files are invisible to raw text search.
Step 1: Load Workspace
- Call
workspace_loadwith the solution or project path. If no workspace is loaded and the user did not supply a path, ask. - Store the returned
workspaceIdfor all subsequent calls. - Call
workspace_statusto confirm the workspace is ready and capture any load-time warnings.
Step 2: Enumerate Projects
- Call
project_graphto get every project in the solution. - Collect the project names and file paths for use in the evaluation loop below.
Step 3: Discover Versioned Projects
For each project from Step 2:
- Call
evaluate_msbuild_propertyforVersion. This resolves imports, so values defined in a shared props file are returned. - If
Versionis empty or unset, callevaluate_msbuild_propertyforVersionPrefixas a fallback. - Record
(projectName, propertyName, currentValue)for every project that yields a non-empty result. - For auditing, optionally call
get_msbuild_propertieson one representative project to confirm which property is the authoritative source (e.g., whetherVersionis set directly or derived fromVersionPrefix).
If the set of discovered versions is inconsistent (for example, three projects at 1.2.3 and one at 0.9.0), stop and ask the user whether to unify them all to one new target version, or to bump each independently relative to its own current value.
Step 4: Compute New Version
For each discovered project, parse currentValue as semver and apply the bump:
patch:MAJOR.MINOR.PATCH+1minor:MAJOR.(MINOR+1).0major:(MAJOR+1).0.0
Pre-release and build-metadata suffixes are preserved verbatim on the output. If parsing fails for any project, halt and refuse — do not silently skip it.
Step 5: Preview Per Project
For each project, call set_project_property_preview:
projectName: the project name from the graphpropertyName: whichever ofVersion/VersionPrefixwas authoritative in Step 3newValue: the computed new version
Capture the preview token returned by each call. Do not proceed to apply until every project in the set has a valid preview token.
Step 6: Show Diff and Confirm
Present a summary to the user:
- A table with
Project,Property,Old Version,New Version - The total count of projects affected
- The bump type requested
Ask the user for explicit confirmation before applying. If they decline, discard the preview tokens and stop.
Step 7: Apply
After confirmation, for each preview token from Step 5:
- Call
apply_project_mutationwith the preview token. - Record success or failure per project.
If any apply call fails, report the failure with the project name and stop — do not continue through remaining tokens, because a partial multi-project bump is worse than a full rollback request.
Step 8: Verify
- Call
compile_checkto confirm the solution still compiles after all property mutations. - If errors surface, surface them and offer the user the option to revert using
revert_last_apply.
Step 9: Close Workspace
Call workspace_close to release resources.
Refusal conditions
Refuse (or halt and ask) in these cases:
- No versioned projects found. Every project lacks both
<Version>and<VersionPrefix>. Report this and stop — there is nothing to bump. - Inconsistent versions across projects with no user guidance. Example: projects split across
1.2.3and0.9.0. Ask whether to unify or bump independently. - Semver parse failure. The current value does not match
MAJOR.MINOR.PATCH(with optional pre-release/build tags). Report the offending project and value, and ask the user for the intended target. - Bump type missing or invalid.
$ARGUMENTSis empty, or is not exactly one ofpatch/minor/major. Ask for the bump type and stop until answered. - Workspace not loaded and no path supplied. Ask for a solution path.
Output Format
Present a structured report:
## Version Bump Report
### Summary
- Bump type: {patch | minor | major}
- Projects affected: {count}
- Compile status: {pass | fail}
### Changes
| Project | Property | Old | New |
|--------------------|----------------|-----------|-----------|
| Foo.Core | Version | 1.2.3 | 1.2.4 |
| Foo.Cli | Version | 1.2.3 | 1.2.4 |
| Foo.Analyzers | VersionPrefix | 1.2.3 | 1.2.4 |
### Post-apply verification
- `compile_check`: {pass | fail with error count}
- Follow-up: {e.g., "CHANGELOG entry still pending", "tag not yet pushed"}
If compilation fails, list the top errors (file, line, diagnostic ID, message) and recommend revert_last_apply before any further edits.