Migrate Dotnet8 To Dotnet9
dotnet/skills
Migrate a .NET 8 project to .NET 9 and resolve all breaking changes.
Write, review, or modernize F code in .NET repositories with functional-first design, algebraic data types, pattern matching, pipelines, async workflows, project ordering, and C interop.
$ npx skills add managedcode/dotnet-skills --skill fsharp -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install managedcode/dotnet-skills fsharp --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/managedcode/dotnet-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/catalog/Tools/FSharp/skills/fsharp .claude/skills/fsharp && 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 "fsharp" agent skill from https://github.com/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharp into .claude/skills/fsharp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fsharp", 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/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharpType 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 managedcode/dotnet-skills --skill fsharp -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install managedcode/dotnet-skills fsharp --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/managedcode/dotnet-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/catalog/Tools/FSharp/skills/fsharp .agents/skills/fsharp && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fsharp" agent skill from https://github.com/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharp into .agents/skills/fsharp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fsharp", 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 managedcode/dotnet-skills --skill fsharp -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install managedcode/dotnet-skills fsharp --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/managedcode/dotnet-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/catalog/Tools/FSharp/skills/fsharp .cursor/skills/fsharp && 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 "fsharp" agent skill from https://github.com/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharp into .cursor/skills/fsharp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fsharp", 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/managedcode/dotnet-skills.git --path catalog/Tools/FSharp/skills/fsharp--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 managedcode/dotnet-skills --skill fsharp -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install managedcode/dotnet-skills fsharp --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/managedcode/dotnet-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/catalog/Tools/FSharp/skills/fsharp .gemini/skills/fsharp && 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 "fsharp" agent skill from https://github.com/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharp into .gemini/skills/fsharp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fsharp", 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 managedcode/dotnet-skills fsharpInstalls 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 managedcode/dotnet-skills --skill fsharp -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/managedcode/dotnet-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/catalog/Tools/FSharp/skills/fsharp .github/skills/fsharp && 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 "fsharp" agent skill from https://github.com/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharp into .github/skills/fsharp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fsharp", 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 managedcode/dotnet-skills --skill fsharp -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install managedcode/dotnet-skills fsharp --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/managedcode/dotnet-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/catalog/Tools/FSharp/skills/fsharp .opencode/skills/fsharp && 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 "fsharp" agent skill from https://github.com/managedcode/dotnet-skills/tree/main/catalog/Tools/FSharp/skills/fsharp into .opencode/skills/fsharp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fsharp", 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.
fsharpWrite, review, or modernize F code in .NET repositories with functional-first design, algebraic data types, pattern matching, pipelines, async workflows, project ordering, and C interop.
Fsharp is an agent skill from managedcode/dotnet-skills. Write, review, or modernize F code in .NET repositories with functional-first design, algebraic data types, pattern matching, pipelines, async workflows, project ordering, and C interop. USE FOR: F .fs/.fsproj code; discriminated unions, records, options, results, pattern matching, computation expressions, or functional domain modeling; strongly typed AI-generated .NET code. DO NOT USE FOR: C language modernization; FSI-only exploratory scripts with no project changes. INVOKES: inspect .fsproj file order and SDK…
Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `manifest.json`). Compatibility notes: Requires a .NET SDK with F support and an F project, script, or interop boundary.
It sits in Development, covering Legacy modernization and Domain-driven design. It works with C# and .NET. The repository describes itself as: Installable .NET skill catalog and CLI for Codex, Claude Code, GitHub Copilot, and Gemini. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 535dd55. 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.
Shell commands in SKILL.md call:
dotnetFrom 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.
Requires a .NET SDK with F# support and an F# project, script, or interop boundary.
From compatibility in the SKILL.md frontmatter.
Fsharp loads about 1.9k tokens when it runs. Until then it costs about 164 tokens; SKILL.md has 605 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 managedcode/dotnet-skills at commit 535dd55, republished under its MIT licence (© managedcode). 605 words, ~1,935 tokens.
.claude/skills/fsharp/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub..fs, .fsx, .fsi, or .fsproj filesmodern-csharpfsiUse the .NET SDK templates when adding F# projects.
dotnet new classlib -lang "F#" -o src/Domain
dotnet new console -lang "F#" -o src/App
dotnet new xunit -lang "F#" -o tests/Domain.Tests
dotnet sln add src/Domain/Domain.fsproj tests/Domain.Tests/Domain.Tests.fsproj
dotnet add tests/Domain.Tests/Domain.Tests.fsproj reference src/Domain/Domain.fsproj
dotnet buildFSharp.Core is normally supplied by the F# SDK project. Add or pin it explicitly only when the repo has a package policy that requires deterministic package versions.
dotnet add src/Domain/Domain.fsproj package FSharp.CoreF# compiles files in the order listed in the project file. Define types and modules before files that consume them.
<ItemGroup>
<Compile Include="Domain.fs" />
<Compile Include="Validation.fs" />
<Compile Include="Program.fs" />
</ItemGroup>When adding a file, update the .fsproj intentionally. Do not assume wildcard ordering.
.fsproj, .fs, .fsi, and .fsx files to determine compile order, public boundaries, and whether the code is F#-first or C#-facing.option for absence, and Result for expected failures..fsproj compile list before consumers reference the new code.Try* patterns when C# callers need a stable surface.dotnet build, targeted tests, and any relevant dotnet fsi probes before returning the final result.fsi for exploratory scripts, but move durable code into ordered .fsproj files before it becomes production behavior.Prefer a type that names every valid state over loose strings, nullable values, or parallel booleans.
module Orders
type OrderId = private OrderId of string
module OrderId =
let tryCreate value =
if System.String.IsNullOrWhiteSpace value then
Error "Order id is required."
else
Ok (OrderId value)
type Payment =
| Card of last4: string
| Wire of iban: string
| PurchaseOrder of number: string
type Order =
{ Id: OrderId
Customer: string
Payment: Payment }
let describePayment payment =
match payment with
| Card last4 -> $"card ending {last4}"
| Wire iban -> $"wire transfer {iban}"
| PurchaseOrder number -> $"purchase order {number}"Return Result<'T,'Error> when callers must handle failure and when failures are part of the domain.
module Pricing
type Price =
private
| Price of decimal
module Price =
let tryCreate amount =
if amount < 0m then
Error "Price cannot be negative."
else
Ok (Price amount)
let value (Price amount) = amount
type Line =
{ Sku: string
Quantity: int
UnitPrice: Price }
let tryCreateLine sku quantity amount =
match Price.tryCreate amount with
| Ok price when quantity > 0 ->
Ok { Sku = sku; Quantity = quantity; UnitPrice = price }
| Ok _ ->
Error "Quantity must be positive."
| Error message ->
Error messageUse pipelines for readable transformations, but stop before the pipeline hides error handling or allocation cost.
open System.IO
let readActiveUsers path =
File.ReadLines path
|> Seq.skip 1
|> Seq.choose (fun line ->
match line.Split(',') with
| [| id; name; "active" |] -> Some {| Id = id; Name = name |}
| _ -> None)
|> Seq.toListMake public interop APIs easy for C# callers. Hide F#-specific details behind functions, methods, or DTO records when needed.
namespace Company.Domain
type InvoiceDto =
{ Id: string
Total: decimal
IsPaid: bool }
module Invoice =
let markPaid invoice =
{ invoice with IsPaid = true }option internally; translate to nullable annotations, Try* methods, or Result at C#-first public boundaries.task { } or Task-returning APIs at .NET interop boundaries; use Async<'T> when the code is F#-first..fsproj compile order matches dependency order.option or Result, not undocumented null.Run the narrowest relevant checks after changes:
dotnet build
dotnet test
dotnet fsi scripts/check.fsxIf adding a new F# file, also inspect the project file diff to confirm the compile order is deliberate.
© managedcode, 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 in catalog/Tools/FSharp/skills/fsharp of managedcode/dotnet-skills.
Open the folder on GitHubat commit 535dd55
Fsharp 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 |
|---|---|---|---|---|---|---|
| Fsharp this skillmanagedcode/dotnet-skills | 486 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Migrate Dotnet8 To Dotnet9dotnet/skills | 5.6k | 2 repos | ~3.9k | Automated safety check: Pass | MIT | |
| Dotnet Csharpnovotnyllc/dotnet-artisan | 233 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Aspire Project V2 MigrationCommunityToolkit/Aspire | 629 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Dynamo Dotnet JanitorDynamoDS/Dynamo | 2k | — | ~682 | Automated safety check: Pass | Apache-2.0 | |
| Modern Csharpcodewithmukesh/dotnet-claude-kit | 751 | 1 repos | ~1.7k | Automated safety check: Pass | MIT |
dotnet/skills
Migrate a .NET 8 project to .NET 9 and resolve all breaking changes.
novotnyllc/dotnet-artisan
Baseline C skill loaded for every .NET code path. An agent skill from novotnyllc/dotnet-artisan.
CommunityToolkit/Aspire
WORKFLOW SKILL - Safely migrates eligible Aspire 13.6+ AppHosts from legacy ProjectResource APIs to experimental DotnetProjectResource APIs after a per-resource assessment and explicit approval of…
DynamoDS/Dynamo
Perform janitorial tasks on C/.NET code including cleanup, modernization, and tech debt remediation.
codewithmukesh/dotnet-claude-kit
Modern C language features for .NET 10 and C 14. An agent skill from codewithmukesh/dotnet-claude-kit.
fmflurry/settings-opencode
Pre-merge code review for .NET 10 pull requests. An agent skill from fmflurry/settings-opencode.
managedcode/dotnet-skills
Use a repo-root .editorconfig to configure free .NET analyzer and style rules.
managedcode/dotnet-skills
Use the open-source free ArchUnitNET library for architecture rules in .NET tests.
managedcode/dotnet-skills
Build, upgrade, and operate Aspire 13.5.x C or TypeScript application hosts with the current CLI, AppHost, ServiceDefaults, integrations, dashboard, testing, MCP, and deployment patterns for…
managedcode/dotnet-skills
Build, debug, modernize, or review ASP.NET Core applications with correct hosting, middleware, security, configuration, logging, and deployment patterns on current .NET.
managedcode/dotnet-skills
Use the open-source free Asynkron.Profiler dotnet tool for CLI-first CPU, allocation, exception, contention, and heap profiling of .NET commands or existing trace artifacts.
managedcode/dotnet-skills
Build, review, or migrate Azure Functions in .NET with correct execution model, isolated worker setup, bindings, DI, and Durable Functions patterns.
Categories
Write, review, or modernize F code in .NET repositories with functional-first design, algebraic data types, pattern matching, pipelines, async workflows, project ordering, and C interop. Fsharp is an agent skill from managedcode/dotnet-skills.NET repositories with functional-first design, algebraic data types, pattern matching, pipelines, async workflows, project ordering, and C interop.
Fsharp fits situations like: : F .fs/.fsproj code; discriminated unions; pattern matching; computation expressions.
Run `npx skills add managedcode/dotnet-skills --skill fsharp -a claude-code`. Or copy the skill folder (catalog/Tools/FSharp/skills/fsharp in managedcode/dotnet-skills) into .claude/skills/fsharp in your project. Claude Code loads it when a task matches its description.
Run `npx skills add managedcode/dotnet-skills --skill fsharp -a codex`. Or copy the skill folder (catalog/Tools/FSharp/skills/fsharp in managedcode/dotnet-skills) into .agents/skills/fsharp 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 managedcode/dotnet-skills --skill fsharp -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fsharp, .gemini/skills/fsharp, .github/skills/fsharp and .opencode/skills/fsharp in your project.
Going by SKILL.md and its folder, Fsharp needs the command-line tools its instructions call (dotnet). Compatibility (from SKILL.md): Requires a .NET SDK with F# support and an F# project, script, or interop boundary..
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.
Fsharp is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.9k tokens (SKILL.md is roughly 7.7k 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 Fsharp: Migrate Dotnet8 To Dotnet9 (dotnet/skills, 5.6k stars), Dotnet Csharp (novotnyllc/dotnet-artisan, 233 stars), Aspire Project V2 Migration (CommunityToolkit/Aspire, 629 stars) and Dynamo Dotnet Janitor (DynamoDS/Dynamo, 2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
managedcode (a GitHub organization) maintains it in managedcode/dotnet-skills, which has 486 GitHub stars. The repository holds 81 skills in this directory. The repository was last updated on October 7, 2026.
Source: managedcode/dotnet-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.