Quickly scaffold new business domains with proper database and permission configurations.

Install

mkdir -p .claude/skills/add-module && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/3443" && unzip -o skill.zip -d .claude/skills/add-module && rm skill.zip

Installs to .claude/skills/add-module

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Create a new module (bounded context) — runtime + Contracts projects, IModule, DbContext, permissions, migrations, and the four registration sites. Use when adding a distinct business domain. For a feature in an existing module, use add-feature.
245 chars✓ has a “when” trigger
Advanced

Key capabilities

  • Scaffold project structure for new modules
  • Register modules in required system locations
  • Configure DbContext and permissions
  • Generate initial migrations

How it works

The skill creates a new bounded context by scaffolding projects, setting up assembly attributes, and requiring registration in four specific system locations.

Inputs & outputs

You give it
Module name
You get back
Scaffolded module projects and registration code

When to use add-module

  • Adding a new business domain module
  • Scaffolding entities and endpoints for a new feature
  • Registering a new module in the project context

About this skill

Add Module

High-ceremony. The part people get wrong is registration — a module must be wired in FOUR places (see Step 6). Architecture rules: .agents/rules/architecture.md.

Projects

src/Modules/{Name}/
├── Modules.{Name}/            ← runtime (internal): Domain/, Data/, Features/v1/, {Name}Module.cs
└── Modules.{Name}.Contracts/  ← public API: v1/ (commands/queries), Dtos/, Authorization/, Events/

Copy an existing module's two .csproj files (e.g. Modules.Catalog) and rename — don't hand-write project references. The runtime project references its Contracts project + the BuildingBlocks it needs; the Contracts project references Mediator + shared contracts.

Step 1 — [FshModule] is an ASSEMBLY attribute (not class-level)

In {Name}Module.cs, above the namespace:

[assembly: FshModule(typeof(FSH.Modules.{Name}.{Name}Module), 900)]   // (Type, order)

namespace FSH.Modules.{Name};

public sealed class {Name}Module : IModule
{
    public void ConfigureServices(IHostApplicationBuilder builder)
    {
        ArgumentNullException.ThrowIfNull(builder);
        PermissionConstants.Register({Name}Permissions.All);
        builder.Services.AddHeroDbContext<{Name}DbContext>();
        builder.Services.AddScoped<IDbInitializer, {Name}DbInitializer>();

        // Only if the module HANDLES integration events:
        // builder.Services.AddIntegrationEventHandlers(typeof({Name}Module).Assembly);
        //
        // Publishing needs no registration at all — the outbox is framework-owned
        // (host calls AddEventingCore once). Inject IOutboxWriter and publish.
        // Never register a per-module outbox store; see .agents/rules/eventing.md.

        builder.Services.AddHealthChecks()
            .AddDbContextCheck<{Name}DbContext>(name: "db:{name}");
    }

    public void ConfigureMiddleware(IApplicationBuilder app) { }   // optional, runs after auth

    public void MapEndpoints(IEndpointRouteBuilder endpoints)
    {
        ArgumentNullException.ThrowIfNull(endpoints);
        var versionSet = endpoints.NewApiVersionSet().HasApiVersion(new ApiVersion(1)).ReportApiVersions().Build();
        var group = endpoints.MapGroup("api/v{version:apiVersion}/{name}")
            .WithTags("{Name}").WithApiVersionSet(versionSet).RequireAuthorization();
        // group.MapCreate{Entity}Endpoint();  …
    }
}

Order controls load sequence (Auditing 300, Files 350, Webhooks 400, Billing 500, Catalog 600, Tickets 700, Notifications 750, Chat 800). If your module consumes another's events, load after it.

Step 2 — Permissions (Contracts/Authorization)

{Name}Permissions with nested resource classes and an All collection registered via PermissionConstants.Register({Name}Permissions.All). Mirror the shape of CatalogPermissions.

Step 3 — DbContext (extends BaseDbContext)

public sealed class {Name}DbContext : BaseDbContext
{
    public const string Schema = "{name}";

    public {Name}DbContext(
        IMultiTenantContextAccessor<AppTenantInfo> multiTenantContextAccessor,
        DbContextOptions<{Name}DbContext> options,
        IOptions<DatabaseOptions> settings,
        IHostEnvironment environment)
        : base(multiTenantContextAccessor, options, settings, environment) { }

    public DbSet<{Entity}> {Entities} => Set<{Entity}>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        ArgumentNullException.ThrowIfNull(modelBuilder);
        modelBuilder.HasDefaultSchema(Schema);
        modelBuilder.ApplyConfigurationsFromAssembly(typeof({Name}DbContext).Assembly);
        base.OnModelCreating(modelBuilder);   // MUST be last — applies tenant + soft-delete filters
    }
}

Step 4 — Solution + project references

dotnet sln src/FSH.Starter.slnx add src/Modules/{Name}/Modules.{Name}/Modules.{Name}.csproj
dotnet sln src/FSH.Starter.slnx add src/Modules/{Name}/Modules.{Name}.Contracts/Modules.{Name}.Contracts.csproj

Add a <ProjectReference> to the runtime module from both FSH.Starter.Api and FSH.Starter.DbMigrator, and reference the runtime project from FSH.Starter.Migrations.PostgreSQL.

Step 5 — Migrations folder

Add a {Name}/ folder in src/Host/FSH.Starter.Migrations.PostgreSQL, then create the initial migration (see create-migration) with --context {Name}DbContext.

Step 6 — ⚠️ Register in ALL FOUR places (the footgun)

Identical edits in both FSH.Starter.Api/Program.cs and FSH.Starter.DbMigrator/Program.cs:

  1. Mediator o.Assemblies — add two markers: a Contracts type (e.g. typeof(FSH.Modules.{Name}.Contracts.{Name}ContractsMarker)) and the module type (typeof({Name}Module)).
  2. moduleAssemblies array — add typeof({Name}Module).Assembly.

Miss the Mediator marker → handlers silently undiscovered. Miss the assembly entry → module never loads. Miss the DbMigrator pair → migrate/seed skips the module.

Step 7 — Verify

dotnet build src/FSH.Starter.slnx                  # 0 warnings
dotnet test src/Tests/Architecture.Tests           # boundary + tenant-isolation rules must pass
dotnet test src/FSH.Starter.slnx

Checklist

  • Two projects (copied csproj), added to .slnx, referenced from Api + DbMigrator (+ Migrations)
  • [assembly: FshModule(typeof({Name}Module), order)] (assembly-level, positional)
  • IModule: AddHeroDbContext<T>(), PermissionConstants.Register, version-set group, eventing trio if needed
  • {Name}DbContext : BaseDbContext, 4-arg ctor, base.OnModelCreating last
  • {Name}Permissions in Contracts/Authorization
  • Migrations folder + initial migration (--context {Name}DbContext)
  • Registered in all four places (Api + DbMigrator × Mediator + moduleAssemblies)
  • Build + Architecture.Tests green

When not to use it

  • Adding features to an existing module

Prerequisites

Existing module to copy .csproj files from

Limitations

  • Requires registration in four specific places
  • Requires manual copying of existing .csproj files

How it compares

It enforces architectural consistency by automating the multi-step registration process that is prone to manual error.

Compared to similar skills

add-module side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
add-module (this skill)11moReviewAdvanced
agentdb-advanced-features79moReviewAdvanced
moai-domain-backend13moReviewAdvanced
senior-backend147moReviewAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

agentdb-advanced-features

ruvnet

Master advanced AgentDB features including QUIC synchronization, multi-database management, custom distance metrics, hybrid search, and distributed systems integration. Use when building distributed AI systems, multi-agent coordination, or advanced vector search applications.

798

moai-domain-backend

modu-ai

Backend development specialist covering API design, database integration, microservices architecture, and modern backend patterns.

10

senior-backend

davila7

Comprehensive backend development skill for building scalable backend systems using NodeJS, Express, Go, Python, Postgres, GraphQL, REST APIs. Includes API scaffolding, database optimization, security implementation, and performance tuning. Use when designing APIs, optimizing database queries, implementing business logic, handling authentication/authorization, or reviewing backend code.

1446

redis-inspect

civitai

Inspect Redis cache keys, values, and TTLs for debugging. Supports both main cache and system cache. Use for debugging cache issues, checking cached values, and monitoring cache state. Read-only by default.

646

database-migration

wshobson

Execute database migrations across ORMs and platforms with zero-downtime strategies, data transformation, and rollback procedures. Use when migrating databases, changing schemas, performing data transformations, or implementing zero-downtime deployment strategies.

324

caching-strategies

dadbodgeoff

Implement multi-layer caching with Redis, in-memory, and HTTP caching. Covers cache invalidation, stampede prevention, and cache-aside patterns.

18

Search skills

Search the agent skills registry