Add Refactoring
dotnet/roslynator
A skill your agent uses when adding a new RR refactoring in roslynator, editing Refactorings.xml, registering in RefactoringContext, or when refactorings-testing.md shows XunitRefactoringVerifier —…
Reference for the .NET 10 / C 14 features that are relevant to the ReactiveProperty repository.
$ npx skills add runceel/ReactiveProperty --skill dotnet10-features -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install runceel/ReactiveProperty dotnet10-features --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/dotnet10-features .claude/skills/dotnet10-features && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "dotnet10-features" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-features into .claude/skills/dotnet10-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dotnet10-features", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-featuresType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add runceel/ReactiveProperty --skill dotnet10-features -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install runceel/ReactiveProperty dotnet10-features --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/dotnet10-features .agents/skills/dotnet10-features && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dotnet10-features" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-features into .agents/skills/dotnet10-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dotnet10-features", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add runceel/ReactiveProperty --skill dotnet10-features -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install runceel/ReactiveProperty dotnet10-features --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/dotnet10-features .cursor/skills/dotnet10-features && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "dotnet10-features" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-features into .cursor/skills/dotnet10-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dotnet10-features", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/runceel/ReactiveProperty.git --path .github/skills/dotnet10-features--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add runceel/ReactiveProperty --skill dotnet10-features -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install runceel/ReactiveProperty dotnet10-features --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/dotnet10-features .gemini/skills/dotnet10-features && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "dotnet10-features" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-features into .gemini/skills/dotnet10-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dotnet10-features", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install runceel/ReactiveProperty dotnet10-featuresInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add runceel/ReactiveProperty --skill dotnet10-features -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/dotnet10-features .github/skills/dotnet10-features && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "dotnet10-features" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-features into .github/skills/dotnet10-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dotnet10-features", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add runceel/ReactiveProperty --skill dotnet10-features -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install runceel/ReactiveProperty dotnet10-features --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/runceel/ReactiveProperty.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/dotnet10-features .opencode/skills/dotnet10-features && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "dotnet10-features" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/.github/skills/dotnet10-features into .opencode/skills/dotnet10-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dotnet10-features", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
dotnet10-featuresReference for the .NET 10 / C 14 features that are relevant to the ReactiveProperty repository.
Dotnet10 Features is an agent skill from runceel/ReactiveProperty. Reference for the .NET 10 / C 14 features that are relevant to the ReactiveProperty repository. Use this when adopting or evaluating .NET 10 / C 14 language and Blazor features in this codebase: modernizing INotifyPropertyChanged property accessors, refactoring the many Reactive.Bindings extension methods, raising LangVersion or adding a net10.0 target framework, or working on ReactiveProperty.Blazor / Blazor samples. Triggers include mentions of ".NET 10", "C 14", "field keyword", "extension members", "net10.0"…
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Refactoring. It works with C#, Blazor and .NET. The repository describes itself as: ReactiveProperty provides MVVM and asynchronous support features under Reactive Extensions. Target frameworks are .NET 6+, .NET Framework 4.7.2 and .NET Standard 2.0. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e7e6474. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are csharp and xml).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
learn.microsoft.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Dotnet10 Features loads about 2.7k tokens when it runs. Until then it costs about 148 tokens; SKILL.md has 1,001 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from runceel/ReactiveProperty at commit e7e6474, republished under its MIT licence (© runceel). 1,001 words, ~2,743 tokens.
.claude/skills/dotnet10-features/SKILL.md (or your agent's skills folder).This skill curates the .NET 10 (and its bundled C# 14) features that actually matter for this repository, and maps each one to concrete ReactiveProperty scenarios. It is intentionally scoped: it skips .NET 10 features with no bearing on a reactive MVVM library.
Target frameworks and language version are not uniform across the solution, so a C# 14 feature may be unavailable in a given project:
| Project | Target framework(s) | C# 14 available? |
|---|---|---|
ReactiveProperty.Core | netstandard2.0;net8.0;net9.0;net472 | Only if LangVersion is raised; runtime-dependent features stay off on netstandard2.0/net472 |
ReactiveProperty (main, ReactiveProperty.NETStandard) | netstandard2.0;net8.0;net9.0;net472 | Same as above |
ReactiveProperty.Platform.WPF | net8.0-windows;net9.0-windows;net472 | Same as above |
ReactiveProperty.Platform.UWP | (UWP TFMs) | Same as above |
ReactiveProperty.Platform.Blazor | net8.0;net9.0;net10.0 | Yes on the net10.0 leg |
Samples/**, Blazor samples | include net10.0 | Yes |
Key facts:
Source/Directory.Build.props currently pins <LangVersion>12.0</LangVersion>, so the
library compiles as C# 12 today. Adopting any C# 14 feature in the library requires
raising LangVersion (to 14 / latest / preview).net10.0 is currently used only by ReactiveProperty.Platform.Blazor and the
samples. The core/main/WPF/UWP libraries do not target net10.0.netstandard2.0 and net472. C# 14 language
features that the compiler can lower (e.g. field, extension members, null-conditional
assignment, partial members) work across all TFMs once LangVersion is raised, but
features that depend on the .NET 10 runtime/BCL (e.g. first-class Span<T> conversions
that rely on new BCL APIs) will not light up on the older TFMs. Guard those with
#if NET10_0_OR_GREATER when needed.<!-- Raise once in Source/Directory.Build.props, or per-project. -->
<LangVersion>14.0</LangVersion>For runtime/BCL-gated features, multi-target and branch with the framework constant:
#if NET10_0_OR_GREATER
// .NET 10-only path
#else
// fallback for net8.0 / net9.0 / netstandard2.0 / net472
#endiffield keyword — HIGH relevancefield exposes the compiler-synthesized backing field inside a property accessor, so you can
add validation/notification without declaring an explicit field. ReactiveProperty exists to
serve MVVM/INotifyPropertyChanged, and both the library internals and consumer ViewModels
are full of hand-written backing fields.
Classic INPC property:
private string _name = "";
public string Name
{
get => _name;
set
{
if (_name == value) return;
_name = value;
PropertyChanged?.Invoke(this, new(nameof(Name)));
}
}With field:
public string Name
{
get;
set
{
if (field == value) return;
field = value;
PropertyChanged?.Invoke(this, new(nameof(Name)));
}
}Notes for this repo:
field must be disambiguated
with @field or this.field.LangVersion >= 14; this is the lowest-risk C# 14 adoption here.ReactiveProperty's public surface is heavily built on extension methods in the
Reactive.Bindings namespace (ToReactiveProperty, ToReadOnlyReactivePropertySlim,
ObserveProperty, CombineLatest helpers, etc.). C# 14 adds an extension block syntax that
also enables extension properties, static extension members, and extension
operators — grouped by receiver instead of repeating this T source on every method.
public static class ObservableExtensions
{
extension<T>(IObservable<T> source)
{
// extension method (same call site as today)
public ReactiveProperty<T> ToReactiveProperty(T initialValue = default!)
=> new ReactiveProperty<T>(source, initialValue);
// NEW: extension property
public IObservable<T> Shared => source.Publish().RefCount();
}
}Notes for this repo:
IObservable<T> / IReactiveProperty<T> be grouped in one
extension(...) block, improving discoverability and enabling property-style helpers.LangVersion is raised — but it is an API-shape decision; keep existing extension method
signatures for source/binary compatibility and only add new members.?./?[] on the left side) — MEDIUM relevanceYou can now assign through ?./?[]:
// before
if (viewModel is not null) viewModel.SelectedItem = item;
// C# 14
viewModel?.SelectedItem = item;Useful in ViewModel/event-handler glue and in sample apps. Increment/decrement
(++/--) are not allowed on the conditional left side; compound assignments (+=, etc.)
are.
Span<T> / ReadOnlySpan<T> conversions — MEDIUM (performance)C# 14 adds implicit conversions among Span<T>, ReadOnlySpan<T>, and T[], improving
overload resolution and generic inference for span-based, allocation-free code paths. Relevant
only in hot paths (e.g. buffer/array handling inside operators).
Caveat: the most useful conversions rely on .NET 10 BCL support, so gate span-optimized
paths with #if NET10_0_OR_GREATER and keep an allocating fallback for net8.0/net9.0/
netstandard2.0/net472.
Modifiers (ref, in, out, scoped, ref readonly) can now be applied to lambda
parameters without restating the type:
delegate bool TryParse<T>(string text, out T result);
TryParse<int> parse = (text, out result) => int.TryParse(text, out result);Handy for Rx/LINQ-style lambdas and TryParse-shaped converters in samples. params still
requires an explicit type.
Instance constructors and events can now be partial (one defining + one implementing
declaration). This is primarily a source-generator enabler. If any INPC/event plumbing in
this repo (or a consumer toolkit pattern) is generated, partial events let a generator provide
add/remove accessors while the field-like event is declared by hand.
nameof with unbound generic types — LOW relevancenameof(ReactiveProperty<>) now evaluates to "ReactiveProperty". Minor convenience for
diagnostics, logging, and tests that reference open generic types.
You can define +=, -=, etc. directly (instead of relying on the binary operator plus an
assignment). Niche for this library; mentioned for completeness.
ReactiveProperty.Platform.Blazor and Blazor samples)ReactiveProperty.Platform.Blazor targets net10.0 and centers on EditForm validation
(ReactivePropertiesValidator, EditContext.EnableReactivePropertiesValidation()) plus
command helpers. The most relevant .NET 10 Blazor changes:
builder.Services.AddValidation() +
[ValidatableType]) that validates nested objects and collection items. This overlaps with
ReactiveProperty's EditContext validation integration; be aware of how the two interact
when both are enabled on the same EditForm, and document the recommended combination.OwningComponentBase now implements IAsyncDisposable — relevant to the disposal
pattern in ReactivePropertiesValidator (currently IDisposable wrapping a
SingleAssignmentDisposable). Async disposal can be useful where reactive subscriptions own
async resources.[PersistentState]) — public properties marked
[PersistentState] are auto-persisted via PersistentComponentState during prerendering,
removing the manual RegisterOnPersisting boilerplate. Useful for ViewModel-held state in
prerendered Blazor Web App samples.Router NotFoundPage parameter and
NavigationManager-based Not Found responses) and Blazor script served as a static web
asset — general improvements worth knowing when updating the Blazor samples to net10.0.When bumping the Blazor sample/template projects, also review the version-conditioned
Microsoft.AspNetCore.Components.* package versions in Directory.Packages.props
(10.0.0 entries are gated on '$(TargetFramework)' == 'net10.0').
LangVersion 12.0) and do not target net10.0.
Raising LangVersion is required before any C# 14 syntax compiles.netstandard2.0/net472 means runtime/BCL-gated features must be
#if NET10_0_OR_GREATER-guarded; language-only features are fine across TFMs.field keyword: https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/field© runceel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .github/skills/dotnet10-features of runceel/ReactiveProperty.
Open the folder on GitHubat commit e7e6474
Dotnet10 Features next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Dotnet10 Features this skillrunceel/ReactiveProperty | 944 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Add Refactoringdotnet/roslynator | 3.5k | — | ~946 | Automated safety check: Pass | Custom licence | |
| Dynamo Dotnet ExpertDynamoDS/Dynamo | 2k | — | ~922 | Automated safety check: Pass | Apache-2.0 | |
| Deprecate Analyzer Or Refactoringdotnet/roslynator | 3.5k | — | ~511 | Automated safety check: Pass | Custom licence | |
| Okojo Test262akeit0/okojo | 160 | — | ~742 | Automated safety check: Pass | MIT | |
| Refactor AnalysisSamsung/TizenFX | 214 | — | ~2.6k | Automated safety check: Pass | Apache-2.0 |
dotnet/roslynator
A skill your agent uses when adding a new RR refactoring in roslynator, editing Refactorings.xml, registering in RefactoringContext, or when refactorings-testing.md shows XunitRefactoringVerifier —…
DynamoDS/Dynamo
Write and review C/.NET code in Dynamo following Dynamo coding standards, modern C patterns, and repo conventions.
dotnet/roslynator
A skill your agent uses when obsoleting or retiring RCS, RR, or RCF in roslynator, replacing an analyzer with another id, or when tempted to use IsObsolete on an Analyzer entry — analyzers use…
akeit0/okojo
Run and continue Okojo Test262 compliance work. An agent skill from akeit0/okojo.
Samsung/TizenFX
Automatically scans the TizenFX codebase on a rotating schedule to discover .NET 8 / C 12+ refactoring targets and register them as GitHub Issues.
dotnet/skills
Refactors C# and .NET code without changing behavior, using binding-aware edits plus a build and tests, and separating out or declining anything that alters behavior.
runceel/ReactiveProperty
Catalog of MSBuild anti-patterns with detection rules and fix recipes.
runceel/ReactiveProperty
Analyze MSBuild binary logs to diagnose build failures by replaying binlogs to searchable text logs.
runceel/ReactiveProperty
Automated, project-wide code coverage and CRAP (Change Risk Anti-Patterns) score analysis for .NET projects with existing unit tests.
runceel/ReactiveProperty
ReactiveProperty repository development policy. An agent skill from runceel/ReactiveProperty.
runceel/ReactiveProperty
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP).
runceel/ReactiveProperty
Release the ReactiveProperty NuGet package set from this repository.
Categories
Reference for the .NET 10 / C 14 features that are relevant to the ReactiveProperty repository. Dotnet10 Features is an agent skill from runceel/ReactiveProperty.NET 10 / C 14 features that are relevant to the ReactiveProperty repository.
Dotnet10 Features fits situations like: include mentions of .NET 10; extension members; blazor net10 work in this repo.
Run `npx skills add runceel/ReactiveProperty --skill dotnet10-features -a claude-code`. Or copy the skill folder (.github/skills/dotnet10-features in runceel/ReactiveProperty) into .claude/skills/dotnet10-features in your project. Claude Code loads it when a task matches its description.
Run `npx skills add runceel/ReactiveProperty --skill dotnet10-features -a codex`. Or copy the skill folder (.github/skills/dotnet10-features in runceel/ReactiveProperty) into .agents/skills/dotnet10-features in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add runceel/ReactiveProperty --skill dotnet10-features -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dotnet10-features, .gemini/skills/dotnet10-features, .github/skills/dotnet10-features and .opencode/skills/dotnet10-features in your project.
SKILL.md names no scripts, command-line tools or credentials: Dotnet10 Features is instructions for the agent only.
SKILL.md names 1 domain. As links in the text: learn.microsoft.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Dotnet10 Features is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Dotnet10 Features: Add Refactoring (dotnet/roslynator, 3.5k stars), Dynamo Dotnet Expert (DynamoDS/Dynamo, 2k stars), Deprecate Analyzer Or Refactoring (dotnet/roslynator, 3.5k stars) and Okojo Test262 (akeit0/okojo, 160 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
runceel (a GitHub user) maintains it in runceel/ReactiveProperty, which has 944 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on August 31, 2026.
Source: runceel/ReactiveProperty on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.