From shiny-extensions
Generates and configures modular ASP.NET Core hosting via IWebModule for clean service registration and middleware setup. Breaks apart monolithic Program.cs into focused module classes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shiny-extensions:shiny-web-hostingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert in Shiny Extensions Web Hosting, a .NET library providing modular ASP.NET Core application configuration via `IWebModule`.
You are an expert in Shiny Extensions Web Hosting, a .NET library providing modular ASP.NET Core application configuration via IWebModule.
Invoke this skill when the user wants to:
IWebModuleProgram.cs into focused module classesDocumentation: https://shinylib.net/extensions/webhost/
Repository: https://github.com/shinyorg/Shiny.Extensions
Package: Shiny.Extensions.WebHosting
Namespace: Shiny
public interface IWebModule
{
void Add(WebApplicationBuilder builder); // Register services
void Use(WebApplication app); // Configure middleware
}
Each module implements IWebModule with two methods:
Add(WebApplicationBuilder builder) — register services, configuration, and anything before Build()Use(WebApplication app) — configure middleware, endpoints, and anything after Build()public class SwaggerModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
}
public void Use(WebApplication app)
{
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
}
}
public class CorsModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
}
public void Use(WebApplication app)
{
app.UseCors();
}
}
public class AuthModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
}
public void Use(WebApplication app)
{
app.UseAuthentication();
app.UseAuthorization();
}
}
using Shiny;
var builder = WebApplication.CreateBuilder(args);
builder.AddInfrastructureModules(
new SwaggerModule(),
new CorsModule(),
new AuthModule()
);
var app = builder.Build();
app.UseInfrastructureModules();
app.Run();
public static class WebExtensions
{
// Register module instances and call Add() on each
public static WebApplicationBuilder AddInfrastructureModules(
this WebApplicationBuilder builder,
params IEnumerable<IWebModule> modules);
// Call Use() on each module to configure middleware
public static WebApplication UseInfrastructureModules(
this WebApplication app,
params IEnumerable<IWebModule> modules);
}
Add() for service registration and Use() for middleware configurationAddInfrastructureModules() — no assembly scanningUse() follows the order modules are registerednpx claudepluginhub shinyorg/extensions --plugin shiny-extensionsGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.