Skillquality 0.48

refactoring-csharp

Rename and refactor C# symbols in a solution with a one-shot Roslyn CLI. Use when the user asks to rename a symbol, preview impact, or update references across a .NET solution.

Price
free
Protocol
skill
Verified
no

What it does

Refactoring C# Symbols

This skill ships a Roslyn-based C# rename CLI in src/. It is intentionally one-shot and stateless: one call resolves the target, validates the request, and returns either a preview or an applied rename. There is no public prepare step.

Canonical CLI

If the skill was installed by install.sh, prefer the prebuilt CLI:

bin/csharp-refactor rename-symbol <sln> <file> <line> <oldName> <newName> [dryRun=false|true]

Otherwise run the bundled source CLI from the skill directory:

dotnet run --project src/CSharpRefactoring.Cli -- rename-symbol <sln> <file> <line> <oldName> <newName> [dryRun=false|true]

When invoked from outside the skill directory, use an absolute project path:

/<skill-dir>/bin/csharp-refactor rename-symbol <sln> <file> <line> <oldName> <newName> [dryRun=false|true]
# or, if no prebuilt binary is installed:
dotnet run --project /path/to/refactoring-csharp/src/CSharpRefactoring.Cli -- rename-symbol <sln> <file> <line> <oldName> <newName> [dryRun=false|true]

The tool project may create normal bin/ and obj/ directories under the skill. That is expected and useful: it lets repeated runs reuse the .NET build cache instead of rebuilding the CLI from scratch.

The target solution is not redirected to a temporary build output. The CLI opens the solution from the solution directory and lets Roslyn/MSBuild use the target project's normal build cache (obj/, bin/, or the repository's configured artifacts layout). This is intentional: it avoids creating a second cache tree for the project being refactored and lets repeated renames benefit from the project's existing MSBuild/Roslyn design-time build cache.

Contract

FieldRequiredDefaultNotes
solution_pathyes-Absolute path to the .sln or .slnx file.
file_pathyes-Absolute path to a file inside the solution.
line_numberyes-1-based line number. Use the value reported by rg -n.
old_nameyes-Exact current identifier on that line. This is the anchor.
new_nameyes-Must be a valid C# identifier.
dry_runnofalseApply changes by default. Preview only when explicitly set to true.
rename_overloadsnofalseKeep overloads unchanged by default.
rename_in_stringsnofalseString literals stay untouched by default.
rename_in_commentsnotrueComments are renamed by default.
rename_filenotrueSafe file move for supported named types. Never recreate the file as delete+add.

How To Use It

  1. Use rg -n to locate the symbol and copy the 1-based line number directly.
  2. Call rename-symbol once without the dryRun argument for normal rename requests. This applies the rename.
  3. Use dryRun=true only when the user explicitly asks for preview, when the target is ambiguous, or when the rename is unusually broad/risky and applying immediately would be irresponsible. The CLI also accepts true, --dry-run, dryRun=false, false, and --no-dry-run; invalid values fail fast and must never silently apply.
  4. Do not run a dry run just because the tool supports it. The tool loads the solution on every call, so preview+apply doubles the cost on large projects.
  5. Summarize the result by reporting the original name, new name, changed document count, total text changes, changed files, and any file move.

Important Behavioral Rules

  • The tool is stateless. It loads the solution on every call.
  • A preview does not reserve state. If the workspace changes between preview and apply, rerun the preview.
  • Prefer one apply call over preview+apply when the user already asked to perform the rename.
  • The tool runs Roslyn from the target solution directory and uses the target project's normal MSBuild outputs. Do not pass properties that redirect the target project's BaseIntermediateOutputPath, BaseOutputPath, or ArtifactsPath unless the user explicitly asks for isolated build outputs.
  • Do not invent a session or hidden prepare state.
  • Do not ask for a column number. The tool resolves from file_path, line_number, and old_name.
  • old_name is mandatory because it disambiguates the target when a line contains more than one renameable identifier.
  • The bundled source requires .NET 10 and restores NuGet packages on first run.
  • Let the tool keep its own normal bin/ and obj/ cache unless the user explicitly asks for a clean/no-cache run.
  • If the tool returns a preview, say preview. If it returns applied changes, say applied.
  • Keep responses concise and action-oriented. Tell the user what changed and whether a file move happened.

Supported Targets

Treat these as supported rename targets when the Roslyn symbol is source-backed and CanBeReferencedByName:

  • NamedType
  • Method
  • Property
  • Field
  • Event
  • Parameter
  • Local
  • TypeParameter
  • Namespace

Do not rename constructors, destructors, static constructors, or indexers.

File Rename Nuance

rename_file=true is a convenience default, but it only produces a real safe move when the symbol is a single-declaration named type and the file stem matches the current type name.

If the tool does not return file_move_from_path and file_move_to_path, the symbol rename is still valid, but the file itself was not moved. Do not claim a file rename happened unless the tool reports it.

This is intentionally conservative so git sees a tracked rename instead of a delete+add pair.

Error Handling

Use the tool's error codes as actionable guidance:

Error codeMeaningWhat to do
invalid_solution_pathSolution path is missing or not a .sln/.slnx file.Ask for a real solution path.
invalid_file_pathFile path is missing or not present on disk.Ask for the correct file path.
file_not_in_solutionThe file is not part of the loaded solution.Ask for the correct file or solution.
invalid_line_numberLine number is outside file bounds or not 1-based.Ask for the correct line.
invalid_old_nameold_name was empty or whitespace.Ask for the exact current name.
old_name_not_found_on_lineNo renameable symbol with that name exists on the line.Ask for a better line or file.
ambiguous_old_name_on_lineMore than one renameable symbol matches that name on the line.Narrow the target or use a different line.
unsupported_symbol_kindRoslyn found a symbol, but this kind is not renameable here.Move to a supported symbol kind.
symbol_not_in_sourceThe symbol is not declared in source.Pick a source-backed target.
invalid_new_namenew_name is not a valid C# identifier.Propose a valid identifier.
same_nameNew name equals the current name.Ask for a different name.
no_changesRoslyn produced no text edits.Re-check the target or the new name.
apply_failedWorkspace apply failed.Treat as a runtime failure and retry only if the state is unchanged.
operation_timeoutThe rename timed out.Retry with a larger timeout or a narrower target.

Success Criteria

A rename workflow is complete when:

  • The target was resolved from line_number + old_name.
  • The user approved the rename, or explicitly requested a dry run only.
  • The tool returned changed documents, total text changes, and any file move details.
  • The final answer makes the applied scope clear enough for the user to trust the change.

Recommended Output Style

  • For previews, say what would change and that nothing was applied.
  • For applied changes, say what changed and whether the file was moved.
  • If the file move fields are present, mention them explicitly.
  • If the tool returned an error code, echo the code and the human-readable reason.

Capabilities

skillsource-codealive-aiskill-refactoring-csharptopic-agent-safetytopic-agent-skillstopic-ai-codingtopic-ai-driven-developmenttopic-ai-safetytopic-antigravitytopic-bashtopic-claude-codetopic-codex-clitopic-cursortopic-developer-toolstopic-gemini-cli

Install

Quality

0.48/ 1.00

deterministic score 0.48 from registry signals: · indexed on github topic:agent-skills · 67 github stars · SKILL.md body (7,879 chars)

Provenance

Indexed fromgithub
Enriched2026-05-18 18:57:07Z · deterministic:skill-github:v1 · v1
First seen2026-05-11
Last seen2026-05-18

Agent access