AI-assisted project type detection for .NET projects (microservice and generic architectures)
From dotnet-ai-kitnpx claudepluginhub faysilalshareef/dotnet-ai-kit --plugin dotnet-ai-kitThis skill uses the workspace's default tool permissions.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Executes pre-written implementation plans: critically reviews, follows bite-sized steps exactly, runs verifications, tracks progress with checkpoints, uses git worktrees, stops on blockers.
You are analyzing a .NET project to determine its architectural type using behavioral analysis.
You will receive:
Read the following files to build a picture of the project:
Program.cs or Startup.cs — startup configuration*.csproj — NuGet packages, target framework, SDK type*.sln or *.slnx — solution structure**/Application/**/Handlers/**/*.cs or **/Features/**/*Handler.cs**/Controllers/**/*.cs**/Services/**/*Service.cs**/Domain/**/Aggregate*.cs or **/Domain/**/Core/*.cs**/Endpoints/**/*.cs or **/Modules/**/*.csFeatures/ directory — VSA indicatorDomain/, Application/, Infrastructure/ directories — Clean Architecture indicatorBoundedContexts/ or Contexts/ directory — DDD indicatorModules/ directory — Modular Monolith indicatorControllers/ directory — traditional MVC/APIListeners/ or ServiceBus/ directory — event-driven*.razor files — Blazor UIFor each handler/service file, analyze:
IRequestHandler<CreateOrderCommand>)IRequestHandler<Event<OrderCreatedData>, bool>)[HttpGet], [HttpPost], etc.app.MapGet(), app.MapPost(), endpoint definitionsSaveChangesAsync, AddAsync, repository Add/UpdateThese types are for projects following a CQRS/event-sourced microservice architecture:
| Type | IN | INSIDE | OUT |
|---|---|---|---|
| command | Commands | Load aggregate -> domain method -> commit events | void/Task |
| query-sql | Events | Save to SQL database | bool (ack) |
| query-cosmos | Events | Save to Cosmos DB | bool (ack) |
| processor | Events | Call other gRPC services OR publish to message bus | bool (ack) |
| gateway | HTTP requests | Forward to gRPC services | HTTP responses |
| controlpanel | Browser requests | Blazor components render UI | HTML/Blazor |
| hybrid | Commands AND Events | Both domain manipulation AND DB save | Mixed |
These types are for projects following common .NET architectural patterns outside CQRS microservices:
| Type | Key Indicators | Structure | Typical Patterns |
|---|---|---|---|
| vsa | Features/ directory with self-contained slices | Each feature folder contains handler, validator, model, endpoint | MediatR handlers per feature, minimal cross-feature dependencies |
| clean-arch | 3+ layers: Domain, Application, Infrastructure | Separate projects per layer, dependency inversion | Use cases in Application, entities in Domain, repos in Infrastructure |
| ddd | BoundedContexts/ or Contexts/ directory | Bounded contexts with internal layering | Aggregates, value objects, domain events, anti-corruption layers |
| modular-monolith | Modules/ directory with independent modules | Each module has its own API, domain, infrastructure | Module-to-module communication via contracts/events |
| generic | None of the above patterns match | Varies — could be simple API, console app, library | Standard .NET project without strong architectural pattern |
Structure signals:
Features/ or Slices/ directory at project rootApplication/, Domain/, Infrastructure/ top-level layersCode signals:
IRequestHandler<TRequest, TResponse> per featureIValidator<T> paired with handlers in same folderNuGet signals:
MediatR, FluentValidation, Carter or FastEndpointsStructure signals:
*.Domain, *.Application, *.Infrastructure, *.Api (or *.Web, *.Presentation)Code signals:
IRepository<T>, IUnitOfWork)NuGet signals:
MediatR.Contracts only)EntityFrameworkCore, Dapper, provider packagesStructure signals:
BoundedContexts/ or Contexts/ directorySharedKernel/ or BuildingBlocks/ directory for cross-cutting concernsAntiCorruption/ or ACL/ directoriesCode signals:
AggregateRoot or Entity base classes in domainIDomainEvent, DomainEvent)NuGet signals:
Structure signals:
Modules/ directory with independent module directoriesApi/, Core/ (or Domain/), Infrastructure/Contracts/ or IntegrationEvents/ for inter-module communicationInfrastructure/ or Common/ at root levelCode signals:
AddModule<OrderModule>() pattern)NuGet signals:
Use generic when:
Apply rules in order — first match wins:
.razor files exist → controlpanelFeatures/ directory with self-contained feature handlers → vsaBoundedContexts/ or Contexts/ directory with aggregate roots → dddModules/ directory with independent module structure → modular-monolithCRITICAL: project_type is the SPECIFIC type (command, query-sql, vsa, etc.). mode is ALWAYS microservice or generic. Never swap these.
project_type: {command|query-sql|query-cosmos|processor|gateway|controlpanel|hybrid|vsa|clean-arch|ddd|modular-monolith|generic}
mode: {microservice|generic}
confidence: {high|medium|low}
dotnet_version: "{version from csproj TargetFramework}"
architecture: "{human-readable description}"
namespace_format: "{detected namespace pattern}"
evidence:
1. {most important behavioral evidence}
2. {second most important evidence}
3. {third most important evidence}
reasoning: "{1-2 sentences explaining the data flow that led to this classification}"
packages:
- {key NuGet packages detected}
solution_name: "{solution name without extension, from .sln/.slnx file}"
layers:
domain: "{Domain project name or empty}"
application: "{Application project name or empty}"
infrastructure: "{Infrastructure project name or empty}"
presentation: "{Presentation project name or empty}"
api_style: "{grpc|rest|blazor|minimal-api|none}"
patterns:
- "{architectural patterns detected, e.g. cqrs-command-side, event-sourcing, outbox-pattern}"
deployment:
containerized: {true if Dockerfile exists, else false}
orchestration: "{kubernetes if k8s manifests, docker-compose if compose file, else empty}"
test_projects:
- "{test project names from solution}"
sibling_repos:
- name: "{sibling repo directory name}"
type: "{detected type or empty}"
.sln/.slnx filename (strip extension)Grpc.AspNetCore → grpc, Microsoft.AspNetCore.Mvc or controllers → rest, .razor files → blazor, app.MapGet/app.MapPost without controllers → minimal-api../ that are git repos with .NET projects — classify by quick structural scan