[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DZEWCTMEN8SD8A2HBF9NWH":3,"skill-same:01M6DZEWCTMEN8SD8A2HBF9NWH":190},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6DZEWCTMEN8SD8A2HBF9NWH","exp-test-maintainability",null,"Detects duplicate boilerplate, copy-paste tests, and structural maintainability issues across .NET test suites. Use when the user asks to reduce repetition, consolidate similar test methods, convert copy-paste tests to data-driven parameterized tests, suggest a better test structure, or identify refactoring opportunities. Identifies repeated construction, assertion patterns, copy-paste methods convertible to DataRow\u002FTheory\u002FTestCase, redundant setup\u002Fteardown, and shared infrastructure. Produces an analysis report with concrete before\u002Fafter suggestions. Works with MSTest, xUnit, NUnit, and TUnit. DO NOT USE FOR: writing new tests (use writing-mstest-tests), reviewing test quality or anti-patterns (use test-anti-patterns), or deep mock auditing (use exp-mock-usage-analysis).","managedcode\u002Fdotnet-skills","managedcode","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F78253589?v=4","01M6DYDJR3EG8KB5G4PC65XCTT","Managed Code","01M6DYDJX0ZT432N04NYJW89DN",514,"MIT","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fexternal-sources\u002Fupstreams\u002Fdotnet-skills\u002Fplugins\u002Fdotnet-experimental\u002Fskills\u002Fexp-test-maintainability\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"test","exp test maintainability","maintainability","new","writing","when","data-driven","reduce","tunit","tests","structural","teardown","deep","shared","across","consolidate","structure","do","methods","anti-patterns","use","xunit","nunit","convert","refactoring","analysis","issues","2026-11-10 10:12:30",false,"---\nname: exp-test-maintainability\ndescription: \"Detects duplicate boilerplate, copy-paste tests, and structural maintainability issues across .NET test suites. Use when the user asks to reduce repetition, consolidate similar test methods, convert copy-paste tests to data-driven parameterized tests, suggest a better test structure, or identify refactoring opportunities. Identifies repeated construction, assertion patterns, copy-paste methods convertible to DataRow\u002FTheory\u002FTestCase, redundant setup\u002Fteardown, and shared infrastructure. Produces an analysis report with concrete before\u002Fafter suggestions. Works with MSTest, xUnit, NUnit, and TUnit. DO NOT USE FOR: writing new tests (use writing-mstest-tests), reviewing test quality or anti-patterns (use test-anti-patterns), or deep mock auditing (use exp-mock-usage-analysis).\"\nlicense: MIT\n---\n\n# Test Maintainability Assessment\n\nAnalyze .NET test code for maintainability issues: duplicated boilerplate, copy-paste test methods, and structural repetition across test methods and classes. Produce a report of refactoring opportunities with concrete before\u002Fafter suggestions. The goal is analysis only — do not modify any files.\n\n## When to Use\n\n- User asks to find duplicated code or boilerplate in tests\n- User wants to know where test code can be DRY-ed up\n- User asks to reduce test duplication, improve test readability, or clean up test boilerplate\n- User asks for refactoring opportunities in a test suite\n- User wants to identify shared setup or teardown candidates\n- User asks \"what patterns repeat across my tests?\"\n- User wants to centralize test data, introduce builders or helpers\n\n## When Not to Use\n\n- User wants to write new tests from scratch (use `writing-mstest-tests`)\n- User wants to detect anti-patterns or code smells (use `test-anti-patterns`)\n- User wants to actually perform the refactoring (help them directly, this skill only analyzes)\n\n## Inputs\n\n| Input | Required | Description |\n|-------|----------|-------------|\n| Test code | Yes | One or more test files or a test project directory to analyze |\n| Production code | No | The code under test, for context on what abstractions might help |\n| Scope | No | Whether to analyze within a single class or across multiple classes |\n\n## Workflow\n\n### Step 1: Gather the test code\n\nRead all test files the user provides or references. If the user points to a directory or project, scan for all test files using these framework markers:\n\n| Framework | Test class markers | Test method markers |\n|-----------|--------------------|---------------------|\n| MSTest | `[TestClass]` | `[TestMethod]`, `[DataTestMethod]` |\n| xUnit | *(none — convention-based)* | `[Fact]`, `[Theory]` |\n| NUnit | `[TestFixture]` | `[Test]`, `[TestCase]`, `[TestCaseSource]` |\n| TUnit | *(none — convention-based)* | `[Test]` |\n\n### Step 2: Identify maintainability issues\n\nScan for these categories:\n\n#### Category 1: Repeated object construction\n\nLook for the same object being constructed in 3+ test methods with identical or near-identical parameters.\n\n**Indicators:**\n- `new ClassName(...)` appearing with identical arguments in multiple tests\n- Multiple tests creating the same \"system under test\" with similar configuration\n- Repeated mock\u002Ffake\u002Fstub creation with the same setup\n\n**Potential refactorings:**\n- Extract a factory method or test helper (e.g., `CreateSut()`, `CreateDefaultOrder()`)\n- Use `[TestInitialize]`\u002Fconstructor\u002F`[SetUp]` for shared construction\n- Introduce a builder pattern for complex objects with many variations\n\n**Example — before:**\n```csharp\n[TestMethod]\npublic void Process_ValidOrder_Succeeds()\n{\n    var logger = new FakeLogger();\n    var email = new FakeEmailService();\n    var inventory = new FakeInventory(stock: 100);\n    var processor = new OrderProcessor(logger, email, inventory);\n    \u002F\u002F ...\n}\n\n[TestMethod]\npublic void Process_EmptyItems_Fails()\n{\n    var logger = new FakeLogger();\n    var email = new FakeEmailService();\n    var inventory = new FakeInventory(stock: 100);\n    var processor = new OrderProcessor(logger, email, inventory);\n    \u002F\u002F ...\n}\n```\n\n**After — extract factory:**\n```csharp\nprivate static OrderProcessor CreateProcessor(int stock = 100)\n{\n    return new OrderProcessor(new FakeLogger(), new FakeEmailService(), new FakeInventory(stock));\n}\n```\n\n#### Category 2: Repeated assertion patterns\n\nLook for the same sequence of assertions appearing in 3+ test methods.\n\n**Indicators:**\n- Multiple tests asserting the same set of properties on a result object\n- Repeated null-check-then-value-check sequences\n- Same collection of `Assert.AreEqual` calls across methods\n\n**Potential refactorings:**\n- Extract a custom assertion helper (e.g., `AssertValidOrder(order, expectedTotal, expectedStatus)`)\n- Use framework-specific assertion extensions\n- Introduce a `Verify` method that checks a standard set of properties\n\n#### Category 3: Copy-paste test methods\n\nLook for test methods with near-identical bodies differing only in input values or a single parameter.\n\n**Indicators:**\n- 3+ methods with the same structure but different literal values\n- Methods that could be collapsed into `[DataRow]`\u002F`[Theory]`\u002F`[TestCase]`\n- Test names that follow a pattern like `Method_Input1_Result`, `Method_Input2_Result`\n\n**Potential refactorings:**\n- Convert to parameterized tests with `[DataRow]`\u002F`[InlineData]`\u002F`[TestCase]`\n- Use `[DynamicData]`\u002F`[MemberData]`\u002F`[TestCaseSource]` for complex inputs\n- Prefer `[DataRow]` with `DisplayName` over `[DynamicData]` when all values are compile-time constants. Reserve `[DynamicData]` for computed or complex values.\n- Add `DisplayName` for non-obvious parameter values. `[DataRow(\"Gold\", 100.0, 90.0)]` is self-explanatory; `[DataRow(3, 7, 42)]` is not.\n\n#### Category 4: Duplicated setup\u002Fteardown logic\n\nLook for initialization or cleanup code repeated across test classes.\n\n**Indicators:**\n- Multiple `[TestInitialize]`\u002F`[SetUp]` methods with similar bodies\n- Repeated database seeding, file creation, or HTTP client configuration\n- Same `using`\u002F`IDisposable` cleanup pattern across classes\n\n**Potential refactorings:**\n- Extract a shared test base class or fixture\n- Use composition with a shared helper class\n- Create a test context factory\n\n#### Category 5: Repeated test infrastructure\n\nLook for structural patterns shared across test classes.\n\n**Indicators:**\n- Same mock interfaces configured identically in multiple classes\n- Repeated `HttpClient` setup with similar `DelegatingHandler` patterns\n- Same logging\u002Fconfiguration scaffolding across test classes\n\n**Potential refactorings:**\n- Extract a shared test fixture or helper library\n- Create reusable fake implementations\n- Introduce a test harness class\n\n### Step 3: Apply calibration rules\n\nBefore reporting, filter findings through these rules:\n\n- **Only report at 3+ occurrences.** Two similar setups are not boilerplate — they may be intentional clarity.\n- **Don't flag simple constructors.** `new Calculator()` or `new List\u003Cint>()` is not meaningful boilerplate. Don't recommend builders for `new User(1, \"Alice\")` either.\n- **Respect intentional verbosity.** If each test is self-contained and reads clearly on its own, explicit setup per test is a valid choice. Note it but don't flag it as a problem.\n- **Distinguish structural similarity from true duplication.** Tests that follow AAA (Arrange-Act-Assert) will look similar by nature. Only flag when the actual code (not just the structure) is duplicated.\n- **Consider the blast radius of refactoring.** A helper shared across 20 tests creates coupling. Note the trade-off.\n- **If tests are already well-maintained, say so.** A report finding only minor opportunities is perfectly valid. Acknowledge what's already good.\n\n### Step 4: Report findings\n\nPresent findings in this structure:\n\n1. **Summary** — How many patterns found, broken down by category. If the test suite is clean, lead with that.\n2. **Findings by category** — For each pattern found:\n   - Category name and description\n   - Locations: list the specific test methods and files involved\n   - The duplicated code pattern (show a representative sample)\n   - Suggested refactoring with a concrete before\u002Fafter example\n   - Estimated impact: how many lines\u002Fmethods would be simplified\n3. **Refactoring priority** — Rank findings by:\n   - Occurrence count (more occurrences = higher value)\n   - Complexity of the duplicated code (complex setup > simple construction)\n   - Risk (low-risk extractions first)\n4. **Trade-offs** — For each suggestion, note:\n   - What readability is gained\n   - What locality\u002Findependence is lost\n   - Whether it's worth it given the occurrence count\n\n## Validation\n\n- [ ] Every finding includes specific file and method locations\n- [ ] Every finding shows the actual duplicated code, not just a description\n- [ ] Every suggestion includes a concrete before\u002Fafter example\n- [ ] Findings are filtered through the 3+ occurrence threshold\n- [ ] Simple constructors are not flagged\n- [ ] Trade-offs are acknowledged for each suggestion\n- [ ] If tests are clean, the report says so upfront\n\n## Common Pitfalls\n\n| Pitfall | Solution |\n|---------|----------|\n| Flagging AAA structure as duplication | The Arrange-Act-Assert pattern is not boilerplate — flag only when the actual code repeats |\n| Suggesting extraction for 2 occurrences | Wait for 3+ before recommending extraction |\n| Recommending base classes for everything | Prefer composition (helpers, factories) over inheritance |\n| Ignoring the readability cost | Every extraction adds indirection — note the trade-off |\n| Flagging simple `new X()` as boilerplate | Only flag complex construction with multiple parameters or configuration |\n| Recommending DRY at the expense of test isolation | Tests that share mutable state through helpers become coupled — warn about this |\n","# Test Maintainability Assessment\n\nAnalyze .NET test code for maintainability issues: duplicated boilerplate, copy-paste test methods, and structural repetition across test methods and classes. Produce a report of refactoring opportunities with concrete before\u002Fafter suggestions. The goal is analysis only — do not modify any files.\n\n## When to Use\n\n- User asks to find duplicated code or boilerplate in tests\n- User wants to know where test code can be DRY-ed up\n- User asks to reduce test duplication, improve test readability, or clean up test boilerplate\n- User asks for refactoring opportunities in a test suite\n- User wants to identify shared setup or teardown candidates\n- User asks \"what patterns repeat across my tests?\"\n- User wants to centralize test data, introduce builders or helpers\n\n## When Not to Use\n\n- User wants to write new tests from scratch (use `writing-mstest-tests`)\n- User wants to detect anti-patterns or code smells (use `test-anti-patterns`)\n- User wants to actually perform the refactoring (help them directly, this skill only analyzes)\n\n## Inputs\n\n| Input | Required | Description |\n|-------|----------|-------------|\n| Test code | Yes | One or more test files or a test project directory to analyze |\n| Production code | No | The code under test, for context on what abstractions might help |\n| Scope | No | Whether to analyze within a single class or across multiple classes |\n\n## Workflow\n\n### Step 1: Gather the test code\n\nRead all test files the user provides or references. If the user points to a directory or project, scan for all test files using these framework markers:\n\n| Framework | Test class markers | Test method markers |\n|-----------|--------------------|---------------------|\n| MSTest | `[TestClass]` | `[TestMethod]`, `[DataTestMethod]` |\n| xUnit | *(none — convention-based)* | `[Fact]`, `[Theory]` |\n| NUnit | `[TestFixture]` | `[Test]`, `[TestCase]`, `[TestCaseSource]` |\n| TUnit | *(none — convention-based)* | `[Test]` |\n\n### Step 2: Identify maintainability issues\n\nScan for these categories:\n\n#### Category 1: Repeated object construction\n\nLook for the same object being constructed in 3+ test methods with identical or near-identical parameters.\n\n**Indicators:**\n- `new ClassName(...)` appearing with identical arguments in multiple tests\n- Multiple tests creating the same \"system under test\" with similar configuration\n- Repeated mock\u002Ffake\u002Fstub creation with the same setup\n\n**Potential refactorings:**\n- Extract a factory method or test helper (e.g., `CreateSut()`, `CreateDefaultOrder()`)\n- Use `[TestInitialize]`\u002Fconstructor\u002F`[SetUp]` for shared construction\n- Introduce a builder pattern for complex objects with many variations\n\n**Example — before:**\n```csharp\n[TestMethod]\npublic void Process_ValidOrder_Succeeds()\n{\n    var logger = new FakeLogger();\n    var email = new FakeEmailService();\n    var inventory = new FakeInventory(stock: 100);\n    var processor = new OrderProcessor(logger, email, inventory);\n    \u002F\u002F ...\n}\n\n[TestMethod]\npublic void Process_EmptyItems_Fails()\n{\n    var logger = new FakeLogger();\n    var email = new FakeEmailService();\n    var inventory = new FakeInventory(stock: 100);\n    var processor = new OrderProcessor(logger, email, inventory);\n    \u002F\u002F ...\n}\n```\n\n**After — extract factory:**\n```csharp\nprivate static OrderProcessor CreateProcessor(int stock = 100)\n{\n    return new OrderProcessor(new FakeLogger(), new FakeEmailService(), new FakeInventory(stock));\n}\n```\n\n#### Category 2: Repeated assertion patterns\n\nLook for the same sequence of assertions appearing in 3+ test methods.\n\n**Indicators:**\n- Multiple tests asserting the same set of properties on a result object\n- Repeated null-check-then-value-check sequences\n- Same collection of `Assert.AreEqual` calls across methods\n\n**Potential refactorings:**\n- Extract a custom assertion helper (e.g., `AssertValidOrder(order, expectedTotal, expectedStatus)`)\n- Use framework-specific assertion extensions\n- Introduce a `Verify` method that checks a standard set of properties\n\n#### Category 3: Copy-paste test methods\n\nLook for test methods with near-identical bodies differing only in input values or a single parameter.\n\n**Indicators:**\n- 3+ methods with the same structure but different literal values\n- Methods that could be collapsed into `[DataRow]`\u002F`[Theory]`\u002F`[TestCase]`\n- Test names that follow a pattern like `Method_Input1_Result`, `Method_Input2_Result`\n\n**Potential refactorings:**\n- Convert to parameterized tests with `[DataRow]`\u002F`[InlineData]`\u002F`[TestCase]`\n- Use `[DynamicData]`\u002F`[MemberData]`\u002F`[TestCaseSource]` for complex inputs\n- Prefer `[DataRow]` with `DisplayName` over `[DynamicData]` when all values are compile-time constants. Reserve `[DynamicData]` for computed or complex values.\n- Add `DisplayName` for non-obvious parameter values. `[DataRow(\"Gold\", 100.0, 90.0)]` is self-explanatory; `[DataRow(3, 7, 42)]` is not.\n\n#### Category 4: Duplicated setup\u002Fteardown logic\n\nLook for initialization or cleanup code repeated across test classes.\n\n**Indicators:**\n- Multiple `[TestInitialize]`\u002F`[SetUp]` methods with similar bodies\n- Repeated database seeding, file creation, or HTTP client configuration\n- Same `using`\u002F`IDisposable` cleanup pattern across classes\n\n**Potential refactorings:**\n- Extract a shared test base class or fixture\n- Use composition with a shared helper class\n- Create a test context factory\n\n#### Category 5: Repeated test infrastructure\n\nLook for structural patterns shared across test classes.\n\n**Indicators:**\n- Same mock interfaces configured identically in multiple classes\n- Repeated `HttpClient` setup with similar `DelegatingHandler` patterns\n- Same logging\u002Fconfiguration scaffolding across test classes\n\n**Potential refactorings:**\n- Extract a shared test fixture or helper library\n- Create reusable fake implementations\n- Introduce a test harness class\n\n### Step 3: Apply calibration rules\n\nBefore reporting, filter findings through these rules:\n\n- **Only report at 3+ occurrences.** Two similar setups are not boilerplate — they may be intentional clarity.\n- **Don't flag simple constructors.** `new Calculator()` or `new List\u003Cint>()` is not meaningful boilerplate. Don't recommend builders for `new User(1, \"Alice\")` either.\n- **Respect intentional verbosity.** If each test is self-contained and reads clearly on its own, explicit setup per test is a valid choice. Note it but don't flag it as a problem.\n- **Distinguish structural similarity from true duplication.** Tests that follow AAA (Arrange-Act-Assert) will look similar by nature. Only flag when the actual code (not just the structure) is duplicated.\n- **Consider the blast radius of refactoring.** A helper shared across 20 tests creates coupling. Note the trade-off.\n- **If tests are already well-maintained, say so.** A report finding only minor opportunities is perfectly valid. Acknowledge what's already good.\n\n### Step 4: Report findings\n\nPresent findings in this structure:\n\n1. **Summary** — How many patterns found, broken down by category. If the test suite is clean, lead with that.\n2. **Findings by category** — For each pattern found:\n   - Category name and description\n   - Locations: list the specific test methods and files involved\n   - The duplicated code pattern (show a representative sample)\n   - Suggested refactoring with a concrete before\u002Fafter example\n   - Estimated impact: how many lines\u002Fmethods would be simplified\n3. **Refactoring priority** — Rank findings by:\n   - Occurrence count (more occurrences = higher value)\n   - Complexity of the duplicated code (complex setup > simple construction)\n   - Risk (low-risk extractions first)\n4. **Trade-offs** — For each suggestion, note:\n   - What readability is gained\n   - What locality\u002Findependence is lost\n   - Whether it's worth it given the occurrence count\n\n## Validation\n\n- [ ] Every finding includes specific file and method locations\n- [ ] Every finding shows the actual duplicated code, not just a description\n- [ ] Every suggestion includes a concrete before\u002Fafter example\n- [ ] Findings are filtered through the 3+ occurrence threshold\n- [ ] Simple constructors are not flagged\n- [ ] Trade-offs are acknowledged for each suggestion\n- [ ] If tests are clean, the report says so upfront\n\n## Common Pitfalls\n\n| Pitfall | Solution |\n|---------|----------|\n| Flagging AAA structure as duplication | The Arrange-Act-Assert pattern is not boilerplate — flag only when the actual code repeats |\n| Suggesting extraction for 2 occurrences | Wait for 3+ before recommending extraction |\n| Recommending base classes for everything | Prefer composition (helpers, factories) over inheritance |\n| Ignoring the readability cost | Every extraction adds indirection — note the trade-off |\n| Flagging simple `new X()` as boilerplate | Only flag complex construction with multiple parameters or configuration |\n| Recommending DRY at the expense of test isolation | Tests that share mutable state through helpers become coupled — warn about this |\n",{"name":5,"license":15,"description":7},"main","497cc9aba79a931ac6fb8d36a48cc22fe3d6d74b","external-sources\u002Fupstreams\u002Fdotnet-skills\u002Fplugins\u002Fdotnet-experimental\u002Fskills\u002Fexp-test-maintainability",41,"https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills","https:\u002F\u002Fskills.managed-code.com","https:\u002F\u002Fgithub.com\u002Fmanagedcode","https:\u002F\u002Fwww.managed-code.com","Open Source Community for .NET Developers: Reliable, Actively Maintained, and Community-Driven. Made in Ukraine 🇺🇦 with ❤️","2026-11-12 19:59:36",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add managedcode\u002Fdotnet-skills --skill exp-test-maintainability",{"tool":72,"command":73},"bunx","bunx skills add managedcode\u002Fdotnet-skills --skill exp-test-maintainability",{"tool":75,"command":76},"pnpm","pnpm dlx skills add managedcode\u002Fdotnet-skills --skill exp-test-maintainability","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fexternal-sources\u002Fupstreams\u002Fdotnet-skills\u002Fplugins\u002Fdotnet-experimental\u002Fskills\u002Fexp-test-maintainability\u002FSKILL.md",true,[80,86,92,96,100,104,108,112,116,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"LICENSE.txt","LICENSE","许可证",11357,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002FLICENSE.txt",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fchecklist.md","REFERENCE","参考文档",5420,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Fchecklist.md",{"path":93,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fexamples.md",5621,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Fexamples.md",{"path":97,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fflowchart.md",1822,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Fflowchart.md",{"path":101,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Flanguage.md",2017,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Flanguage.md",{"path":105,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fopinion.md",1375,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Fopinion.md",{"path":109,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fsummary.md",2912,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Fsummary.md",{"path":113,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Ftechnical.md",2716,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Freferences\u002Ftechnical.md",{"path":117,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":120,"sourceHtmlUrl":121},"scripts\u002F__init__.py","SCRIPT","脚本",50,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002F__init__.py",{"path":123,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":124,"sourceHtmlUrl":125},"scripts\u002Fcontract_analyzer.py",9418,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fcontract_analyzer.py",{"path":127,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":128,"sourceHtmlUrl":129},"scripts\u002Fdocument.py",11550,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fdocument.py",{"path":131,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":132,"sourceHtmlUrl":133},"scripts\u002Ferror_handling.py",16670,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Ferror_handling.py",{"path":135,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":136,"sourceHtmlUrl":137},"scripts\u002Fmermaid_renderer.py",7086,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fmermaid_renderer.py",{"path":139,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":140,"sourceHtmlUrl":141},"scripts\u002Fooxml\u002F__init__.py",189,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002F__init__.py",{"path":143,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":144,"sourceHtmlUrl":145},"scripts\u002Fooxml\u002Fpack.py",3544,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fpack.py",{"path":147,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":148,"sourceHtmlUrl":149},"scripts\u002Fooxml\u002Funpack.py",1100,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Funpack.py",{"path":151,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":152,"sourceHtmlUrl":153},"scripts\u002Fooxml\u002Fvalidate.py",1734,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fvalidate.py",{"path":155,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":156,"sourceHtmlUrl":157},"scripts\u002Fooxml\u002Fvalidation\u002F__init__.py",433,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fvalidation\u002F__init__.py",{"path":159,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":160,"sourceHtmlUrl":161},"scripts\u002Fooxml\u002Fvalidation\u002Fbase.py",1497,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fvalidation\u002Fbase.py",{"path":163,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":164,"sourceHtmlUrl":165},"scripts\u002Fooxml\u002Fvalidation\u002Fdocx.py",311,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fvalidation\u002Fdocx.py",{"path":167,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":168,"sourceHtmlUrl":169},"scripts\u002Fooxml\u002Fvalidation\u002Fpptx.py",274,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fvalidation\u002Fpptx.py",{"path":171,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":172,"sourceHtmlUrl":173},"scripts\u002Fooxml\u002Fvalidation\u002Fredlining.py",217,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fooxml\u002Fvalidation\u002Fredlining.py",{"path":175,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":176,"sourceHtmlUrl":177},"scripts\u002Fopinion_renderer.py",4280,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fopinion_renderer.py",{"path":179,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":180,"sourceHtmlUrl":181},"scripts\u002Fsummary_renderer.py",9350,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fsummary_renderer.py",{"path":183,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":184,"sourceHtmlUrl":185},"scripts\u002Futilities.py",3132,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Futilities.py",{"path":187,"resourceType":118,"resourceTypeDesc":119,"sizeBytes":188,"sourceHtmlUrl":189},"scripts\u002Fworkflow.py",60585,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Flegal-assistant-skills-main\u002Fcontract-review\u002Fscripts\u002Fworkflow.py",[191,226,249,279,289,316],{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":205,"publishedAt":51},"01M6DYQE1Y9FHAQHEDTVFQ3447","xtwitter-scraper","Use XTwitterScraper when a .NET application needs typed access to Xquik's X automation REST API for tweet search, user lookup, posting workflows, extraction jobs, monitors, webhooks, or giveaway draws. USE FOR: integrating the XTwitterScraper NuGet package; reviewing Xquik API client usage; modeling API-key configuration, pagination, binary exports, raw responses, retries, and webhook\u002Fevent flows in .NET. DO NOT USE FOR: unrelated stacks; direct browser automation; generic social-media strategy; or code that does not call Xquik. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made.","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fcatalog\u002FLibraries\u002FXTwitterScraper\u002Fskills\u002Fxtwitter-scraper\u002FSKILL.md",[197,200],{"categoryNo":198,"categoryName":199,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":201,"categoryName":202,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225],"xtwitter scraper","browser automation","workflows","run","code","browser","search","repository","api","Media","api client","access","edit","unrelated","webhooks","files","social","commands","modeling","webhook",{"skillNo":227,"name":228,"nameZh":6,"description":229,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":230,"categories":231,"keywords":238,"publishedAt":51},"01M6DYQ9S4PE1H6G8MCH9T21HR","sep","Use Sep for high-performance separated-value parsing and writing in .NET, including delimiter inference, explicit parser\u002Fwriter options, and low-allocation row\u002Fcolumn workflows. USE FOR: delimited data needs are performance-sensitive and allocation-aware; project needs explicit control over separator inference, escaping, trimming, and header behavior;. DO NOT USE FOR: unrelated stacks; generic tasks that do not need this specific guidance. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made.","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fcatalog\u002FLibraries\u002FSep\u002Fskills\u002Fsep\u002FSKILL.md",[232,235],{"categoryNo":233,"categoryName":234,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":236,"categoryName":237,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000036","内容创作者",[228,28,239,208,240,209,213,241,242,243,218,244,219,221,41,245,246,247,223,248],"performance","tasks","data","parsing","parser","context","writer","options","project","high-performance",{"skillNo":250,"name":251,"nameZh":6,"description":252,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":253,"categories":254,"keywords":255,"publishedAt":51},"01M6DZS2DNEPXCGGF6SSCW6G5V","webgpu-threejs-tsl","Comprehensive guide for developing WebGPU-enabled Three.js applications using TSL (Three.js Shading Language). Covers WebGPU renderer setup, TSL syntax and node materials, compute shaders, post-processing effects, and WGSL integration. Use this skill when working with Three.js WebGPU, TSL shaders, node materials, or GPU compute in Three.js.","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fexternal-sources\u002Fupstreams\u002Fwebgpu-claude-skill\u002Fskills\u002Fwebgpu-threejs-tsl\u002FSKILL.md",[],[256,257,258,259,260,261,262,263,264,265,266,267,44,268,269,270,271,272,273,274,275,276,277,278,29],"webgpu","threejs","webgpu threejs tsl","setup","shaders","gpu","integration","applications","js","node","syntax","guide","language","three","compute","post","processing","with","renderer","for","materials","wgsl","effects",{"skillNo":280,"name":281,"nameZh":6,"description":282,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":283,"categories":284,"keywords":285,"publishedAt":51},"01M6DZS0BQXW2B56A289XF1X76","roslynk","Use Roslynk for semantic inspection and edits of *.cs, *.razor and *.cshtml solution files.","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fexternal-sources\u002Fupstreams\u002Froslynk\u002Fskills\u002Froslynk\u002FSKILL.md",[],[281,44,221,286,287,275,288],"semantic","razor","inspection",{"skillNo":290,"name":291,"nameZh":6,"description":292,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":293,"categories":294,"keywords":295,"publishedAt":51},"01M6DZRW6MEJCVW80K3S4XV60K","system-text-json-net11","Imperative guidance for the System.Text.Json APIs added in .NET 11: the built-in `JsonNamingPolicy.PascalCase` naming policy, and the strongly-typed generic `JsonSerializerOptions.GetTypeInfo` and `JsonSerializerOptions.TryGetTypeInfo` metadata accessors (generic overloads that return a typed `JsonTypeInfo`). USE ONLY when the user is targeting net11.0 or later and needs PascalCase JSON property or dictionary-key names without writing a custom naming policy, a strongly-typed generic `JsonTypeInfo` instead of the non-generic `JsonTypeInfo`, or a no-throw way to probe whether a type's serialization metadata is resolved. DO NOT USE when the target is earlier than net11.0, the requested behavior uses an established pre-net11 naming policy, or the user explicitly selected another JSON library.","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fexternal-sources\u002Fupstreams\u002Fdotnet-skills\u002Fplugins\u002Fdotnet11\u002Fskills\u002Fsystem-text-json-net11\u002FSKILL.md",[],[296,297,298,299,28,300,301,302,303,304,305,44,306,307,308,309,41,310,311,312,313,275,314,315,29],"system","json","text","system text json net11","policy","metadata","library","serialization","behavior","user","only","probe","guidance","later","type","dictionary","naming","targeting","custom","generic",{"skillNo":317,"name":318,"nameZh":6,"description":319,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":320,"categories":321,"keywords":324,"publishedAt":51},"01M6DZRRJP3S662NFSG1RSPQQ7","process-api-net11","Provides guidance on the new System.Diagnostics.Process APIs introduced in .NET 11: Process.Run, Process.RunAndCaptureText, Process.StartAndForget, Process.ReadAllText\u002FBytes\u002FLines, KillOnParentExit, InheritedHandles, and StartDetached. USE FOR: starting, orchestrating, or capturing output from external processes in applications targeting net11.0 or later. DO NOT USE FOR: applications targeting .NET 10 or earlier, or basic pre-.NET 11 Process.Start usage without new APIs.","https:\u002F\u002Fgithub.com\u002Fmanagedcode\u002Fdotnet-skills\u002Fblob\u002Fmain\u002Fexternal-sources\u002Fupstreams\u002Fdotnet-skills\u002Fplugins\u002Fdotnet11\u002Fskills\u002Fprocess-api-net11\u002FSKILL.md",[322,323],{"categoryNo":198,"categoryName":199,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":201,"categoryName":202,"taxonomyType":203,"taxonomyTypeDesc":204},[214,325,326,327,209,328,263,296,44,308,309,41,329,330,331,332,313,275,27],"process","process api net11","diagnostics","start","basic","processes","output","usage"]