From dotnet-skills
Choose the right .NET project shape before implementation, including F# versus C# language choice, solution layout, validation commands, package boundaries, and documentation updates.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dotnet-skills:choose-project-shapeThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Pick the smallest correct .NET project shape before code changes begin.
Pick the smallest correct .NET project shape before code changes begin.
The practical decision is what kind of project the user needs, whether F# or C# is the better fit, how many projects belong in the solution, which validation commands should prove the work, and where package or application boundaries should sit.
Use repo-local .NET files, checked-out dependency sources, Dash MCP or Dash HTTP for installed .NET docsets, and then official Microsoft documentation when Dash/local coverage is missing or stale. Check one of those source-specific paths before making claims about SDK, CLI, language, or project behavior:
global.json documentationdotnet new documentationdotnet test documentationTranslate any documentation rule into the concrete repository decision it changes.
.sln or .slnxglobal.jsonDirectory.Build.propsDirectory.Packages.props.fsproj.csprojdotnet restore when dependency or SDK resolution is part of the taskdotnet build for compile and analyzer checksdotnet test for behaviordotnet pack for package surfacesUse a single app project plus a test project when behavior is non-trivial.
For F#, prefer small modules, explicit domain types, and pure transformations where practical. For C#, prefer nullable-aware models, clear service boundaries, and async APIs only where work is truly asynchronous.
Handoff:
dotnet:bootstrap-solution for new project creationdotnet:build-fsharp-project for F# implementationdotnet:build-csharp-project for C# implementationdotnet:testing-workflow for testsUse a library project plus a test project. Add package metadata only when the library is intended to be packed or published.
For F#, shape the public API around clear functions and domain types. For C#, shape the public API around nullable-aware types, interfaces only where they have real callers, and explicit async contracts.
Handoff:
dotnet:package-workflow when package validation or NuGet metadata mattersdotnet:testing-workflow for test execution and failure triageUse ASP.NET Core guidance only after the core solution, language, and test shape is clear. Keep the first decision focused on project ownership, configuration, tests, and whether the service belongs in an existing solution.
Handoff:
dotnet:aspnet-core-service-workflow for service-specific guidancedotnet:bootstrap-solution for scaffold guidanceUse mixed language projects only when the boundary is useful enough to explain.
Good reasons include an F# domain/modeling library consumed by a C# host, or a C# app surface that needs to stay close to an existing ecosystem while F# owns the domain transformations.
Avoid mixed solutions when the only reason is uncertainty. Ask for the language decision instead.
Return:
Chosen shape: console app, library package, test project, ASP.NET Core service, worker service, multi-project solution, mixed F#/C# solution, or maintenance pass.Language decision: F#, C#, mixed, or user decision needed.Project layout: projects, references, and package boundaries.Validation path: exact restore, build, test, or pack commands.Documentation updates: README, roadmap, package notes, or repo-local guidance.Next skill: the next .NET skill to use.npx claudepluginhub gaelic-ghost/socket --plugin dotnet-skillsCreates, edits, and verifies skills using a test-driven development approach with pressure scenarios and subagents.