[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JCXGK6KVF71WW5CBSAZF3A":3,"skill-same:01M6JCXGK6KVF71WW5CBSAZF3A":60},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6JCXGK6KVF71WW5CBSAZF3A","dotnet-patterns",null,"Idiomatic C# and .NET patterns, conventions, dependency injection, async\u002Fawait, and best practices for building robust, maintainable .NET applications.","S3YED\u002Fappie-kit","S3YED","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F62743867?v=4","01M6JBKBRRVP6KMS0VWZ27T3R6","01M6JBKBX0KG30284PW1DBYJT1",14,"MIT","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fdotnet-patterns\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31],"dotnet","patterns","dotnet patterns","best practices","injection","applications","dependency","async","conventions","dependency injection","C#","for","await","idiomatic","2026-11-10 10:12:30",false,"---\nname: dotnet-patterns\ndescription: Idiomatic C# and .NET patterns, conventions, dependency injection, async\u002Fawait, and best practices for building robust, maintainable .NET applications.\norigin: ECC\n---\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,"origin":37,"description":7},"ECC","master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fecc\u002Fdotnet-patterns",3,"https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit","https:\u002F\u002Fweblyfe.ai","https:\u002F\u002Fgithub.com\u002FS3YED","2026-08-27 01:54:02",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add S3YED\u002Fappie-kit --skill dotnet-patterns",{"tool":52,"command":53},"bunx","bunx skills add S3YED\u002Fappie-kit --skill dotnet-patterns",{"tool":55,"command":56},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill dotnet-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fdotnet-patterns\u002FSKILL.md",true,[],[61,97,132,158,189,213],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":78,"publishedAt":32},"01M6JFD4M6N4DSGC7TXEJ5R3J2","ai-music","AI music generation and audio tools: HeartMuLa lyrics-to-music generation, songwriting craft (+ Suno prompts), and audio spectrogram\u002Ffeature visualization.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fwethlete\u002Fai-music\u002FSKILL.md",[67,72,75],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":73,"categoryName":74,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":76,"categoryName":77,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000023","Skill与智能体开发",[79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],"music","ai music","humanizer","visualization","Tools","Audio","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","generation","feature","ai music generation","music generation",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":111,"publishedAt":32},"01M6JFCZE4XNFQFMNZDHKHT5V5","agentic-webdesign-design-system-ingestion","Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-design-system-ingestion\u002FSKILL.md",[103,106],{"categoryNo":104,"categoryName":105,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131],"design","agentic","design system","system","ingestion","webdesign","agentic webdesign design system ingestion","components","generate","design systems","website","ui","Tailwind","bolt","lovable","v0","design-system","wed","design system components","appie",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":140,"publishedAt":32},"01M6JFCVPX3913CFAS6QQJ33ZB","agentic-webdesign-agent-elements","Use 21st.dev Agent Elements — 25 shadcn\u002Fui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-agent-elements\u002FSKILL.md",[138,139],{"categoryNo":76,"categoryName":77,"taxonomyType":70,"taxonomyTypeDesc":71},{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},[113,141,117,142,143,144,119,145,146,147,148,149,150,151,152,153,154,155,156,157],"elements","agentic webdesign agent elements","MCP","ai agent","registry","search","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":168,"publishedAt":32},"01M6JFCQC7H65M9QJ6TRE71BS1","vercel-deployment","Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fvercel-deployment\u002FSKILL.md",[164,167],{"categoryNo":165,"categoryName":166,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":76,"categoryName":77,"taxonomyType":70,"taxonomyTypeDesc":71},[169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],"deployment","vercel deployment","vercel","macos","cli","linux","windows","deploy","vercel deploy","REST","api","site","deploy to vercel","token","rest api","host","sites","paths","sanitization","static site",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":196,"publishedAt":32},"01M6JFCM4SMTXBM5A01BK2YQG1","software-quality-workflows","Umbrella workflow for TDD, debugging, code simplification, spikes, pre-commit review, and debugger-assisted investigation.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fsoftware-quality-workflows\u002FSKILL.md",[195],{"categoryNo":76,"categoryName":77,"taxonomyType":70,"taxonomyTypeDesc":71},[197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,29],"workflows","quality","software","software quality workflows","review","tdd","workflow","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification",{"skillNo":214,"name":215,"nameZh":6,"description":216,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":217,"categories":218,"keywords":226,"publishedAt":32},"01M6JFCGD0M6CEATY01W7YN6DB","react-component-refactoring","Safely refactor large React components into smaller, maintainable pieces using proven patterns","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Freact-component-refactoring\u002FSKILL.md",[219,222,225],{"categoryNo":220,"categoryName":221,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":223,"categoryName":224,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":76,"categoryName":77,"taxonomyType":70,"taxonomyTypeDesc":71},[227,228,229,230,231,232,233,234,172,235,236,119,237,175,238,206,239,240,19,241],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","writing","safe","typescript","react components","modular","refactor","simplify","test-driven-development"]