[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71MXCM09M6N4C0XEE3CSR1B":3,"skill-same:01M71MXCM09M6N4C0XEE3CSR1B":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":15,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":63,"commitSha":64,"skillDirectory":65,"forksCount":66,"repositoryHtmlUrl":67,"repositoryHomepageUrl":68,"ownerHtmlUrl":69,"ownerBlogUrl":70,"ownerDescription":6,"updatedAt":71,"install":72,"resources":85},"01M71MXCM09M6N4C0XEE3CSR1B","dotnet-patterns",null,"Use when writing or reviewing C# code for idiomatic conventions: records and immutability, dependency injection, async\u002Fawait and ASP NET Core service design. A conventions catalogue; for building APIs with EF Core and Blazor end to end use csharp-developer.","monoes\u002Fmonomind","monoes","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F276744696?v=4","01M71KWF37AJ2NJBP3KWBVSDGT","01M71KWF4CSF8ADH0M6HA09VD2",23,"MIT","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdotnet-patterns\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdotnet-patterns\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"patterns","dotnet patterns","dotnet","csharp","idiomatic","standards","await","developer","context","coding","injection","dependency","ef core","code","query","when","writing","design","blazor","end","2026-11-10 10:56:23",false,"---\nname: dotnet-patterns\ndescription: \"Use when writing or reviewing C# code for idiomatic conventions: records and immutability, dependency injection, async\u002Fawait and ASP NET Core service design. A conventions catalogue; for building APIs with EF Core and Blazor end to end use csharp-developer.\"\ntags: [\"backend\",\"dotnet\",\"coding-standards\"]\ntools: [\"monograph_query\",\"monograph_context\"]\nlicense: MIT\nsource: https:\u002F\u002Fgithub.com\u002Faffaan-m\u002FECC\nsource_path: \"skills\u002Fdotnet-patterns\"\nsource_commit: bf70150eb2df8070024e5bdf08e4aa08959e2735\n---\n# .NET Development Patterns\n\nIdiomatic C# and .NET patterns for building robust, performant, and maintainable applications.\n\n## When to Activate\n\n- Writing new C# code\n- Reviewing C# code\n- Refactoring existing .NET applications\n- Designing service architectures with ASP.NET Core\n\n## Core Principles\n\n### 1. Prefer Immutability\n\nUse records and init-only properties for data models. Mutability should be an explicit, justified choice.\n\n```csharp\n\u002F\u002F Good: Immutable value object\npublic sealed record Money(decimal Amount, string Currency);\n\n\u002F\u002F Good: Immutable DTO with init setters\npublic sealed class CreateOrderRequest\n{\n    public required string CustomerId { get; init; }\n    public required IReadOnlyList\u003COrderItem> Items { get; init; }\n}\n\n\u002F\u002F Bad: Mutable model with public setters\npublic class Order\n{\n    public string CustomerId { get; set; }\n    public List\u003COrderItem> Items { get; set; }\n}\n```\n\n### 2. Explicit Over Implicit\n\nBe clear about nullability, access modifiers, and intent.\n\n```csharp\n\u002F\u002F Good: Explicit access modifiers and nullability\npublic sealed class UserService\n{\n    private readonly IUserRepository _repository;\n    private readonly ILogger\u003CUserService> _logger;\n\n    public UserService(IUserRepository repository, ILogger\u003CUserService> logger)\n    {\n        _repository = repository ?? throw new ArgumentNullException(nameof(repository));\n        _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n    }\n\n    public async Task\u003CUser?> FindByIdAsync(Guid id, CancellationToken cancellationToken)\n    {\n        return await _repository.FindByIdAsync(id, cancellationToken);\n    }\n}\n```\n\n### 3. Depend on Abstractions\n\nUse interfaces for service boundaries. Register via DI container.\n\n```csharp\n\u002F\u002F Good: Interface-based dependency\npublic interface IOrderRepository\n{\n    Task\u003COrder?> FindByIdAsync(Guid id, CancellationToken cancellationToken);\n    Task\u003CIReadOnlyList\u003COrder>> FindByCustomerAsync(string customerId, CancellationToken cancellationToken);\n    Task AddAsync(Order order, CancellationToken cancellationToken);\n}\n\n\u002F\u002F Registration\nbuilder.Services.AddScoped\u003CIOrderRepository, SqlOrderRepository>();\n```\n\n## Async\u002FAwait Patterns\n\n### Proper Async Usage\n\n```csharp\n\u002F\u002F Good: Async all the way, with CancellationToken\npublic async Task\u003COrderSummary> GetOrderSummaryAsync(\n    Guid orderId,\n    CancellationToken cancellationToken)\n{\n    var order = await _repository.FindByIdAsync(orderId, cancellationToken)\n        ?? throw new NotFoundException($\"Order {orderId} not found\");\n\n    var customer = await _customerService.GetAsync(order.CustomerId, cancellationToken);\n\n    return new OrderSummary(order, customer);\n}\n\n\u002F\u002F Bad: Blocking on async\npublic OrderSummary GetOrderSummary(Guid orderId)\n{\n    var order = _repository.FindByIdAsync(orderId, CancellationToken.None).Result; \u002F\u002F Deadlock risk\n    return new OrderSummary(order);\n}\n```\n\n### Parallel Async Operations\n\n```csharp\n\u002F\u002F Good: Concurrent independent operations\npublic async Task\u003CDashboardData> LoadDashboardAsync(CancellationToken cancellationToken)\n{\n    var ordersTask = _orderService.GetRecentAsync(cancellationToken);\n    var metricsTask = _metricsService.GetCurrentAsync(cancellationToken);\n    var alertsTask = _alertService.GetActiveAsync(cancellationToken);\n\n    await Task.WhenAll(ordersTask, metricsTask, alertsTask);\n\n    return new DashboardData(\n        Orders: await ordersTask,\n        Metrics: await metricsTask,\n        Alerts: await alertsTask);\n}\n```\n\n## Options Pattern\n\nBind configuration sections to strongly-typed objects.\n\n```csharp\npublic sealed class SmtpOptions\n{\n    public const string SectionName = \"Smtp\";\n\n    public required string Host { get; init; }\n    public required int Port { get; init; }\n    public required string Username { get; init; }\n    public bool UseSsl { get; init; } = true;\n}\n\n\u002F\u002F Registration\nbuilder.Services.Configure\u003CSmtpOptions>(\n    builder.Configuration.GetSection(SmtpOptions.SectionName));\n\n\u002F\u002F Usage via injection\npublic class EmailService(IOptions\u003CSmtpOptions> options)\n{\n    private readonly SmtpOptions _smtp = options.Value;\n}\n```\n\n## Result Pattern\n\nReturn explicit success\u002Ffailure instead of throwing for expected failures.\n\n```csharp\npublic sealed record Result\u003CT>\n{\n    public bool IsSuccess { get; }\n    public T? Value { get; }\n    public string? Error { get; }\n\n    private Result(T value) { IsSuccess = true; Value = value; }\n    private Result(string error) { IsSuccess = false; Error = error; }\n\n    public static Result\u003CT> Success(T value) => new(value);\n    public static Result\u003CT> Failure(string error) => new(error);\n}\n\n\u002F\u002F Usage\npublic async Task\u003CResult\u003COrder>> PlaceOrderAsync(CreateOrderRequest request)\n{\n    if (request.Items.Count == 0)\n        return Result\u003COrder>.Failure(\"Order must contain at least one item\");\n\n    var order = Order.Create(request);\n    await _repository.AddAsync(order, CancellationToken.None);\n    return Result\u003COrder>.Success(order);\n}\n```\n\n## Repository Pattern with EF Core\n\n```csharp\npublic sealed class SqlOrderRepository : IOrderRepository\n{\n    private readonly AppDbContext _db;\n\n    public SqlOrderRepository(AppDbContext db) => _db = db;\n\n    public async Task\u003COrder?> FindByIdAsync(Guid id, CancellationToken cancellationToken)\n    {\n        return await _db.Orders\n            .Include(o => o.Items)\n            .AsNoTracking()\n            .FirstOrDefaultAsync(o => o.Id == id, cancellationToken);\n    }\n\n    public async Task\u003CIReadOnlyList\u003COrder>> FindByCustomerAsync(\n        string customerId,\n        CancellationToken cancellationToken)\n    {\n        return await _db.Orders\n            .Where(o => o.CustomerId == customerId)\n            .OrderByDescending(o => o.CreatedAt)\n            .AsNoTracking()\n            .ToListAsync(cancellationToken);\n    }\n\n    public async Task AddAsync(Order order, CancellationToken cancellationToken)\n    {\n        _db.Orders.Add(order);\n        await _db.SaveChangesAsync(cancellationToken);\n    }\n}\n```\n\n## Middleware and Pipeline\n\n```csharp\n\u002F\u002F Custom middleware\npublic sealed class RequestTimingMiddleware\n{\n    private readonly RequestDelegate _next;\n    private readonly ILogger\u003CRequestTimingMiddleware> _logger;\n\n    public RequestTimingMiddleware(RequestDelegate next, ILogger\u003CRequestTimingMiddleware> logger)\n    {\n        _next = next;\n        _logger = logger;\n    }\n\n    public async Task InvokeAsync(HttpContext context)\n    {\n        var stopwatch = Stopwatch.StartNew();\n        try\n        {\n            await _next(context);\n        }\n        finally\n        {\n            stopwatch.Stop();\n            _logger.LogInformation(\n                \"Request {Method} {Path} completed in {ElapsedMs}ms with status {StatusCode}\",\n                context.Request.Method,\n                context.Request.Path,\n                stopwatch.ElapsedMilliseconds,\n                context.Response.StatusCode);\n        }\n    }\n}\n```\n\n## Minimal API Patterns\n\n```csharp\n\u002F\u002F Organized with route groups\nvar orders = app.MapGroup(\"\u002Fapi\u002Forders\")\n    .RequireAuthorization()\n    .WithTags(\"Orders\");\n\norders.MapGet(\"\u002F{id:guid}\", async (\n    Guid id,\n    IOrderRepository repository,\n    CancellationToken cancellationToken) =>\n{\n    var order = await repository.FindByIdAsync(id, cancellationToken);\n    return order is not null\n        ? TypedResults.Ok(order)\n        : TypedResults.NotFound();\n});\n\norders.MapPost(\"\u002F\", async (\n    CreateOrderRequest request,\n    IOrderService service,\n    CancellationToken cancellationToken) =>\n{\n    var result = await service.PlaceOrderAsync(request, cancellationToken);\n    return result.IsSuccess\n        ? TypedResults.Created($\"\u002Fapi\u002Forders\u002F{result.Value!.Id}\", result.Value)\n        : TypedResults.BadRequest(result.Error);\n});\n```\n\n## Guard Clauses\n\n```csharp\n\u002F\u002F Good: Early returns with clear validation\npublic async Task\u003CProcessResult> ProcessPaymentAsync(\n    PaymentRequest request,\n    CancellationToken cancellationToken)\n{\n    ArgumentNullException.ThrowIfNull(request);\n\n    if (request.Amount \u003C= 0)\n        throw new ArgumentOutOfRangeException(nameof(request.Amount), \"Amount must be positive\");\n\n    if (string.IsNullOrWhiteSpace(request.Currency))\n        throw new ArgumentException(\"Currency is required\", nameof(request.Currency));\n\n    \u002F\u002F Happy path continues here without nesting\n    var gateway = _gatewayFactory.Create(request.Currency);\n    return await gateway.ChargeAsync(request, cancellationToken);\n}\n```\n\n## Anti-Patterns to Avoid\n\n| Anti-Pattern | Fix |\n|---|---|\n| `async void` methods | Return `Task` (except event handlers) |\n| `.Result` or `.Wait()` | Use `await` |\n| `catch (Exception) { }` | Handle or rethrow with context |\n| `new Service()` in constructors | Use constructor injection |\n| `public` fields | Use properties with appropriate accessors |\n| `dynamic` in business logic | Use generics or explicit types |\n| Mutable `static` state | Use DI scoping or `ConcurrentDictionary` |\n| `string.Format` in loops | Use `StringBuilder` or interpolated string handlers |\n","# .NET Development Patterns\n\nIdiomatic C# and .NET patterns for building robust, performant, and maintainable applications.\n\n## When to Activate\n\n- Writing new C# code\n- Reviewing C# code\n- Refactoring existing .NET applications\n- Designing service architectures with ASP.NET Core\n\n## Core Principles\n\n### 1. Prefer Immutability\n\nUse records and init-only properties for data models. Mutability should be an explicit, justified choice.\n\n```csharp\n\u002F\u002F Good: Immutable value object\npublic sealed record Money(decimal Amount, string Currency);\n\n\u002F\u002F Good: Immutable DTO with init setters\npublic sealed class CreateOrderRequest\n{\n    public required string CustomerId { get; init; }\n    public required IReadOnlyList\u003COrderItem> Items { get; init; }\n}\n\n\u002F\u002F Bad: Mutable model with public setters\npublic class Order\n{\n    public string CustomerId { get; set; }\n    public List\u003COrderItem> Items { get; set; }\n}\n```\n\n### 2. Explicit Over Implicit\n\nBe clear about nullability, access modifiers, and intent.\n\n```csharp\n\u002F\u002F Good: Explicit access modifiers and nullability\npublic sealed class UserService\n{\n    private readonly IUserRepository _repository;\n    private readonly ILogger\u003CUserService> _logger;\n\n    public UserService(IUserRepository repository, ILogger\u003CUserService> logger)\n    {\n        _repository = repository ?? throw new ArgumentNullException(nameof(repository));\n        _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n    }\n\n    public async Task\u003CUser?> FindByIdAsync(Guid id, CancellationToken cancellationToken)\n    {\n        return await _repository.FindByIdAsync(id, cancellationToken);\n    }\n}\n```\n\n### 3. Depend on Abstractions\n\nUse interfaces for service boundaries. Register via DI container.\n\n```csharp\n\u002F\u002F Good: Interface-based dependency\npublic interface IOrderRepository\n{\n    Task\u003COrder?> FindByIdAsync(Guid id, CancellationToken cancellationToken);\n    Task\u003CIReadOnlyList\u003COrder>> FindByCustomerAsync(string customerId, CancellationToken cancellationToken);\n    Task AddAsync(Order order, CancellationToken cancellationToken);\n}\n\n\u002F\u002F Registration\nbuilder.Services.AddScoped\u003CIOrderRepository, SqlOrderRepository>();\n```\n\n## Async\u002FAwait Patterns\n\n### Proper Async Usage\n\n```csharp\n\u002F\u002F Good: Async all the way, with CancellationToken\npublic async Task\u003COrderSummary> GetOrderSummaryAsync(\n    Guid orderId,\n    CancellationToken cancellationToken)\n{\n    var order = await _repository.FindByIdAsync(orderId, cancellationToken)\n        ?? throw new NotFoundException($\"Order {orderId} not found\");\n\n    var customer = await _customerService.GetAsync(order.CustomerId, cancellationToken);\n\n    return new OrderSummary(order, customer);\n}\n\n\u002F\u002F Bad: Blocking on async\npublic OrderSummary GetOrderSummary(Guid orderId)\n{\n    var order = _repository.FindByIdAsync(orderId, CancellationToken.None).Result; \u002F\u002F Deadlock risk\n    return new OrderSummary(order);\n}\n```\n\n### Parallel Async Operations\n\n```csharp\n\u002F\u002F Good: Concurrent independent operations\npublic async Task\u003CDashboardData> LoadDashboardAsync(CancellationToken cancellationToken)\n{\n    var ordersTask = _orderService.GetRecentAsync(cancellationToken);\n    var metricsTask = _metricsService.GetCurrentAsync(cancellationToken);\n    var alertsTask = _alertService.GetActiveAsync(cancellationToken);\n\n    await Task.WhenAll(ordersTask, metricsTask, alertsTask);\n\n    return new DashboardData(\n        Orders: await ordersTask,\n        Metrics: await metricsTask,\n        Alerts: await alertsTask);\n}\n```\n\n## Options Pattern\n\nBind configuration sections to strongly-typed objects.\n\n```csharp\npublic sealed class SmtpOptions\n{\n    public const string SectionName = \"Smtp\";\n\n    public required string Host { get; init; }\n    public required int Port { get; init; }\n    public required string Username { get; init; }\n    public bool UseSsl { get; init; } = true;\n}\n\n\u002F\u002F Registration\nbuilder.Services.Configure\u003CSmtpOptions>(\n    builder.Configuration.GetSection(SmtpOptions.SectionName));\n\n\u002F\u002F Usage via injection\npublic class EmailService(IOptions\u003CSmtpOptions> options)\n{\n    private readonly SmtpOptions _smtp = options.Value;\n}\n```\n\n## Result Pattern\n\nReturn explicit success\u002Ffailure instead of throwing for expected failures.\n\n```csharp\npublic sealed record Result\u003CT>\n{\n    public bool IsSuccess { get; }\n    public T? Value { get; }\n    public string? Error { get; }\n\n    private Result(T value) { IsSuccess = true; Value = value; }\n    private Result(string error) { IsSuccess = false; Error = error; }\n\n    public static Result\u003CT> Success(T value) => new(value);\n    public static Result\u003CT> Failure(string error) => new(error);\n}\n\n\u002F\u002F Usage\npublic async Task\u003CResult\u003COrder>> PlaceOrderAsync(CreateOrderRequest request)\n{\n    if (request.Items.Count == 0)\n        return Result\u003COrder>.Failure(\"Order must contain at least one item\");\n\n    var order = Order.Create(request);\n    await _repository.AddAsync(order, CancellationToken.None);\n    return Result\u003COrder>.Success(order);\n}\n```\n\n## Repository Pattern with EF Core\n\n```csharp\npublic sealed class SqlOrderRepository : IOrderRepository\n{\n    private readonly AppDbContext _db;\n\n    public SqlOrderRepository(AppDbContext db) => _db = db;\n\n    public async Task\u003COrder?> FindByIdAsync(Guid id, CancellationToken cancellationToken)\n    {\n        return await _db.Orders\n            .Include(o => o.Items)\n            .AsNoTracking()\n            .FirstOrDefaultAsync(o => o.Id == id, cancellationToken);\n    }\n\n    public async Task\u003CIReadOnlyList\u003COrder>> FindByCustomerAsync(\n        string customerId,\n        CancellationToken cancellationToken)\n    {\n        return await _db.Orders\n            .Where(o => o.CustomerId == customerId)\n            .OrderByDescending(o => o.CreatedAt)\n            .AsNoTracking()\n            .ToListAsync(cancellationToken);\n    }\n\n    public async Task AddAsync(Order order, CancellationToken cancellationToken)\n    {\n        _db.Orders.Add(order);\n        await _db.SaveChangesAsync(cancellationToken);\n    }\n}\n```\n\n## Middleware and Pipeline\n\n```csharp\n\u002F\u002F Custom middleware\npublic sealed class RequestTimingMiddleware\n{\n    private readonly RequestDelegate _next;\n    private readonly ILogger\u003CRequestTimingMiddleware> _logger;\n\n    public RequestTimingMiddleware(RequestDelegate next, ILogger\u003CRequestTimingMiddleware> logger)\n    {\n        _next = next;\n        _logger = logger;\n    }\n\n    public async Task InvokeAsync(HttpContext context)\n    {\n        var stopwatch = Stopwatch.StartNew();\n        try\n        {\n            await _next(context);\n        }\n        finally\n        {\n            stopwatch.Stop();\n            _logger.LogInformation(\n                \"Request {Method} {Path} completed in {ElapsedMs}ms with status {StatusCode}\",\n                context.Request.Method,\n                context.Request.Path,\n                stopwatch.ElapsedMilliseconds,\n                context.Response.StatusCode);\n        }\n    }\n}\n```\n\n## Minimal API Patterns\n\n```csharp\n\u002F\u002F Organized with route groups\nvar orders = app.MapGroup(\"\u002Fapi\u002Forders\")\n    .RequireAuthorization()\n    .WithTags(\"Orders\");\n\norders.MapGet(\"\u002F{id:guid}\", async (\n    Guid id,\n    IOrderRepository repository,\n    CancellationToken cancellationToken) =>\n{\n    var order = await repository.FindByIdAsync(id, cancellationToken);\n    return order is not null\n        ? TypedResults.Ok(order)\n        : TypedResults.NotFound();\n});\n\norders.MapPost(\"\u002F\", async (\n    CreateOrderRequest request,\n    IOrderService service,\n    CancellationToken cancellationToken) =>\n{\n    var result = await service.PlaceOrderAsync(request, cancellationToken);\n    return result.IsSuccess\n        ? TypedResults.Created($\"\u002Fapi\u002Forders\u002F{result.Value!.Id}\", result.Value)\n        : TypedResults.BadRequest(result.Error);\n});\n```\n\n## Guard Clauses\n\n```csharp\n\u002F\u002F Good: Early returns with clear validation\npublic async Task\u003CProcessResult> ProcessPaymentAsync(\n    PaymentRequest request,\n    CancellationToken cancellationToken)\n{\n    ArgumentNullException.ThrowIfNull(request);\n\n    if (request.Amount \u003C= 0)\n        throw new ArgumentOutOfRangeException(nameof(request.Amount), \"Amount must be positive\");\n\n    if (string.IsNullOrWhiteSpace(request.Currency))\n        throw new ArgumentException(\"Currency is required\", nameof(request.Currency));\n\n    \u002F\u002F Happy path continues here without nesting\n    var gateway = _gatewayFactory.Create(request.Currency);\n    return await gateway.ChargeAsync(request, cancellationToken);\n}\n```\n\n## Anti-Patterns to Avoid\n\n| Anti-Pattern | Fix |\n|---|---|\n| `async void` methods | Return `Task` (except event handlers) |\n| `.Result` or `.Wait()` | Use `await` |\n| `catch (Exception) { }` | Handle or rethrow with context |\n| `new Service()` in constructors | Use constructor injection |\n| `public` fields | Use properties with appropriate accessors |\n| `dynamic` in business logic | Use generics or explicit types |\n| Mutable `static` state | Use DI scoping or `ConcurrentDictionary` |\n| `string.Format` in loops | Use `StringBuilder` or interpolated string handlers |\n",{"name":5,"tags":54,"tools":57,"source":60,"license":14,"description":7,"source_path":61,"source_commit":62},[55,31,56],"backend","coding-standards",[58,59],"monograph_query","monograph_context","https:\u002F\u002Fgithub.com\u002Faffaan-m\u002FECC","skills\u002Fdotnet-patterns","bf70150eb2df8070024e5bdf08e4aa08959e2735","main","f7cd4595d0f8959822163e14f9787117765c931a","packages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdotnet-patterns",2,"https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind","https:\u002F\u002Fmonoes.github.io\u002Fmonomind\u002F","https:\u002F\u002Fgithub.com\u002Fmonoes","https:\u002F\u002Fmonoes.me","2026-11-10 01:53:48",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":84},[74,77,80],{"tool":75,"command":76},"npx","npx skills add monoes\u002Fmonomind --skill dotnet-patterns",{"tool":78,"command":79},"bunx","bunx skills add monoes\u002Fmonomind --skill dotnet-patterns",{"tool":81,"command":82},"pnpm","pnpm dlx skills add monoes\u002Fmonomind --skill dotnet-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fdotnet-patterns\u002FSKILL.md",true,[86],{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":15},"LICENSE.txt","LICENSE","许可证",1071,[92,119,146,173,198,224],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":118},"01M71PB3SHWKMNJM6MD65VX8D6","zk-steward","Org role guidance for a ZK steward: engineer zero-knowledge proof systems with circuit design, SNARK vs STARK choice and security review. This is zero-knowledge cryptography, not Zettelkasten note-taking.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fzk-steward\u002FSKILL.md",[],[100,101,102,103,104,105,46,106,107,43,108,109,110,111,112,113,114,115,116,117],"zk","zk steward","steward","zero-knowledge","engineer","choice","knowledge","impact","snark","review","monomind","security review","stark","zettelkasten","cryptography","security","org","blockchain","2026-11-10 13:02:02",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":123,"sourceHtmlUrl":124,"categories":125,"keywords":132,"publishedAt":118},"01M71PB18SDG28WBKPKJNB814K","writing-plans","Use when you have a spec or requirements for a multi-step coding task and must write an implementation plan before touching code. Produces bite-sized TDD tasks with exact file paths, code and commands for an engineer with zero context.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwriting-plans\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwriting-plans\u002FSKILL.md",[126,129],{"categoryNo":127,"categoryName":128,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":130,"categoryName":131,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者",[45,133,134,104,135,136,44,137,43,42,138,139,140,141,142,143,144,38,37,145],"writing plans","plans","superpowers","implementation plan","you","tasks","plan","product","write","commands","paths","suggest","ZeRO",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":96,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":156,"publishedAt":118},"01M71PAXFM488X9ARXK0T04TF5","write-spec","Write a feature spec or PRD from a problem statement or feature idea. Use when turning a vague idea or user request into a structured document, scoping a feature with goals and non-goals, defining success metrics and acceptance criteria, or breaking a big ask into a phased spec.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-spec\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-spec\u002FSKILL.md",[153],{"categoryNo":154,"categoryName":155,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000031","产品经理",[141,157,158,159,160,106,161,44,162,163,164,140,165,166,167,168,169,170,171,172],"write spec","spec","user request","problem","acceptance","ask","vague","work","request","scoping","idea","metrics","feature","problem statement","use","document",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":96,"licenseFileUrl":177,"sourceHtmlUrl":178,"categories":179,"keywords":183,"publishedAt":118},"01M71PASSZY800C0RPEARBS918","write-query","Write optimized SQL for your dialect with best practices. Use when translating a natural-language data need into SQL, building a multi-CTE query with joins and aggregations, optimizing a query against a large partitioned table, or getting dialect-specific syntax for Snowflake, BigQuery, Postgres, etc.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-query\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fwrite-query\u002FSKILL.md",[180],{"categoryNo":181,"categoryName":182,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000033","数据分析师",[43,141,184,185,186,187,106,171,44,188,189,190,191,164,192,193,194,195,196,197],"write query","postgres","for","snowflake","best practices","natural-language","with","multi","github","sql","https","syntax","plugins","data",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":210,"publishedAt":118},"01M71PAPTX0T3PF6ETFVR96SJJ","workflow-automation","Org role guidance for workflow automation: build and maintain CI\u002FCD definitions in GitHub Actions or equivalent: triggers, jobs, matrices, caching. Covers path filters, dependency caching, parallel jobs, timeouts and fail-fast ordering.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fworkflow-automation\u002FSKILL.md",[204,207],{"categoryNo":205,"categoryName":206,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":208,"categoryName":209,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[211,212,213,214,186,215,216,217,218,107,219,220,221,43,110,192,222,40,223,194],"Workflow Automation","automation","workflow","parallel","actions","ci","triggers","github actions","maintain","filters","caching","build","devops",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":228,"categories":229,"keywords":231,"publishedAt":118},"01M71PAM19Z1XTV9NPCFSE2MY8","workflow-architect","Org role guidance for a workflow architect: map full workflow trees for systems, user journeys and agents, covering every branch and failure. Covers discovering workflows from code, handoff contracts, timeouts, recovery paths and observable state.","https:\u002F\u002Fgithub.com\u002Fmonoes\u002Fmonomind\u002Fblob\u002Fmain\u002Fpackages\u002F@monomind\u002Fcli\u002Forg-skills\u002Fworkflow-architect\u002FSKILL.md",[230],{"categoryNo":208,"categoryName":209,"taxonomyType":21,"taxonomyTypeDesc":22},[213,232,233,234,235,236,237,186,238,239,42,240,241,242,110,192,243,244,194,245],"workflow architect","architect","trees","user journeys","branch","planning","map","workflows","architecture","state","leadership","recovery","operations","systems"]