Agent skills
Teach your coding agent to write Waystone.Monads the way it is meant to be written.
Coding agents reach for null checks and try/catch by default, because that is what most of the C# they learned from does. Give an agent this library and it will often write if (option.IsSome) { option.Unwrap(); } — code that compiles, passes review at a glance, and throws away everything you adopted the library for.
The waystone-monads skill fixes that. It is a document the agent loads when it notices you are writing Option<T> or Result<TOk, TErr>, and it teaches the composition style, the traps, and the analyzer rules that catch them.
You do not need it to use the NuGet package. Install it if you want an agent to write idiomatic code without being told how every time.
Install it
Pick whichever suits the agent you use.
As a Claude Code plugin
Run both commands inside Claude Code:
/plugin marketplace add draekien-industries/waystone-dotnet
/plugin install waystone-dotnet@waystone-dotnetThe plugin name and the marketplace name are both waystone-dotnet, which is why it appears twice. Installing the plugin gets you the skill plus anything else the plugin gains later.
As a standalone skill
Use npx skills if you use a different agent, or if you want the skill without the plugin:
npx skills add draekien-industries/waystone-dotnet --skill waystone-monadsThat installs into the current project. Add -g to install it for every project instead. Run the same command with --list and no --skill to see everything the repository offers.
What it teaches
The skill is built from this library's own analyzer rules and sample project rather than from general advice about monads. It covers:
Composition
Chain Map, AndThen, Filter and OrElse; collapse once at the end
Traps
Nested Match, IsSome guarding an Unwrap, null on a monad, a discarded Result
Choosing a type
When absence is an Option, when failure is a Result, and when to throw instead
Nesting
What Result<Option<T>, E> means, and how Transpose moves between the two shapes
Async
Keeping a chain intact across an await rather than breaking it into locals
Error codes
Building failures through the generated {EnumName}Catalog.Errors factories
Rust habits
Which reflexes carry over, and which ones hurt in shipped C#
You do not invoke it. The agent loads it when the work matches, so it applies to code you ask for in passing as much as to a task you set up deliberately.
It does not replace the analyzer
The skill and the analyzer solve two halves of one problem, and you want both.
The skill shapes what an agent writes. It has no way to check the result.
The analyzer checks what anyone wrote, whether an agent or a person. It cannot write anything.
An agent following the skill still produces code the analyzer reports, and a clean build is the bar. See Analyzers for what each rule means.
Last updated
Was this helpful?