[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JCV3PJMVD3QAJWN2VG2XJ3":3,"skill-same:01M6JCV3PJMVD3QAJWN2VG2XJ3":67},{"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":22,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":66},"01M6JCV3PJMVD3QAJWN2VG2XJ3","csharp-testing",null,"C# and .NET testing patterns with xUnit, FluentAssertions, mocking, integration tests, and test organization best practices.","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\u002Fcsharp-testing\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"testing","csharp","csharp testing","test","integration tests","best practices","integration","testing patterns","organization best practices","xunit","patterns","organization","tests","mocking","with","C#","2026-11-10 10:12:30",false,"---\nname: csharp-testing\ndescription: C# and .NET testing patterns with xUnit, FluentAssertions, mocking, integration tests, and test organization best practices.\norigin: ECC\n---\n\n# C# Testing Patterns\n\nComprehensive testing patterns for .NET applications using xUnit, FluentAssertions, and modern testing practices.\n\n## When to Activate\n\n- Writing new tests for C# code\n- Reviewing test quality and coverage\n- Setting up test infrastructure for .NET projects\n- Debugging flaky or slow tests\n\n## Test Framework Stack\n\n| Tool | Purpose |\n|---|---|\n| **xUnit** | Test framework (preferred for .NET) |\n| **FluentAssertions** | Readable assertion syntax |\n| **NSubstitute** or **Moq** | Mocking dependencies |\n| **Testcontainers** | Real infrastructure in integration tests |\n| **WebApplicationFactory** | ASP.NET Core integration tests |\n| **Bogus** | Realistic test data generation |\n\n## Unit Test Structure\n\n### Arrange-Act-Assert\n\n```csharp\npublic sealed class OrderServiceTests\n{\n    private readonly IOrderRepository _repository = Substitute.For\u003CIOrderRepository>();\n    private readonly ILogger\u003COrderService> _logger = Substitute.For\u003CILogger\u003COrderService>>();\n    private readonly OrderService _sut;\n\n    public OrderServiceTests()\n    {\n        _sut = new OrderService(_repository, _logger);\n    }\n\n    [Fact]\n    public async Task PlaceOrderAsync_ReturnsSuccess_WhenRequestIsValid()\n    {\n        \u002F\u002F Arrange\n        var request = new CreateOrderRequest\n        {\n            CustomerId = \"cust-123\",\n            Items = [new OrderItem(\"SKU-001\", 2, 29.99m)]\n        };\n\n        \u002F\u002F Act\n        var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n        \u002F\u002F Assert\n        result.IsSuccess.Should().BeTrue();\n        result.Value.Should().NotBeNull();\n        result.Value!.CustomerId.Should().Be(\"cust-123\");\n    }\n\n    [Fact]\n    public async Task PlaceOrderAsync_ReturnsFailure_WhenNoItems()\n    {\n        \u002F\u002F Arrange\n        var request = new CreateOrderRequest\n        {\n            CustomerId = \"cust-123\",\n            Items = []\n        };\n\n        \u002F\u002F Act\n        var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n        \u002F\u002F Assert\n        result.IsSuccess.Should().BeFalse();\n        result.Error.Should().Contain(\"at least one item\");\n    }\n}\n```\n\n### Parameterized Tests with Theory\n\n```csharp\n[Theory]\n[InlineData(\"\", false)]\n[InlineData(\"a\", false)]\n[InlineData(\"ab@c.d\", false)]\n[InlineData(\"user@example.com\", true)]\n[InlineData(\"user+tag@example.co.uk\", true)]\npublic void IsValidEmail_ReturnsExpected(string email, bool expected)\n{\n    EmailValidator.IsValid(email).Should().Be(expected);\n}\n\n[Theory]\n[MemberData(nameof(InvalidOrderCases))]\npublic async Task PlaceOrderAsync_RejectsInvalidOrders(CreateOrderRequest request, string expectedError)\n{\n    var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n    result.IsSuccess.Should().BeFalse();\n    result.Error.Should().Contain(expectedError);\n}\n\npublic static TheoryData\u003CCreateOrderRequest, string> InvalidOrderCases => new()\n{\n    { new() { CustomerId = \"\", Items = [ValidItem()] }, \"CustomerId\" },\n    { new() { CustomerId = \"c1\", Items = [] }, \"at least one item\" },\n    { new() { CustomerId = \"c1\", Items = [new(\"\", 1, 10m)] }, \"SKU\" },\n};\n```\n\n## Mocking with NSubstitute\n\n```csharp\n[Fact]\npublic async Task GetOrderAsync_ReturnsNull_WhenNotFound()\n{\n    \u002F\u002F Arrange\n    var orderId = Guid.NewGuid();\n    _repository.FindByIdAsync(orderId, Arg.Any\u003CCancellationToken>())\n        .Returns((Order?)null);\n\n    \u002F\u002F Act\n    var result = await _sut.GetOrderAsync(orderId, CancellationToken.None);\n\n    \u002F\u002F Assert\n    result.Should().BeNull();\n}\n\n[Fact]\npublic async Task PlaceOrderAsync_PersistsOrder()\n{\n    \u002F\u002F Arrange\n    var request = ValidOrderRequest();\n\n    \u002F\u002F Act\n    await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n    \u002F\u002F Assert — verify the repository was called\n    await _repository.Received(1).AddAsync(\n        Arg.Is\u003COrder>(o => o.CustomerId == request.CustomerId),\n        Arg.Any\u003CCancellationToken>());\n}\n```\n\n## ASP.NET Core Integration Tests\n\n### WebApplicationFactory Setup\n\n```csharp\npublic sealed class OrderApiTests : IClassFixture\u003CWebApplicationFactory\u003CProgram>>\n{\n    private readonly HttpClient _client;\n\n    public OrderApiTests(WebApplicationFactory\u003CProgram> factory)\n    {\n        _client = factory.WithWebHostBuilder(builder =>\n        {\n            builder.ConfigureServices(services =>\n            {\n                \u002F\u002F Replace real DB with in-memory for tests\n                services.RemoveAll\u003CDbContextOptions\u003CAppDbContext>>();\n                services.AddDbContext\u003CAppDbContext>(options =>\n                    options.UseInMemoryDatabase(\"TestDb\"));\n            });\n        }).CreateClient();\n    }\n\n    [Fact]\n    public async Task GetOrder_Returns404_WhenNotFound()\n    {\n        var response = await _client.GetAsync($\"\u002Fapi\u002Forders\u002F{Guid.NewGuid()}\");\n\n        response.StatusCode.Should().Be(HttpStatusCode.NotFound);\n    }\n\n    [Fact]\n    public async Task CreateOrder_Returns201_WithValidRequest()\n    {\n        var request = new CreateOrderRequest\n        {\n            CustomerId = \"cust-1\",\n            Items = [new(\"SKU-001\", 1, 19.99m)]\n        };\n\n        var response = await _client.PostAsJsonAsync(\"\u002Fapi\u002Forders\", request);\n\n        response.StatusCode.Should().Be(HttpStatusCode.Created);\n        response.Headers.Location.Should().NotBeNull();\n    }\n}\n```\n\n### Testing with Testcontainers\n\n```csharp\npublic sealed class PostgresOrderRepositoryTests : IAsyncLifetime\n{\n    private readonly PostgreSqlContainer _postgres = new PostgreSqlBuilder()\n        .WithImage(\"postgres:16-alpine\")\n        .Build();\n\n    private AppDbContext _db = null!;\n\n    public async Task InitializeAsync()\n    {\n        await _postgres.StartAsync();\n        var options = new DbContextOptionsBuilder\u003CAppDbContext>()\n            .UseNpgsql(_postgres.GetConnectionString())\n            .Options;\n        _db = new AppDbContext(options);\n        await _db.Database.MigrateAsync();\n    }\n\n    public async Task DisposeAsync()\n    {\n        await _db.DisposeAsync();\n        await _postgres.DisposeAsync();\n    }\n\n    [Fact]\n    public async Task AddAsync_PersistsOrder()\n    {\n        var repo = new SqlOrderRepository(_db);\n        var order = Order.Create(\"cust-1\", [new OrderItem(\"SKU-001\", 2, 10m)]);\n\n        await repo.AddAsync(order, CancellationToken.None);\n\n        var found = await repo.FindByIdAsync(order.Id, CancellationToken.None);\n        found.Should().NotBeNull();\n        found!.Items.Should().HaveCount(1);\n    }\n}\n```\n\n## Test Organization\n\n```\ntests\u002F\n  MyApp.UnitTests\u002F\n    Services\u002F\n      OrderServiceTests.cs\n      PaymentServiceTests.cs\n    Validators\u002F\n      EmailValidatorTests.cs\n  MyApp.IntegrationTests\u002F\n    Api\u002F\n      OrderApiTests.cs\n    Repositories\u002F\n      OrderRepositoryTests.cs\n  MyApp.TestHelpers\u002F\n    Builders\u002F\n      OrderBuilder.cs\n    Fixtures\u002F\n      DatabaseFixture.cs\n```\n\n## Test Data Builders\n\n```csharp\npublic sealed class OrderBuilder\n{\n    private string _customerId = \"cust-default\";\n    private readonly List\u003COrderItem> _items = [new(\"SKU-001\", 1, 10m)];\n\n    public OrderBuilder WithCustomer(string customerId)\n    {\n        _customerId = customerId;\n        return this;\n    }\n\n    public OrderBuilder WithItem(string sku, int quantity, decimal price)\n    {\n        _items.Add(new OrderItem(sku, quantity, price));\n        return this;\n    }\n\n    public Order Build() => Order.Create(_customerId, _items);\n}\n\n\u002F\u002F Usage in tests\nvar order = new OrderBuilder()\n    .WithCustomer(\"cust-vip\")\n    .WithItem(\"SKU-PREMIUM\", 3, 99.99m)\n    .Build();\n```\n\n## Common Anti-Patterns\n\n| Anti-Pattern | Fix |\n|---|---|\n| Testing implementation details | Test behavior and outcomes |\n| Shared mutable test state | Fresh instance per test (xUnit does this via constructors) |\n| `Thread.Sleep` in async tests | Use `Task.Delay` with timeout, or polling helpers |\n| Asserting on `ToString()` output | Assert on typed properties |\n| One giant assertion per test | One logical assertion per test |\n| Test names describing implementation | Name by behavior: `Method_ExpectedResult_WhenCondition` |\n| Ignoring `CancellationToken` | Always pass and verify cancellation |\n\n## Running Tests\n\n```bash\n# Run all tests\ndotnet test\n\n# Run with coverage\ndotnet test --collect:\"XPlat Code Coverage\"\n\n# Run specific project\ndotnet test tests\u002FMyApp.UnitTests\u002F\n\n# Filter by test name\ndotnet test --filter \"FullyQualifiedName~OrderService\"\n\n# Watch mode during development\ndotnet watch test --project tests\u002FMyApp.UnitTests\u002F\n```\n","# C# Testing Patterns\n\nComprehensive testing patterns for .NET applications using xUnit, FluentAssertions, and modern testing practices.\n\n## When to Activate\n\n- Writing new tests for C# code\n- Reviewing test quality and coverage\n- Setting up test infrastructure for .NET projects\n- Debugging flaky or slow tests\n\n## Test Framework Stack\n\n| Tool | Purpose |\n|---|---|\n| **xUnit** | Test framework (preferred for .NET) |\n| **FluentAssertions** | Readable assertion syntax |\n| **NSubstitute** or **Moq** | Mocking dependencies |\n| **Testcontainers** | Real infrastructure in integration tests |\n| **WebApplicationFactory** | ASP.NET Core integration tests |\n| **Bogus** | Realistic test data generation |\n\n## Unit Test Structure\n\n### Arrange-Act-Assert\n\n```csharp\npublic sealed class OrderServiceTests\n{\n    private readonly IOrderRepository _repository = Substitute.For\u003CIOrderRepository>();\n    private readonly ILogger\u003COrderService> _logger = Substitute.For\u003CILogger\u003COrderService>>();\n    private readonly OrderService _sut;\n\n    public OrderServiceTests()\n    {\n        _sut = new OrderService(_repository, _logger);\n    }\n\n    [Fact]\n    public async Task PlaceOrderAsync_ReturnsSuccess_WhenRequestIsValid()\n    {\n        \u002F\u002F Arrange\n        var request = new CreateOrderRequest\n        {\n            CustomerId = \"cust-123\",\n            Items = [new OrderItem(\"SKU-001\", 2, 29.99m)]\n        };\n\n        \u002F\u002F Act\n        var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n        \u002F\u002F Assert\n        result.IsSuccess.Should().BeTrue();\n        result.Value.Should().NotBeNull();\n        result.Value!.CustomerId.Should().Be(\"cust-123\");\n    }\n\n    [Fact]\n    public async Task PlaceOrderAsync_ReturnsFailure_WhenNoItems()\n    {\n        \u002F\u002F Arrange\n        var request = new CreateOrderRequest\n        {\n            CustomerId = \"cust-123\",\n            Items = []\n        };\n\n        \u002F\u002F Act\n        var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n        \u002F\u002F Assert\n        result.IsSuccess.Should().BeFalse();\n        result.Error.Should().Contain(\"at least one item\");\n    }\n}\n```\n\n### Parameterized Tests with Theory\n\n```csharp\n[Theory]\n[InlineData(\"\", false)]\n[InlineData(\"a\", false)]\n[InlineData(\"ab@c.d\", false)]\n[InlineData(\"user@example.com\", true)]\n[InlineData(\"user+tag@example.co.uk\", true)]\npublic void IsValidEmail_ReturnsExpected(string email, bool expected)\n{\n    EmailValidator.IsValid(email).Should().Be(expected);\n}\n\n[Theory]\n[MemberData(nameof(InvalidOrderCases))]\npublic async Task PlaceOrderAsync_RejectsInvalidOrders(CreateOrderRequest request, string expectedError)\n{\n    var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n    result.IsSuccess.Should().BeFalse();\n    result.Error.Should().Contain(expectedError);\n}\n\npublic static TheoryData\u003CCreateOrderRequest, string> InvalidOrderCases => new()\n{\n    { new() { CustomerId = \"\", Items = [ValidItem()] }, \"CustomerId\" },\n    { new() { CustomerId = \"c1\", Items = [] }, \"at least one item\" },\n    { new() { CustomerId = \"c1\", Items = [new(\"\", 1, 10m)] }, \"SKU\" },\n};\n```\n\n## Mocking with NSubstitute\n\n```csharp\n[Fact]\npublic async Task GetOrderAsync_ReturnsNull_WhenNotFound()\n{\n    \u002F\u002F Arrange\n    var orderId = Guid.NewGuid();\n    _repository.FindByIdAsync(orderId, Arg.Any\u003CCancellationToken>())\n        .Returns((Order?)null);\n\n    \u002F\u002F Act\n    var result = await _sut.GetOrderAsync(orderId, CancellationToken.None);\n\n    \u002F\u002F Assert\n    result.Should().BeNull();\n}\n\n[Fact]\npublic async Task PlaceOrderAsync_PersistsOrder()\n{\n    \u002F\u002F Arrange\n    var request = ValidOrderRequest();\n\n    \u002F\u002F Act\n    await _sut.PlaceOrderAsync(request, CancellationToken.None);\n\n    \u002F\u002F Assert — verify the repository was called\n    await _repository.Received(1).AddAsync(\n        Arg.Is\u003COrder>(o => o.CustomerId == request.CustomerId),\n        Arg.Any\u003CCancellationToken>());\n}\n```\n\n## ASP.NET Core Integration Tests\n\n### WebApplicationFactory Setup\n\n```csharp\npublic sealed class OrderApiTests : IClassFixture\u003CWebApplicationFactory\u003CProgram>>\n{\n    private readonly HttpClient _client;\n\n    public OrderApiTests(WebApplicationFactory\u003CProgram> factory)\n    {\n        _client = factory.WithWebHostBuilder(builder =>\n        {\n            builder.ConfigureServices(services =>\n            {\n                \u002F\u002F Replace real DB with in-memory for tests\n                services.RemoveAll\u003CDbContextOptions\u003CAppDbContext>>();\n                services.AddDbContext\u003CAppDbContext>(options =>\n                    options.UseInMemoryDatabase(\"TestDb\"));\n            });\n        }).CreateClient();\n    }\n\n    [Fact]\n    public async Task GetOrder_Returns404_WhenNotFound()\n    {\n        var response = await _client.GetAsync($\"\u002Fapi\u002Forders\u002F{Guid.NewGuid()}\");\n\n        response.StatusCode.Should().Be(HttpStatusCode.NotFound);\n    }\n\n    [Fact]\n    public async Task CreateOrder_Returns201_WithValidRequest()\n    {\n        var request = new CreateOrderRequest\n        {\n            CustomerId = \"cust-1\",\n            Items = [new(\"SKU-001\", 1, 19.99m)]\n        };\n\n        var response = await _client.PostAsJsonAsync(\"\u002Fapi\u002Forders\", request);\n\n        response.StatusCode.Should().Be(HttpStatusCode.Created);\n        response.Headers.Location.Should().NotBeNull();\n    }\n}\n```\n\n### Testing with Testcontainers\n\n```csharp\npublic sealed class PostgresOrderRepositoryTests : IAsyncLifetime\n{\n    private readonly PostgreSqlContainer _postgres = new PostgreSqlBuilder()\n        .WithImage(\"postgres:16-alpine\")\n        .Build();\n\n    private AppDbContext _db = null!;\n\n    public async Task InitializeAsync()\n    {\n        await _postgres.StartAsync();\n        var options = new DbContextOptionsBuilder\u003CAppDbContext>()\n            .UseNpgsql(_postgres.GetConnectionString())\n            .Options;\n        _db = new AppDbContext(options);\n        await _db.Database.MigrateAsync();\n    }\n\n    public async Task DisposeAsync()\n    {\n        await _db.DisposeAsync();\n        await _postgres.DisposeAsync();\n    }\n\n    [Fact]\n    public async Task AddAsync_PersistsOrder()\n    {\n        var repo = new SqlOrderRepository(_db);\n        var order = Order.Create(\"cust-1\", [new OrderItem(\"SKU-001\", 2, 10m)]);\n\n        await repo.AddAsync(order, CancellationToken.None);\n\n        var found = await repo.FindByIdAsync(order.Id, CancellationToken.None);\n        found.Should().NotBeNull();\n        found!.Items.Should().HaveCount(1);\n    }\n}\n```\n\n## Test Organization\n\n```\ntests\u002F\n  MyApp.UnitTests\u002F\n    Services\u002F\n      OrderServiceTests.cs\n      PaymentServiceTests.cs\n    Validators\u002F\n      EmailValidatorTests.cs\n  MyApp.IntegrationTests\u002F\n    Api\u002F\n      OrderApiTests.cs\n    Repositories\u002F\n      OrderRepositoryTests.cs\n  MyApp.TestHelpers\u002F\n    Builders\u002F\n      OrderBuilder.cs\n    Fixtures\u002F\n      DatabaseFixture.cs\n```\n\n## Test Data Builders\n\n```csharp\npublic sealed class OrderBuilder\n{\n    private string _customerId = \"cust-default\";\n    private readonly List\u003COrderItem> _items = [new(\"SKU-001\", 1, 10m)];\n\n    public OrderBuilder WithCustomer(string customerId)\n    {\n        _customerId = customerId;\n        return this;\n    }\n\n    public OrderBuilder WithItem(string sku, int quantity, decimal price)\n    {\n        _items.Add(new OrderItem(sku, quantity, price));\n        return this;\n    }\n\n    public Order Build() => Order.Create(_customerId, _items);\n}\n\n\u002F\u002F Usage in tests\nvar order = new OrderBuilder()\n    .WithCustomer(\"cust-vip\")\n    .WithItem(\"SKU-PREMIUM\", 3, 99.99m)\n    .Build();\n```\n\n## Common Anti-Patterns\n\n| Anti-Pattern | Fix |\n|---|---|\n| Testing implementation details | Test behavior and outcomes |\n| Shared mutable test state | Fresh instance per test (xUnit does this via constructors) |\n| `Thread.Sleep` in async tests | Use `Task.Delay` with timeout, or polling helpers |\n| Asserting on `ToString()` output | Assert on typed properties |\n| One giant assertion per test | One logical assertion per test |\n| Test names describing implementation | Name by behavior: `Method_ExpectedResult_WhenCondition` |\n| Ignoring `CancellationToken` | Always pass and verify cancellation |\n\n## Running Tests\n\n```bash\n# Run all tests\ndotnet test\n\n# Run with coverage\ndotnet test --collect:\"XPlat Code Coverage\"\n\n# Run specific project\ndotnet test tests\u002FMyApp.UnitTests\u002F\n\n# Filter by test name\ndotnet test --filter \"FullyQualifiedName~OrderService\"\n\n# Watch mode during development\ndotnet watch test --project tests\u002FMyApp.UnitTests\u002F\n```\n",{"name":5,"origin":44,"description":7},"ECC","master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fecc\u002Fcsharp-testing",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":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add S3YED\u002Fappie-kit --skill csharp-testing",{"tool":59,"command":60},"bunx","bunx skills add S3YED\u002Fappie-kit --skill csharp-testing",{"tool":62,"command":63},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill csharp-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fcsharp-testing\u002FSKILL.md",true,[],[68,102,137,163,194,219],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":83,"publishedAt":39},"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",[74,77,80],{"categoryNo":75,"categoryName":76,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":78,"categoryName":79,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101],"music","ai music","humanizer","visualization","Tools","Audio","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","generation","feature","ai music generation","music generation",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":116,"publishedAt":39},"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",[108,111],{"categoryNo":109,"categoryName":110,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136],"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":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":145,"publishedAt":39},"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",[143,144],{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":112,"categoryName":113,"taxonomyType":114,"taxonomyTypeDesc":115},[118,146,122,147,148,149,124,150,151,152,153,154,155,156,157,158,159,160,161,162],"elements","agentic webdesign agent elements","MCP","ai agent","registry","search","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":173,"publishedAt":39},"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",[169,172],{"categoryNo":170,"categoryName":171,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193],"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":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":39},"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",[200],{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218],"workflows","quality","software","software quality workflows","review","tdd","workflow","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification","for",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":232,"publishedAt":39},"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",[225,228,231],{"categoryNo":226,"categoryName":227,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":229,"categoryName":230,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[233,234,235,236,237,238,239,240,177,241,242,124,243,180,244,211,245,246,33,247],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","writing","safe","typescript","react components","modular","refactor","simplify","test-driven-development"]