Reversible Migration
JuliusBrussee/caveman
Implement reversible compatibility-safe transitions. Use for schema, data, API, protocol, configuration, or dependency migrations requiring rollback and…
Migrate an application from ReactiveProperty (namespace Reactive.Bindings) to R3 plus the ReactiveProperty.R3 bridge package.
$ npx skills add runceel/ReactiveProperty --skill migrating-reactiveproperty-to-r3 -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install runceel/ReactiveProperty migrating-reactiveproperty-to-r3 --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/skills/migrating-reactiveproperty-to-r3 .claude/skills/migrating-reactiveproperty-to-r3 && 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 "migrating-reactiveproperty-to-r3" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/skills/migrating-reactiveproperty-to-r3 into .claude/skills/migrating-reactiveproperty-to-r3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrating-reactiveproperty-to-r3", 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/skills/migrating-reactiveproperty-to-r3Type 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 migrating-reactiveproperty-to-r3 -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install runceel/ReactiveProperty migrating-reactiveproperty-to-r3 --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/skills/migrating-reactiveproperty-to-r3 .agents/skills/migrating-reactiveproperty-to-r3 && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "migrating-reactiveproperty-to-r3" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/skills/migrating-reactiveproperty-to-r3 into .agents/skills/migrating-reactiveproperty-to-r3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrating-reactiveproperty-to-r3", 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 migrating-reactiveproperty-to-r3 -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install runceel/ReactiveProperty migrating-reactiveproperty-to-r3 --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/skills/migrating-reactiveproperty-to-r3 .cursor/skills/migrating-reactiveproperty-to-r3 && 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 "migrating-reactiveproperty-to-r3" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/skills/migrating-reactiveproperty-to-r3 into .cursor/skills/migrating-reactiveproperty-to-r3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrating-reactiveproperty-to-r3", 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 skills/migrating-reactiveproperty-to-r3--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 migrating-reactiveproperty-to-r3 -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install runceel/ReactiveProperty migrating-reactiveproperty-to-r3 --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/skills/migrating-reactiveproperty-to-r3 .gemini/skills/migrating-reactiveproperty-to-r3 && 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 "migrating-reactiveproperty-to-r3" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/skills/migrating-reactiveproperty-to-r3 into .gemini/skills/migrating-reactiveproperty-to-r3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrating-reactiveproperty-to-r3", 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 migrating-reactiveproperty-to-r3Installs 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 migrating-reactiveproperty-to-r3 -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/skills/migrating-reactiveproperty-to-r3 .github/skills/migrating-reactiveproperty-to-r3 && 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 "migrating-reactiveproperty-to-r3" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/skills/migrating-reactiveproperty-to-r3 into .github/skills/migrating-reactiveproperty-to-r3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrating-reactiveproperty-to-r3", 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 migrating-reactiveproperty-to-r3 -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 migrating-reactiveproperty-to-r3 --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/skills/migrating-reactiveproperty-to-r3 .opencode/skills/migrating-reactiveproperty-to-r3 && 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 "migrating-reactiveproperty-to-r3" agent skill from https://github.com/runceel/ReactiveProperty/tree/main/skills/migrating-reactiveproperty-to-r3 into .opencode/skills/migrating-reactiveproperty-to-r3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrating-reactiveproperty-to-r3", 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.
migrating-reactiveproperty-to-r3Migrate an application from ReactiveProperty (namespace Reactive.Bindings) to R3 plus the ReactiveProperty.R3 bridge package.
Migrating Reactiveproperty To R3 is an agent skill from runceel/ReactiveProperty. Migrate an application from ReactiveProperty (namespace Reactive.Bindings) to R3 plus the ReactiveProperty.R3 bridge package. Use this when asked to "migrate to R3", "move off ReactiveProperty", "replace ReactiveProperty with R3", "swap Reactive.Bindings for R3", or to rewrite ViewModels/commands/validation/notifiers/collections that use ReactiveProperty so they run on R3. Drives the rewrite from a mapping table (references/rules.json): everything R3 already provides becomes native R3, every genuine gap becomes a…
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/rules.json`).
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.
5 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.
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.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.
Migrating Reactiveproperty To R3 loads about 2.3k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 166 tokens; SKILL.md has 956 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). 956 words, ~2,254 tokens.
.claude/skills/migrating-reactiveproperty-to-r3/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Rewrite a project that uses ReactiveProperty (root namespace Reactive.Bindings) so it runs on
R3, using the ReactiveProperty.R3 bridge package for the
features R3 does not provide.
This skill is execution-centric: rewrite the code from the mapping table first, then surface only
the spots that still need a human decision. R3 is the destination; ReactiveProperty.R3 is a single,
permanent bridge package that fills the genuine gaps under familiar names. Code may keep depending on
ReactiveProperty.R3 indefinitely.
ReactiveProperty, ReactiveProperty.Core, ReactiveProperty.WPF, or
ReactiveProperty.Blazor and you are asked to move it to R3.AGENTS.md).All rewrites are driven by references/rules.json (schemaVersion 2). Each
rule has these fields and nothing else:
| Field | Meaning |
|---|---|
ruleId | Stable identifier for the rule. |
symbol | The ReactiveProperty type or member the rule matches (fully qualified). |
matchKind | TypeReference, MethodInvocation, PropertyReference, or ObjectCreation. |
target | r3-direct, reactiveproperty-r3, or manualReview. |
replacement | The fully-qualified replacement symbol (null for manualReview). |
usingAdd | Namespaces to add. |
usingRemove | Namespaces to remove (only when nothing else in the file still needs them). |
manualReview | A note to surface to the user (string), or null. |
notes | Short guidance for applying the rule. |
Reading
references/rules.json: this file ships with the skill and is not secret or policy-excluded. If your structured file-view tool denies it because the skill is installed outside the current project (e.g. under~/.copilot/skills/), read it another way — a shell/Node/Python file read, or by adding its directory to the allowed paths. Do not report it as a content-exclusion or policy block, and do not skip the table.
target decides the rewrite:
r3-direct — R3 already provides this (often under a different name). Rewrite to the native R3
API and switch the using to R3. Examples: ReactivePropertySlim<T> → R3 ReactiveProperty<T>,
ObserveProperty(x => x.P) → R3 ObservePropertyChanged(x => x.P).reactiveproperty-r3 — a genuine gap. Rewrite to the ReactiveProperty.R3 type, which mirrors
ReactiveProperty's name and behavior but exposes R3 shapes (returns R3 Observable<T>, uses
TimeProvider/SynchronizationContext instead of IScheduler). Examples: BusyNotifier,
ReactiveTimer, AsyncReactiveCommand, ReadOnlyReactiveCollection<T>, the collection-changed and
INotifyDataErrorInfo extensions, ValidatableReactiveProperty<T>.manualReview — cannot be rewritten mechanically. Leave the code as-is and report it with file,
line, and the rule's manualReview note. Do not guess.R3 and ReactiveProperty.R3.EventToReactiveProperty / EventToReactiveCommand trigger actions
(or custom ReactiveConverter<T, U> converters for them), also add ReactiveProperty.R3.WPF.
Their R3 versions live in that package, not in ReactiveProperty.R3.ReactiveProperty, ReactiveProperty.Core, ReactiveProperty.WPF,
ReactiveProperty.Blazor, and ReactiveProperty.UWP.PackageReference). Do not pin a version that conflicts with the repo's convention.For every ReactiveProperty symbol in the project, find its rule in references/rules.json and apply it:
r3-direct → rewrite to the R3 replacement.reactiveproperty-r3 → rewrite to the ReactiveProperty.R3 replacement.manualReview → leave it and record it for step 5.Generic type rules apply to the closed forms too — e.g. the rule for
Reactive.Bindings.ReactivePropertySlim<T> covers ReactivePropertySlim<int>.
using directivesusingAdd / usingRemove. Only remove a namespace when no remaining code
in the file still needs it.reactiveproperty-r3 gap types expose R3 observables, add using R3; wherever the
rewritten code subscribes or chains R3 operators (Subscribe, Where, Select, CombineLatest,
…). When in doubt, add using R3; to files that touch any rewritten symbol.Reactive.Bindings* namespaces map to R3 and/or Reactive.Bindings.R3* per the rules.{Binding Xxx.Value} and ItemsSource="{Binding Xxx.Value}" after
the mechanical rewrite. Any Xxx property that is bound through .Value must raise WPF
PropertyChanged for Value changes.BindableReactiveProperty<T> instead of
ReactiveProperty<T> even when the original type was ReactivePropertySlim<T>.ToReadOnlyBindableReactiveProperty(...) and
expose them as IReadOnlyBindableReactiveProperty<T>; do not expose the internal concrete
ReadOnlyBindableReactiveProperty<T> type. Use ReadOnlyReactiveProperty<T> only for non-XAML
code paths..Value binding is backed by
a bindable R3 property or interface.manualReview hit with its
file, line, and the rule's manualReview note. Keep this list concise; it is the only narrative
output. Common manual-review cases are narrow: a custom IScheduler argument that is neither the UI
dispatcher nor the default (RP-MANUAL-SCHEDULER), a ReactivePropertyMode argument that has no R3
equivalent (RP-MANUAL-MODE), a System.IObservable<T> boundary that must not be retyped
mechanically (RP-OBSERVABLE-INTEROP), and any Reactive.Bindings* API not covered by
a rule (default fallback — flag it with file/line and a one-line description; do not guess a
replacement; e.g. WPF/Blazor platform helpers like BindTo, ReactiveCollection<T>, or the
Blazor ValidationMessage integration).ToObservable() / AsSystemObservable() only at boundaries
that still require System.Reactive.ObserveElementProperty) is a reactiveproperty-r3 rewrite, not manual
review. Nested property paths are not supported as a single selector: the bridge's
ToReactivePropertyAsSynchronized rejects x => x.A.B at runtime (ArgumentException) and only
accepts chained single-hop selectors (x => x.A, a => a.B). Rewrite any nested path into that chain form.EnableValidation() rewrite; only
stream/async validation and observable error streams need ValidatableReactiveProperty<T> from
ReactiveProperty.R3.EventToReactiveProperty / EventToReactiveCommand trigger actions have R3 versions in
the ReactiveProperty.R3.WPF package (Reactive.Bindings.R3.Interactivity). They are normally
referenced from XAML inside a Microsoft.Xaml.Behaviors EventTrigger, so the rewrite is mainly an
xmlns swap: clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.WPF →
clr-namespace:Reactive.Bindings.R3.Interactivity;assembly=ReactiveProperty.R3.WPF. The bound
ReactiveProperty/Command are the already-migrated R3 BindableReactiveProperty<T> / R3
ReactiveCommand. Custom ReactiveConverter<T, U> subclasses keep the same shape, but OnConvert
now takes/returns R3 Observable<T?>/Observable<U?> instead of System.Reactive observables —
rewrite the body with R3 operators and add using R3;.© runceel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in skills/migrating-reactiveproperty-to-r3 of runceel/ReactiveProperty.
Open the folder on GitHubat commit e7e6474
Migrating Reactiveproperty To R3 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 |
|---|---|---|---|---|---|---|
| Migrating Reactiveproperty To R3 this skillrunceel/ReactiveProperty | 944 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Reversible MigrationJuliusBrussee/caveman | 111k | 1 repos | ~196 | Automated safety check: Pass | Apache-2.0 | |
| Database Migrationsaffaan-m/ECC | 277k | 4 repos | ~3k | Automated safety check: Pass | MIT | |
| Database Migrationsaffaan-m/ECC | 277k | 1 repos | ~2.4k | Automated safety check: Pass | MIT | |
| Safe Database Migration Patternsaffaan-m/ECC | 276k | — | ~3.3k | Automated safety check: Pass | MIT | |
| Migrate Createruvnet/ruflo | 74k | — | ~583 | Automated safety check: Notes | MIT |
JuliusBrussee/caveman
Implement reversible compatibility-safe transitions. Use for schema, data, API, protocol, configuration, or dependency migrations requiring rollback and…
affaan-m/ECC
Safe, reversible database migration patterns: forward-only production changes, expand-contract zero-downtime renames, concurrent indexes, batched backfills, and per-tool workflows for PostgreSQL…
affaan-m/ECC
Şema değişiklikleri, veri migration'ları, rollback'ler ve PostgreSQL, MySQL ve yaygın ORM'ler (Prisma, Drizzle, Django, TypeORM, golang-migrate) arasında sıfır kesinti deployment'ları için…
affaan-m/ECC
Rules and examples for safe, reversible schema changes in production: zero-downtime column and index changes, large data backfills and ORM migration workflows.
ruvnet/ruflo
Create a new sequentially numbered database migration with up/down SQL files
kortix-ai/suna
How to change the database schema in this repo. An agent skill from kortix-ai/suna.
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
Reference for the .NET 10 / C 14 features that are relevant to the ReactiveProperty repository.
runceel/ReactiveProperty
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP).
Migrate an application from ReactiveProperty (namespace Reactive.Bindings) to R3 plus the ReactiveProperty.R3 bridge package. Migrating Reactiveproperty To R3 is an agent skill from runceel/ReactiveProperty.R3 bridge package.
Run `npx skills add runceel/ReactiveProperty --skill migrating-reactiveproperty-to-r3 -a claude-code`. Or copy the skill folder (skills/migrating-reactiveproperty-to-r3 in runceel/ReactiveProperty) into .claude/skills/migrating-reactiveproperty-to-r3 in your project. Claude Code loads it when a task matches its description.
Run `npx skills add runceel/ReactiveProperty --skill migrating-reactiveproperty-to-r3 -a codex`. Or copy the skill folder (skills/migrating-reactiveproperty-to-r3 in runceel/ReactiveProperty) into .agents/skills/migrating-reactiveproperty-to-r3 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 migrating-reactiveproperty-to-r3 -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/migrating-reactiveproperty-to-r3, .gemini/skills/migrating-reactiveproperty-to-r3, .github/skills/migrating-reactiveproperty-to-r3 and .opencode/skills/migrating-reactiveproperty-to-r3 in your project.
SKILL.md names no scripts, command-line tools or credentials: Migrating Reactiveproperty To R3 is instructions for the agent only. Our summary lists: Python 3.
SKILL.md names 1 domain. As links in the text: github.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.
Migrating Reactiveproperty To R3 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.3k tokens (SKILL.md is roughly 9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Migrating Reactiveproperty To R3: Reversible Migration (JuliusBrussee/caveman, 111k stars), Database Migrations (affaan-m/ECC, 277k stars), Database Migrations (affaan-m/ECC, 277k stars) and Safe Database Migration Patterns (affaan-m/ECC, 276k 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 13 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.