Using Dotnet
novotnyllc/dotnet-artisan
Detects .NET intent for any C, ASP.NET Core, EF Core, Blazor, MAUI, Uno Platform, WPF, WinUI, SignalR, gRPC, xUnit, NuGet, or MSBuild request from prompt keywords and repository signals (.sln…
C/.NET coding rules: style, patterns, security, testing. An agent skill from softspark/ai-toolkit.
$ npx skills add softspark/ai-toolkit --skill csharp-rules -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install softspark/ai-toolkit csharp-rules --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/softspark/ai-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/app/skills/csharp-rules .claude/skills/csharp-rules && 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 "csharp-rules" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/csharp-rules into .claude/skills/csharp-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "csharp-rules", 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/softspark/ai-toolkit/tree/main/app/skills/csharp-rulesType 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 softspark/ai-toolkit --skill csharp-rules -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install softspark/ai-toolkit csharp-rules --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/app/skills/csharp-rules .agents/skills/csharp-rules && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "csharp-rules" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/csharp-rules into .agents/skills/csharp-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "csharp-rules", 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 softspark/ai-toolkit --skill csharp-rules -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install softspark/ai-toolkit csharp-rules --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/app/skills/csharp-rules .cursor/skills/csharp-rules && 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 "csharp-rules" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/csharp-rules into .cursor/skills/csharp-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "csharp-rules", 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/softspark/ai-toolkit.git --path app/skills/csharp-rules--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 softspark/ai-toolkit --skill csharp-rules -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install softspark/ai-toolkit csharp-rules --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/app/skills/csharp-rules .gemini/skills/csharp-rules && 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 "csharp-rules" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/csharp-rules into .gemini/skills/csharp-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "csharp-rules", 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 softspark/ai-toolkit csharp-rulesInstalls 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 softspark/ai-toolkit --skill csharp-rules -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/app/skills/csharp-rules .github/skills/csharp-rules && 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 "csharp-rules" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/csharp-rules into .github/skills/csharp-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "csharp-rules", 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 softspark/ai-toolkit --skill csharp-rules -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install softspark/ai-toolkit csharp-rules --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/softspark/ai-toolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/app/skills/csharp-rules .opencode/skills/csharp-rules && 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 "csharp-rules" agent skill from https://github.com/softspark/ai-toolkit/tree/main/app/skills/csharp-rules into .opencode/skills/csharp-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "csharp-rules", 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.
csharp-rulesC/.NET coding rules: style, patterns, security, testing. An agent skill from softspark/ai-toolkit.
Csharp Rules is an agent skill from softspark/ai-toolkit. C/.NET coding rules: style, patterns, security, testing. Triggers: .cs, .csproj, .sln, ASP.NET, ASP.NET Core, EF Core, LINQ, NUnit, xUnit, dotnet.
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Unit testing. It works with C#, ASP.NET Core and .NET. The repository describes itself as: Professional-grade AI coding toolkit: 94 skills, 44 agents, multi-platform (Claude, Cursor, Windsurf, Copilot, Gemini, Cline, Roo Code, Aider, Augment, Antigravity, Codex CLI… The licence is Apache-2.0.
Read from SKILL.md and the folder at commit d64db2b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadFrom 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.
No URLs in SKILL.md.
From 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.
Csharp Rules loads about 3.5k tokens when it runs. Until then it costs about 40 tokens; SKILL.md has 1,566 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 softspark/ai-toolkit at commit d64db2b, republished under its Apache-2.0 licence (© softspark). 1,566 words, ~3,474 tokens.
.claude/skills/csharp-rules/SKILL.md (or your agent's skills folder).These rules come from app/rules/csharp/ in ai-toolkit. They cover
the project's standards for coding style, frameworks, patterns,
security, and testing in C#/.NET. Apply them when writing or
reviewing C#/.NET code.
I: IUserRepository, IDisposable._: private readonly ILogger _logger;.<Nullable>enable</Nullable> in all projects.string? only when null is semantically meaningful.! (null-forgiving) operator sparingly -- only when compiler cannot infer.?? (null-coalescing) and ?. (null-conditional) for safe navigation.required modifier (C# 11) on properties that must be set at initialization.record for immutable value objects and DTOs.record struct for small, stack-allocated value types.init properties for immutable-after-construction objects.with expressions for non-destructive mutation of records.is pattern for type checks: if (obj is string s).switch expressions for exhaustive matching over enums/types.user is { Age: > 18, Role: "admin" }.size is > 0 and < 100.numbers is [1, 2, .., var last].Async: GetUserAsync().Task<T> or ValueTask<T>, never void (except event handlers).await with ConfigureAwait(false) in library code.CancellationToken parameters in all async public APIs.ValueTask<T> when synchronous completion is common.namespace MyApp.Services;.global using directives in a single GlobalUsings.cs file..editorconfig with C# style rules committed to the repository.dotnet format for automated formatting.[ApiController] attribute for automatic model validation and error responses.Results.Ok(), Results.NotFound() for typed HTTP results.IHostedService / BackgroundService for long-running background tasks.app.MapGet(), app.MapPost() for minimal API style.dotnet ef migrations add, dotnet ef database update.DbContext with scoped lifetime (one per request).AsNoTracking() for read-only queries. Use AsTracking() only for updates.Include() / ThenInclude() for eager loading related entities.CreatedAt, UpdatedAt).HasQueryFilter() for soft-delete and multi-tenancy global filters.@inject for dependency injection in components.EventCallback<T> for parent-child component communication.CascadingValue for deeply shared state (theme, auth).StateContainer pattern with events for cross-component state management.Hub<IClientMethods> for compile-time safety.HubContext<T> for sending messages from outside hubs.Groups.AddToGroupAsync().record types for immutability.IConsumer<T>) for message handling.ILogger<T> via DI. Never instantiate loggers manually._logger.LogInformation("User {UserId} logged in", userId).using (_logger.BeginScope(...)).appsettings.json + environment-specific overrides + environment variables.IOptions<T>.IOptionsMonitor<T> for configuration that changes at runtime.ValidateDataAnnotations().app.MapHealthChecks("/health") for liveness probes.AspNetCore.HealthChecks.* NuGet packages for common checks.Result<T> pattern for expected failures.class DomainException : Exception.when clause in catch: catch (HttpRequestException e) when (e.StatusCode == 404).ExceptionDispatchInfo.Capture(e).Throw() to preserve original stack trace.Result<T, Error> types for operations with expected failure modes.Task.WhenAll() for concurrent independent operations.SemaphoreSlim for async-compatible resource limiting.Channel<T> for async producer-consumer patterns.IAsyncEnumerable<T> for streaming data from async sources.Polly for retry, circuit breaker, and timeout policies..Result or .Wait() on tasks (deadlock risk). Always await.Program.cs or IServiceCollection extension methods.Scoped for request-lifetime services, Singleton for stateless, Transient for lightweight.IOptions<T> pattern for configuration injection.ValidateOnBuild = true.FirstOrDefault() over First() for safe access.AsNoTracking() for read-only EF Core queries (performance).IQueryable<T> until final projection.Select() to project only needed columns from database queries.IAsyncDisposable for async cleanup.await using var resource = ...; for deterministic async disposal.IDisposable with using declaration (C# 8) for scope-based cleanup.IRequest<Result> for mutations. Queries: IRequest<T> for reads.record types for value objects with structural equality.public static Result<Email> Create(string value).ToString() for logging-friendly representations.async void: use only for event handlers. Everything else returns Task.try-catch: flatten with early returns or guard clauses.[Required], [StringLength], [Range]) on request models.[ApiController] for automatic 400 responses on validation failure.FromSqlInterpolated() over FromSqlRaw() for raw SQL (auto-parameterized).context.Database.ExecuteSqlInterpolatedAsync().FromSqlRaw() calls for parameter interpolation risks.@param syntax in SQL strings.AddAuthentication().AddJwtBearer() for JWT-based API auth.[Authorize] attribute globally. Use [AllowAnonymous] selectively.app.UseHttpsRedirection().[Authorize(Policy = "AdminOnly")].IAuthorizationHandler for custom authorization logic.[Authorize] at controller/app level, opt out per endpoint.@Html.Raw() with user data.Content-Security-Policy headers to restrict script sources.SameSite=Strict on cookies for CSRF mitigation.AllowAnyOrigin() with credentials.IDataProtectionProvider for symmetric encryption of sensitive data.SecureString or ProtectedData for in-memory sensitive data (limited use).PasswordHasher<T> (PBKDF2 with salt).dotnet user-secrets for local development. Use Azure Key Vault for production.IConfiguration with environment variable providers. Never hardcode secrets.[SensitiveData] attributes to exclude fields from logging and serialization.dotnet list package --vulnerable to check for known CVEs.Microsoft.AspNetCore.* packages promptly for security patches.FooTests.cs in a separate *.Tests project.*.IntegrationTests project.[Collection("Database")] for shared fixtures across test classes.[Fact] for single test cases. Use [Theory] for parameterized tests.[InlineData] or [MemberData] for test data in theories.IClassFixture<T> for shared setup.MethodName_Scenario_ExpectedResult.result.Should().Be(expected) for value assertions.action.Should().Throw<InvalidOperationException>() for exception testing.collection.Should().ContainSingle(x => x.Id == 1) for collection assertions.result.Should().BeEquivalentTo(expected) for deep object comparison.execution.Should().CompleteWithinAsync(5.Seconds()) for timeout assertions.var repo = Substitute.For<IUserRepository>().repo.GetAsync(1).Returns(user).repo.Received(1).SaveAsync(Arg.Any<User>()).Arg.Is<T>(predicate) for argument matching.ReturnsForAnyArgs() for lenient stubs in arrangement-focused tests.WebApplicationFactory<Program> for ASP.NET Core integration tests.WithWebHostBuilder(b => b.ConfigureServices(...)).HttpClient from factory for endpoint testing.Respawn for database cleanup between tests.[Collection] attribute to prevent parallel execution of shared-resource tests.new UserBuilder().WithName("Ada").Build().AutoFixture for auto-generated test data.Bogus library for realistic fake data generation.CancellationToken.None explicitly in async test calls.dotnet test --blame-hang-timeout 60s.© softspark, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in app/skills/csharp-rules of softspark/ai-toolkit.
Open the folder on GitHubat commit d64db2b
Csharp Rules 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 |
|---|---|---|---|---|---|---|
| Csharp Rules this skillsoftspark/ai-toolkit | 179 | — | ~3.5k | Automated safety check: Pass | Apache-2.0 | |
| Using Dotnetnovotnyllc/dotnet-artisan | 233 | — | ~2.3k | Automated safety check: Warn | MIT | |
| Csharp ConventionsGoldziher/ai-rulez | 153 | — | ~363 | Automated safety check: Pass | MIT | |
| ScottPlot Test RunnerScottPlot/ScottPlot | 6.8k | — | ~308 | Automated safety check: Pass | MIT | |
| Aspire Integration TestingDevBetterCom/DevBetterWeb | 157 | 2 repos | ~2.3k | Automated safety check: Pass | None | |
| Akka.NET Testing PatternsAaronontheweb/dotnet-skills | 1.2k | 1 repos | ~2.4k | Automated safety check: Pass | MIT |
novotnyllc/dotnet-artisan
Detects .NET intent for any C, ASP.NET Core, EF Core, Blazor, MAUI, Uno Platform, WPF, WinUI, SignalR, gRPC, xUnit, NuGet, or MSBuild request from prompt keywords and repository signals (.sln…
Goldziher/ai-rulez
C code conventions covering .NET 8+/C 12, nullable reference types, Roslyn analyzers, xUnit, record types, async/await discipline, and dependency security.
ScottPlot/ScottPlot
Run or add ScottPlot 5 tests. Use for unit-test and cookbook-test work; unless explicitly asked otherwise, restrict manual test execution to the Unit Tests…
DevBetterCom/DevBetterWeb
Write integration tests using .NET Aspire's testing facilities with xUnit.
Aaronontheweb/dotnet-skills
Shows how to test Akka.NET actors with Akka.Hosting.TestKit: swapping services for fakes, using TestProbes, and checking persistence, plus when the older TestKit still fits.
valdisiljuconoks/LocalizationProvider
Build the solution and run unit tests to verify changes are correct.
softspark/ai-toolkit
Prepare or verify a project QA environment with source identity, readiness, browser access, evidence paths and owned cleanup.
softspark/ai-toolkit
Accessibility validator: WCAG 2.1 AA, EN 301 549, EAA. An agent skill from softspark/ai-toolkit.
softspark/ai-toolkit
Analyzes code quality, complexity, patterns across codebase.
softspark/ai-toolkit
Drives a brief, specification, issue or existing PR through implementation, review, tests and QA to a ready PR.
softspark/ai-toolkit
Direct technical voice for docs, README, user-facing text. An agent skill from softspark/ai-toolkit.
softspark/ai-toolkit
Detect/generate/debug CI pipeline config (GitHub Actions, GitLab CI).
Works with
Categories
C/.NET coding rules: style, patterns, security, testing. An agent skill from softspark/ai-toolkit. Csharp Rules is an agent skill from softspark/ai-toolkit.NET coding rules: style, patterns, security, testing.
Csharp Rules fits situations like: tasks that involve Unit testing.
Run `npx skills add softspark/ai-toolkit --skill csharp-rules -a claude-code`. Or copy the skill folder (app/skills/csharp-rules in softspark/ai-toolkit) into .claude/skills/csharp-rules in your project. Claude Code loads it when a task matches its description.
Run `npx skills add softspark/ai-toolkit --skill csharp-rules -a codex`. Or copy the skill folder (app/skills/csharp-rules in softspark/ai-toolkit) into .agents/skills/csharp-rules 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 softspark/ai-toolkit --skill csharp-rules -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/csharp-rules, .gemini/skills/csharp-rules, .github/skills/csharp-rules and .opencode/skills/csharp-rules in your project.
Going by SKILL.md and its folder, Csharp Rules needs the command-line tools its instructions call (dotnet). Its frontmatter pre-approves these tools: Read.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Csharp Rules is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k 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 Csharp Rules: Using Dotnet (novotnyllc/dotnet-artisan, 233 stars), Csharp Conventions (Goldziher/ai-rulez, 153 stars), ScottPlot Test Runner (ScottPlot/ScottPlot, 6.8k stars) and Aspire Integration Testing (DevBetterCom/DevBetterWeb, 157 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
softspark (a GitHub user) maintains it in softspark/ai-toolkit, which has 179 GitHub stars. The repository holds 112 skills in this directory. The repository was last updated on October 7, 2026.
Source: softspark/ai-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.