[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CB9Q3NCVJB7F2F1D502MS9":3,"skill-same:01M6CB9Q3NCVJB7F2F1D502MS9":59},{"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":18,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":36,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":38,"install":39,"resources":52},"01M6CB9Q3NCVJB7F2F1D502MS9","dotnet",null,"Clean Architecture principles and C# conventions for .NET projects","shahboura\u002Fagents-opencode","shahboura","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F210767?v=4","01M6C6WKTBT0NH92BEPQRHQSYM","Shehab El Hadidy","01M6C6WKYXG8AE68MCGBNE5ZFR",2,"MIT","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002F.opencode\u002Fskills\u002Fdotnet\u002FSKILL.md",[],[5,19,20,21,22],"architecture","development","projects","opencode","2026-11-10 10:12:30",false,"---\nname: dotnet\ndescription: Clean Architecture principles and C# conventions for .NET projects\nlicense: MIT\ncompatibility: opencode\nmetadata:\n  author: shahboura\n  version: \"2.0.0\"\n  audience: developers\n  workflow: development\n---\n\n## What I do\n- Enforce Clean Architecture layer boundaries and dependency direction\n- Apply C# coding standards with async safety and nullable correctness\n- Guide Entity Framework Core configuration and query optimization\n\n## When to use me\nUse this when working on .NET\u002FC# projects that follow Clean Architecture patterns.\n\n## Key Rules\n- Dependency direction: Domain → Application → Infrastructure → WebAPI (inner layers must never reference outer)\n- ALWAYS pass `CancellationToken` through async methods — no exceptions\n- Enable `\u003CNullable>enable\u003C\u002FNullable>` in all .csproj files; use `string?` for nullable, `string.Empty` for non-nullable defaults\n- Constructor injection only — never use property or field injection\n- Use `IEntityTypeConfiguration\u003CT>` for all EF entity configs; never configure in `OnModelCreating` directly\n- Use `AsNoTracking()` for all read-only queries; project to DTOs with `.Select()` early\n- Use `record` types for DTOs, not classes\n- Apply `sealed` to classes that should not be inherited\n- Use `required` keyword (C# 11+) for required properties instead of constructor enforcement\n- Prefer `is not null` over `!= null`; use `nameof()` in exception parameter names\n- Interfaces belong in the Application layer; implementations in Infrastructure\n- Use a verify-fix-verify loop: run the validation commands below, fix any failures, and rerun until all checks pass\n\n## Validation Commands\n```bash\ndotnet restore\ndotnet build\ndotnet format\ndotnet test\n```\n\nSee `references\u002Fclean-architecture-examples.md` for worked examples.\n","## What I do\n- Enforce Clean Architecture layer boundaries and dependency direction\n- Apply C# coding standards with async safety and nullable correctness\n- Guide Entity Framework Core configuration and query optimization\n\n## When to use me\nUse this when working on .NET\u002FC# projects that follow Clean Architecture patterns.\n\n## Key Rules\n- Dependency direction: Domain → Application → Infrastructure → WebAPI (inner layers must never reference outer)\n- ALWAYS pass `CancellationToken` through async methods — no exceptions\n- Enable `\u003CNullable>enable\u003C\u002FNullable>` in all .csproj files; use `string?` for nullable, `string.Empty` for non-nullable defaults\n- Constructor injection only — never use property or field injection\n- Use `IEntityTypeConfiguration\u003CT>` for all EF entity configs; never configure in `OnModelCreating` directly\n- Use `AsNoTracking()` for all read-only queries; project to DTOs with `.Select()` early\n- Use `record` types for DTOs, not classes\n- Apply `sealed` to classes that should not be inherited\n- Use `required` keyword (C# 11+) for required properties instead of constructor enforcement\n- Prefer `is not null` over `!= null`; use `nameof()` in exception parameter names\n- Interfaces belong in the Application layer; implementations in Infrastructure\n- Use a verify-fix-verify loop: run the validation commands below, fix any failures, and rerun until all checks pass\n\n## Validation Commands\n```bash\ndotnet restore\ndotnet build\ndotnet format\ndotnet test\n```\n\nSee `references\u002Fclean-architecture-examples.md` for worked examples.\n",{"name":5,"license":15,"metadata":28,"description":7,"compatibility":22},{"author":9,"version":29,"audience":30,"workflow":20},"2.0.0","developers","main","9b951b5b2e5d07d427baff330db5deb2a8c67511",".opencode\u002Fskills\u002Fdotnet",0,"https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode","https:\u002F\u002Fagnts.elkodr.com\u002F","https:\u002F\u002Fgithub.com\u002Fshahboura","2026-11-05 13:30:42",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add shahboura\u002Fagents-opencode --skill dotnet",{"tool":45,"command":46},"bunx","bunx skills add shahboura\u002Fagents-opencode --skill dotnet",{"tool":48,"command":49},"pnpm","pnpm dlx skills add shahboura\u002Fagents-opencode --skill dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002F.opencode\u002Fskills\u002Fdotnet\u002FSKILL.md",true,[53],{"path":54,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Fclean-architecture-examples.md","REFERENCE","参考文档",3744,"https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002F.opencode\u002Fskills\u002Fdotnet\u002Freferences\u002Fclean-architecture-examples.md",[60,66,75,80,85,90],{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":23},"01M6CBBX1C6NV7VY8XK21DV5FW","python","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Fvalidate-agents\u002Fvalid\u002F.opencode\u002Fskills\u002Fpython\u002FSKILL.md",[],[62],{"skillNo":67,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":23},"01M6CBBVB7W6ABJH8XP3Z8PPMK","docs-validation","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Fvalidate-agents\u002Fvalid\u002F.opencode\u002Fskills\u002Fdocs-validation\u002FSKILL.md",[],[72,73,74],"docs","validation","docs validation",{"skillNo":76,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":23},"01M6CBBT2WC781609MH5RN7KM7","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Fvalidate-agents\u002Funknown-skill\u002F.opencode\u002Fskills\u002Fpython\u002FSKILL.md",[],[62],{"skillNo":81,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":23},"01M6CBBRNY6TDRZ5627GC8436D","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Fvalidate-agents\u002Funknown-skill\u002F.opencode\u002Fskills\u002Fdocs-validation\u002FSKILL.md",[],[72,73,74],{"skillNo":86,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":23},"01M6CBBQDS170GBYA1CVW3DC5D","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Fvalidate-agents\u002Finline-skill\u002F.opencode\u002Fskills\u002Fpython\u002FSKILL.md",[],[62],{"skillNo":91,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":23},"01M6CBBP222WAW802YHY37F48A","https:\u002F\u002Fgithub.com\u002Fshahboura\u002Fagents-opencode\u002Fblob\u002Fmain\u002Fscripts\u002Ffixtures\u002Fvalidate-agents\u002Finline-skill\u002F.opencode\u002Fskills\u002Fdocs-validation\u002FSKILL.md",[],[72,73,74]]