| name | roslynskills-tight |
| description | Precise C#/.NET navigation, rename/refactor, and diagnostics using RoslynSkills (roscli). Use when user asks to rename/refactor a C# symbol, disambiguate overloads/collisions, fix C# build/diagnostic errors, or make safe multi-file edits. Avoid for non-C# repos or pure formatting. |
| license | MIT |
| compatibility | Claude.ai / Claude Code. Requires local shell access (Bash or PowerShell) plus RoslynSkills CLI (roscli) or RoslynSkills MCP server. |
| metadata | {"author":"DNA Kode","mcp-server":"roslynskills"} |
| allowed-tools | Bash Read Write Edit Grep Glob |
RoslynSkills (Tight)
This skill is optimized for low-churn, "just enough Roslyn" workflows.
Boundaries
roscli: in-repo semantic work (symbol targeting, edits/refactors, diagnostics).
- Not
roscli: external package API lookup/version diff/security intelligence.
- For external API/package questions, use dotnet helper tooling first (for example
dotnet-inspect), then apply in-repo edits with roscli.
Rules (Pit Of Success)
- Use Roslyn tooling only when it buys correctness: ambiguity, multi-file edits, workspace diagnostics, refactors.
- Default to
stable commands; use advanced/experimental commands only when required.
- Keep Roslyn calls sequential (avoid parallel
dotnet locks).
- Prefer
--brief true and small --max-results / --max-diagnostics.
- For project code, require a workspace: add
--workspace-path <.sln|.slnx|.csproj|dir> --require-workspace true.
- Prefer
.sln/.slnx for repo-wide or hot-workspace context; use .csproj only when intentionally project-scoped.
- Treat
workspace_context.mode=ad_hoc as "not safe enough" for refactors.
- If using Claude Code's
Bash tool (common even on Windows), always run RoslynSkills as bash scripts/roscli ... (no backslashes, do not call scripts\roscli.cmd).
- Never claim you used RoslynSkills unless you actually ran
roscli / scripts/roscli commands; otherwise state the fallback explicitly.
- For high-call loops, use cached published wrappers (
ROSCLI_USE_PUBLISHED=1); after editing roscli itself, force one refresh (ROSCLI_REFRESH_PUBLISHED=1).
Start (2 commands)
If you're using the Bash tool (recommended for portability):
bash scripts/roscli list-commands --ids-only
bash scripts/roscli list-commands --stable-only --ids-only
bash scripts/roscli quickstart
If you're using PowerShell and scripts\roscli.cmd exists:
scripts\roscli.cmd list-commands --ids-only
scripts\roscli.cmd list-commands --stable-only --ids-only
scripts\roscli.cmd quickstart
If roscli is on PATH (either shell):
roscli list-commands --ids-only
roscli list-commands --stable-only --ids-only
roscli quickstart
Minimal Workflows
1) Ambiguous target (2 calls, then stop)
bash scripts/roscli nav.find_symbol src/MyFile.cs MySymbol --brief true --max-results 50 --workspace-path MySolution.slnx --require-workspace true
bash scripts/roscli edit.rename_symbol src/MyFile.cs 42 17 NewName --apply true --max-diagnostics 50 --workspace-path MySolution.slnx --require-workspace true
Success criteria:
- 2 calls total.
- In the
edit.rename_symbol response, diagnostics_after_edit reports 0 errors.
Only if the edit response does not include diagnostics (or reports errors/warnings), add one verification call:
scripts\roscli.cmd diag.get_file_diagnostics src/MyFile.cs --workspace-path MySolution.slnx --require-workspace true
2) Known coordinates (1 call, then stop)
bash scripts/roscli edit.rename_symbol src/MyFile.cs 42 17 NewName --apply true --max-diagnostics 50 --workspace-path MySolution.slnx --require-workspace true
3) Cross-project investigation (text + calls, bounded)
bash scripts/roscli ctx.search_text "RemoteUserAction" src --mode literal --max-results 100 --brief true
bash scripts/roscli nav.find_invocations src/MyFile.cs 42 17 --brief true --max-results 100 --workspace-path MySolution.slnx --require-workspace true
bash scripts/roscli nav.call_hierarchy src/MyFile.cs 42 17 --direction both --max-depth 2 --brief true --workspace-path MySolution.slnx --require-workspace true
bash scripts/roscli analyze.control_flow_graph src/MyFile.cs 42 17 --brief true --max-blocks 120 --max-edges 260 --workspace-path MySolution.slnx --require-workspace true
bash scripts/roscli analyze.dataflow_slice src/MyFile.cs 42 17 --brief true --max-symbols 120 --workspace-path MySolution.slnx --require-workspace true
bash scripts/roscli analyze.unused_private_symbols src --brief true --max-symbols 120
bash scripts/roscli analyze.impact_slice src/MyFile.cs 42 17 --brief true --include-callers true --include-callees true
bash scripts/roscli analyze.async_risk_scan src --brief true --max-findings 120 --severity-filter warning --severity-filter info
If you need several read-only checks in one round-trip, use query.batch:
bash scripts/roscli run query.batch --input '{"queries":[{"command_id":"ctx.search_text","input":{"patterns":["RemoteUserAction","ReplicationUpdate"],"roots":["src"],"mode":"literal","max_results":120}},{"command_id":"nav.find_invocations","input":{"file_path":"src/MyFile.cs","line":42,"column":17,"brief":true,"workspace_path":"MySolution.slnx","require_workspace":true}}],"continue_on_error":true}'
Troubleshooting (Do This, Not That)
- Input/schema error:
- run
scripts\roscli.cmd describe-command <command-id> once, fix args, retry.
- Workspace is
ad_hoc on project code:
- rerun with
--workspace-path ... --require-workspace true (fail closed).
- Solution scope is expected but
resolved_workspace_path is a project file:
- rerun with the
.sln/.slnx path.
- You see
CS0518 (missing core types):
- treat as invalid workspace binding; retry with explicit workspace args or different workspace root.
- If you must fall back to text-based edits:
- record an entry in
ROSLYN_FALLBACK_REFLECTION_LOG.md with date, RoslynSkills version (roscli --version), reason, and proposed Roslyn command/option that would have avoided the fallback.
- treat the log as temporary; forward it to
govert@dnakode.com as feedback, then delete when no longer needed.