Skip to content
Development
Skill

/fsi

Use F# Interactive (`dotnet fsi`) for .NET exploration, scriptable experiments, package-backed .fsx workflows, quick data transforms, and reproducible command-line probes. USE FOR: .fsx scripts, F# REPL work, #r nuget references, #load composition, interactive type exploration,

From plugin
dotnet-skills
499200 skills17 agents

Claude Code

$ npx -y skills add managedcode/dotnet-skills --skill fsi --agent claude-code

SKILL.md

fsi.SKILL.md
name: fsi
description: "Use F# Interactive (`dotnet fsi`) for .NET exploration, scriptable experiments, package-backed .fsx workflows, quick data transforms, and reproducible command-line probes. USE FOR: .fsx scripts, F# REPL work, #r nuget references, #load composition, interactive type exploration, and small strongly typed experiments before moving code into a project. DO NOT USE FOR: production application code that needs compiled project structure; C# scripting; long-lived automation better expressed as a normal CLI, test, or build target. INVOKES: run dotnet fsi, edit .fsx scripts, load project or source files, and validate snippets against the target SDK."
compatibility: "Requires a .NET SDK with `dotnet fsi`; NuGet-backed scripts may need package restore and trusted package sources."

F# Interactive

Trigger On

  • the task asks for F# Interactive, FSI, `.fsx`, or `dotnet fsi`
  • a quick typed experiment is needed before changing compiled project code
  • a script should reference NuGet packages directly with `#r "nuget: ..."`
  • an investigation needs quick access to F# type inference, pattern matching, or pipelines
  • a repeatable one-file probe is better than a temporary project

Do Not Use For

  • long-lived application code that needs a compiled `.fsproj`
  • production automation that should be versioned as a CLI, test project, or build target
  • C# script work
  • package restore from untrusted sources

Quick Start

Run an interactive REPL:

dotnet fsi

Run a script:

dotnet fsi scripts/check.fsx

Create a Unix executable script when that fits the repo:

#!/usr/bin/env -S dotnet fsi

printfn "Hello from FSI"
chmod +x scripts/check.fsx
./scripts/check.fsx

On Windows, run scripts with `dotnet fsi scripts/check.fsx`.

Workflow

1. Decide whether the request is a disposable REPL probe, a repeatable `.fsx` script, or code that should be promoted to a compiled F# project. 2. Put repeatable work in an `.fsx` file immediately. Add all required `#r`, `#load`, `open`, input path, and package source directives to the script instead of relying on hidden REPL state. 3. Keep package references pinned when the script should be reproducible, and use only trusted NuGet feeds or local feeds derived from `__SOURCE_DIRECTORY__`. 4. Run the script with `dotnet fsi` from a clean shell, passing the same arguments the user or CI will use. 5. Promote the script to an `.fsproj` when it needs tests, distribution, project references, or long-term CI coverage.

Current Upstream Notes

  • The September 2026 F# Interactive reference keeps `dotnet fsi` as the supported command-line entry point for interactive sessions and `.fsx` scripts; it does not turn hidden REPL state into a reproducible workflow.
  • Use repeatable `.fsx` files with explicit `#r "nuget: ..."` and `#load` directives once an experiment affects a repository task; do not rely on hidden REPL state.

Interactive Session Rules

  • End REPL submissions with `;;`.
  • Multi-line input is allowed; FSI evaluates when it receives `;;`.
  • Previously evaluated values stay in the session, so do not rely on hidden session state in scripts.
  • Use `.fsx` files for repeatability once an experiment matters.
let square x = x * x;;

[ 1 .. 5 ] |> List.map square;;

Script Patterns

Read And Summarize Text

Use ordinary .NET APIs directly from F# scripts.

open System
open System.IO

let summarize path =
    File.ReadLines path
    |> Seq.filter (String.IsNullOrWhiteSpace >> not)
    |> Seq.countBy (fun line -> line.Split(' ')[0])
    |> Seq.sortByDescending snd
    |> Seq.truncate 10
    |> Seq.toList

for key, count in summarize "input.log" do
    printfn $"{key}: {count}"

Write A Checked Output File

Keep script outputs deterministic and fail early when required inputs are missing.

open System
open System.IO

let input = "data/items.txt"
let output = "artifacts/items.normalized.txt"

if not (File.Exists input) then
    failwith $"Missing input file: {input}"

Directory.CreateDirectory(Path.GetDirectoryName output) |> ignore

File.ReadLines input
|> Seq.map (fun line -> line.Trim())
|> Seq.filter (String.IsNullOrWhiteSpace >> not)
|> Seq.distinct
|> Seq.sort
|> fun lines -> File.WriteAllLines(output, lines)

Reference NuGet Packages

Pin package versions for repeatable scripts. Only use package sources the repo trusts.

#r "nuget: Newtonsoft.Json, 13.0.3"

open Newtonsoft.Json

let payload = {| Name = "Ada"; Kind = "sample" |}
let json = JsonConvert.SerializeObject(payload)

printfn $"{json}"

FSI does not use referenced package build targets during restore by default. Enable them only when a trusted package requires them; pin the version and test from a fresh process:

#r "nuget: FSharp.Data, 6.6.0, usepackagetargets=true"

Keep `usepackagetargets=false` or omit the option for ordinary references. This controls package restore behavior; it does not turn an `.fsx` script into a compiled project.

Use `#i` only when an additional feed is required. Local feed paths must be absolute; construct them from `__SOURCE_DIRECTORY__` instead of committing personal paths.

let localFeed =
    System.IO.Path.Combine(__SOURCE_DIRECTORY__, "../artifacts/packages")
    |> System.IO.Path.GetFullPath

#i $"nuget: {localFeed}"

Split Scripts With Load

`#load` evaluates another script and exposes it through the generated module name.

// MathHelpers.fsx
let square x = x * x
// Check.fsx
#load "MathHelpers.fsx"
open MathHelpers

printfn $"%d{square 12}"

Promote To A Project

Move from FSI to a compiled project when:

  • the script has multiple dependencies, tests, or distribution needs
  • startup time or restore behavior matters
  • C# or other .NET callers need a stable assembly
  • the code needs CI coverage beyond a smoke run

Start with:

dotnet new console -lang "F#" -
Read more
@managedcode
Ships withdotnet-skills

Stop explaining .NET to your AI. Start building. We've all been there: asking Claude to use Entity Framework, only to get EF6 patterns in a .NET 8 project. Explaining to Copilot that Blazor Server and Blazor WebAssembly aren't the same thing.

499200 skills17 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
499
Star history of managedcode/dotnet-skills on GitHub, a chart by star-history.com

Other skills on dotnet-skills.

aspnet-core

aspnet-core

Build, debug, modernize, or review ASP.NET Core applications with correct hosting, middleware, security, configuration, logging,…

aspire

aspire

Build, upgrade, and operate Aspire 13.5.x C# or TypeScript application hosts with the current CLI, AppHost, ServiceDefaults,…

avalonia

avalonia

Build and debug Avalonia 11/12 .NET applications with XAML, compiled bindings, MVVM, custom controls, desktop lifetimes, and…

azure-functions

azure-functions

Build, review, or migrate Azure Functions in .NET with correct execution model, isolated worker setup, bindings, DI, and Durable…

blazor

blazor

Build and review Blazor applications across server, WebAssembly, web app, and hybrid scenarios with correct component design,…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about fsi.

Which coding agents can use fsi?
fsi installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.