[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ADWD29GA1F5CWPBKS2DED7":3,"skill-same:01M6ADWD29GA1F5CWPBKS2DED7":87},{"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":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6ADWD29GA1F5CWPBKS2DED7","mvvm-toolkit-di",null,"Wire CommunityToolkit.Mvvm ViewModels into Microsoft.Extensions.DependencyInjection. Covers the .NET Generic Host composition root, constructor injection, service lifetimes (Singleton \u002F Transient \u002F Scoped), IMessenger registration, resolving ViewModels in Views, keyed services, testing seams, and the legacy Ioc.Default escape hatch. Use across WPF, WinUI 3, .NET MAUI, Uno, and Avalonia.","github\u002Fawesome-copilot","github","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9919?v=4","01M6AC83DS133TPXFSP1DHNCC6","GitHub","01M6AD3PBDYPK7NVFJNJ66Y8RS",41046,"MIT","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fmvvm-toolkit-di\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],"mvvm","di","mvvm toolkit","mvvm toolkit di","toolkit","default","microsoft","generic","singleton","scoped","avalonia","host","hatch","registration","wpf","Legacy","testing","use","Composition","winui","ioc","services","2026-11-10 10:12:30",false,"---\nname: mvvm-toolkit-di\ndescription: 'Wire CommunityToolkit.Mvvm ViewModels into Microsoft.Extensions.DependencyInjection. Covers the .NET Generic Host composition root, constructor injection, service lifetimes (Singleton \u002F Transient \u002F Scoped), IMessenger registration, resolving ViewModels in Views, keyed services, testing seams, and the legacy Ioc.Default escape hatch. Use across WPF, WinUI 3, .NET MAUI, Uno, and Avalonia.'\n---\n\n# CommunityToolkit.Mvvm + `Microsoft.Extensions.DependencyInjection`\n\nThe MVVM Toolkit deliberately ships **no DI container** — it composes with\n`Microsoft.Extensions.DependencyInjection`, the same container ASP.NET\nCore, Worker services, and the .NET Generic Host use.\n\n> **TL;DR.** Build the service provider once at startup (prefer\n> `Host.CreateDefaultBuilder()`). Register services and ViewModels.\n> Inject through constructors. Avoid `Ioc.Default.GetService\u003CT>()`\n> in user code.\n\n---\n\n## When to use this skill\n\n- Standing up the composition root for a new XAML app (WPF, WinUI 3,\n  MAUI, Uno, Avalonia)\n- Choosing service\u002FVM lifetimes\n- Wiring `IMessenger` once and injecting it into `ObservableRecipient`\n  ViewModels\n- Resolving a page's ViewModel without coupling to a service locator\n- Diagnosing \"Unable to resolve service for type X while attempting to\n  activate Y\"\n\nFor source generators and ViewModel patterns see the **`mvvm-toolkit`**\nskill. For Messenger pub\u002Fsub see **`mvvm-toolkit-messenger`**.\n\n---\n\n## Recommended composition root (Generic Host)\n\n```csharp\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing CommunityToolkit.Mvvm.Messaging;\n\npublic partial class App : Application\n{\n    public IHost Host { get; }\n\n    public App()\n    {\n        Host = Microsoft.Extensions.Hosting.Host\n            .CreateDefaultBuilder()\n            .ConfigureServices((_, services) =>\n            {\n                services.AddSingleton\u003CIFilesService, FilesService>();\n                services.AddSingleton\u003CISettingsService, SettingsService>();\n                services.AddSingleton\u003CIMessenger>(WeakReferenceMessenger.Default);\n\n                services.AddSingleton\u003CShellViewModel>();\n                services.AddTransient\u003CContactViewModel>();\n                services.AddTransient\u003CEditorViewModel>();\n            })\n            .Build();\n    }\n\n    public static T GetService\u003CT>() where T : class =>\n        ((App)Current).Host.Services.GetRequiredService\u003CT>();\n}\n```\n\nGeneric Host benefits:\n\n- `appsettings.json` binding via `Microsoft.Extensions.Configuration`\n- Logging via `Microsoft.Extensions.Logging`\n- Hosted services (`IHostedService`) for background work\n- Scope validation in development builds\n\n> WPF and Windows Forms must integrate the host lifetime with the app\n> lifetime — see\n> [Use the .NET Generic Host in a WPF app](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fdesktop\u002Fwpf\u002Fapp-development\u002Fhow-to-use-host-builder).\n\n### Without Generic Host\n\nWhen you only need a service container and want zero extra dependencies:\n\n```csharp\nvar services = new ServiceCollection();\nservices.AddSingleton\u003CIFilesService, FilesService>();\nservices.AddTransient\u003CContactViewModel>();\nServiceProvider provider = services.BuildServiceProvider();\n```\n\n---\n\n## Constructor injection\n\nInject services and child ViewModels through the constructor:\n\n```csharp\npublic sealed partial class ContactViewModel(\n    IFilesService files,\n    IMessenger messenger,\n    ILogger\u003CContactViewModel> logger)\n    : ObservableRecipient(messenger)\n{\n    [ObservableProperty]\n    private string? name;\n\n    [RelayCommand]\n    private async Task SaveAsync()\n    {\n        logger.LogInformation(\"Saving {Name}\", Name);\n        await files.SaveAsync(Name!);\n    }\n}\n```\n\nWhy constructor injection beats a service locator:\n\n- Dependencies are explicit and visible at the call site\n- Unit tests inject fakes\u002Fmocks directly\n- The DI container validates the dependency graph at startup\n- Missing registrations throw immediately, not at first use\n\n---\n\n## Lifetimes\n\n| Lifetime | Method | Typical use in XAML apps |\n|----------|--------|--------------------------|\n| Singleton | `AddSingleton\u003CT>` | Shell\u002Fmain-window VM, settings, file\u002FHTTP services, the shared `IMessenger`, app-wide caches |\n| Transient | `AddTransient\u003CT>` | Per-page or per-document ViewModels (a fresh instance every resolve) |\n| Scoped | `AddScoped\u003CT>` | Rarely needed in client apps; useful with explicit `IServiceScope` (e.g., per-window scopes) |\n\n```csharp\nservices.AddSingleton\u003CShellViewModel>();   \u002F\u002F 1 instance for app lifetime\nservices.AddTransient\u003CNoteViewModel>();    \u002F\u002F new instance per resolve\nservices.AddScoped\u003CDialogService>();       \u002F\u002F 1 per scope (rare)\n```\n\n---\n\n## Resolving in a View\n\nResolve the page's root ViewModel in code-behind, then let it pull its\nown dependencies:\n\n```csharp\npublic sealed partial class ContactPage : Page\n{\n    public ContactViewModel ViewModel { get; }\n\n    public ContactPage()\n    {\n        ViewModel = App.GetService\u003CContactViewModel>();\n        InitializeComponent();\n    }\n}\n```\n\nBind in XAML with `{x:Bind ViewModel.Xxx}` (compiled bindings) or\n`{Binding Xxx}` against `DataContext`.\n\nFor navigation frameworks (WinUI 3 `Frame.Navigate`, MAUI Shell, Prism,\nMVVMCross), let the framework resolve the page and the page resolves its\nViewModel from DI. Don't `new` ViewModels manually.\n\n---\n\n## `IMessenger` registration\n\nRegister the messenger you want once, inject `IMessenger` everywhere:\n\n```csharp\nservices.AddSingleton\u003CIMessenger>(WeakReferenceMessenger.Default);\n\u002F\u002F or\nservices.AddSingleton\u003CIMessenger>(StrongReferenceMessenger.Default);\n```\n\nThen:\n\n```csharp\npublic sealed partial class MyViewModel(IMessenger messenger)\n    : ObservableRecipient(messenger) { }\n```\n\nFor per-window messengers, register with keyed services or as scoped\ninstances and inject into per-window ViewModels.\n\nSee the **`mvvm-toolkit-messenger`** skill for the messenger surface area.\n\n---\n\n## Keyed services (.NET 8+)\n\nResolve different implementations of the same interface by key:\n\n```csharp\nservices.AddKeyedSingleton\u003CIExporter, CsvExporter>(\"csv\");\nservices.AddKeyedSingleton\u003CIExporter, JsonExporter>(\"json\");\n\npublic sealed partial class ExportViewModel(\n    [FromKeyedServices(\"csv\")] IExporter csvExporter,\n    [FromKeyedServices(\"json\")] IExporter jsonExporter)\n    : ObservableObject { \u002F* ... *\u002F }\n```\n\n---\n\n## Testing seams\n\nConstructor-injected dependencies are trivial to swap in tests. With\n`Moq`:\n\n```csharp\n[Fact]\npublic async Task Save_calls_files_service()\n{\n    var files = new Mock\u003CIFilesService>();\n    var messenger = new WeakReferenceMessenger();\n    var logger = NullLogger\u003CContactViewModel>.Instance;\n\n    var vm = new ContactViewModel(files.Object, messenger, logger)\n    {\n        Name = \"Ada\"\n    };\n\n    await vm.SaveCommand.ExecuteAsync(null);\n\n    files.Verify(f => f.SaveAsync(\"Ada\"), Times.Once);\n}\n```\n\nIf you're mocking `Ioc.Default` or static state, the ViewModel is using a\nservice locator — refactor to constructor injection.\n\n---\n\n## Legacy: `Ioc.Default`\n\n`CommunityToolkit.Mvvm.DependencyInjection.Ioc` is an escape hatch for\ncases where constructor injection is impossible — XAML-instantiated VMs\nfor design-time data, `ValueConverter`s, control templates.\n\n```csharp\nIoc.Default.ConfigureServices(\n    new ServiceCollection()\n        .AddSingleton\u003CIFilesService, FilesService>()\n        .AddTransient\u003CContactViewModel>()\n        .BuildServiceProvider());\n\nvar files = Ioc.Default.GetRequiredService\u003CIFilesService>();\n```\n\nTreat it as the last resort. Inside ViewModels, services, and any class\nthe DI container can construct, prefer constructor injection.\n\n---\n\n## Common pitfalls\n\n1. **`Ioc.Default.GetService\u003CT>()` inside a VM constructor.** Hides the\n   dependency, breaks unit tests, prevents startup graph validation.\n2. **Everything `Singleton`.** A \"per-document\" VM registered as singleton\n   becomes shared state across all documents — subtle data corruption.\n   Use `AddTransient` for per-instance VMs.\n3. **Multiple `BuildServiceProvider()` calls.** Each call is a fresh\n   container — singletons aren't shared. Build once at startup.\n4. **Capturing `IServiceProvider` in long-lived objects.** Indicates a\n   service-locator pattern. Inject the specific dependencies you need.\n5. **No scope validation in development.** Use `Host.CreateDefaultBuilder()`\n   (which sets `ValidateScopes` and `ValidateOnBuild` in development) so\n   registration mistakes fail at startup, not at first use.\n6. **Resolving scoped services from the root provider.** They're\n   effectively promoted to singleton lifetime — the warning is silent\n   without scope validation. Either change the lifetime or resolve from\n   an explicit `IServiceScope`.\n\n---\n\n## References\n\n| Topic | File |\n|-------|------|\n| Full deep dive (Generic Host setup, lifetimes, keyed services, testing patterns, legacy Ioc) | [`references\u002Fdependency-injection.md`](references\u002Fdependency-injection.md) |\n\nExternal:\n\n- DI overview: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Fextensions\u002Fdependency-injection>\n- DI usage: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Fextensions\u002Fdependency-injection-usage>\n- MVVM Toolkit Ioc page: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcommunitytoolkit\u002Fmvvm\u002Fioc>\n- Generic Host: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Fextensions\u002Fgeneric-host>\n","# CommunityToolkit.Mvvm + `Microsoft.Extensions.DependencyInjection`\n\nThe MVVM Toolkit deliberately ships **no DI container** — it composes with\n`Microsoft.Extensions.DependencyInjection`, the same container ASP.NET\nCore, Worker services, and the .NET Generic Host use.\n\n> **TL;DR.** Build the service provider once at startup (prefer\n> `Host.CreateDefaultBuilder()`). Register services and ViewModels.\n> Inject through constructors. Avoid `Ioc.Default.GetService\u003CT>()`\n> in user code.\n\n---\n\n## When to use this skill\n\n- Standing up the composition root for a new XAML app (WPF, WinUI 3,\n  MAUI, Uno, Avalonia)\n- Choosing service\u002FVM lifetimes\n- Wiring `IMessenger` once and injecting it into `ObservableRecipient`\n  ViewModels\n- Resolving a page's ViewModel without coupling to a service locator\n- Diagnosing \"Unable to resolve service for type X while attempting to\n  activate Y\"\n\nFor source generators and ViewModel patterns see the **`mvvm-toolkit`**\nskill. For Messenger pub\u002Fsub see **`mvvm-toolkit-messenger`**.\n\n---\n\n## Recommended composition root (Generic Host)\n\n```csharp\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing CommunityToolkit.Mvvm.Messaging;\n\npublic partial class App : Application\n{\n    public IHost Host { get; }\n\n    public App()\n    {\n        Host = Microsoft.Extensions.Hosting.Host\n            .CreateDefaultBuilder()\n            .ConfigureServices((_, services) =>\n            {\n                services.AddSingleton\u003CIFilesService, FilesService>();\n                services.AddSingleton\u003CISettingsService, SettingsService>();\n                services.AddSingleton\u003CIMessenger>(WeakReferenceMessenger.Default);\n\n                services.AddSingleton\u003CShellViewModel>();\n                services.AddTransient\u003CContactViewModel>();\n                services.AddTransient\u003CEditorViewModel>();\n            })\n            .Build();\n    }\n\n    public static T GetService\u003CT>() where T : class =>\n        ((App)Current).Host.Services.GetRequiredService\u003CT>();\n}\n```\n\nGeneric Host benefits:\n\n- `appsettings.json` binding via `Microsoft.Extensions.Configuration`\n- Logging via `Microsoft.Extensions.Logging`\n- Hosted services (`IHostedService`) for background work\n- Scope validation in development builds\n\n> WPF and Windows Forms must integrate the host lifetime with the app\n> lifetime — see\n> [Use the .NET Generic Host in a WPF app](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fdesktop\u002Fwpf\u002Fapp-development\u002Fhow-to-use-host-builder).\n\n### Without Generic Host\n\nWhen you only need a service container and want zero extra dependencies:\n\n```csharp\nvar services = new ServiceCollection();\nservices.AddSingleton\u003CIFilesService, FilesService>();\nservices.AddTransient\u003CContactViewModel>();\nServiceProvider provider = services.BuildServiceProvider();\n```\n\n---\n\n## Constructor injection\n\nInject services and child ViewModels through the constructor:\n\n```csharp\npublic sealed partial class ContactViewModel(\n    IFilesService files,\n    IMessenger messenger,\n    ILogger\u003CContactViewModel> logger)\n    : ObservableRecipient(messenger)\n{\n    [ObservableProperty]\n    private string? name;\n\n    [RelayCommand]\n    private async Task SaveAsync()\n    {\n        logger.LogInformation(\"Saving {Name}\", Name);\n        await files.SaveAsync(Name!);\n    }\n}\n```\n\nWhy constructor injection beats a service locator:\n\n- Dependencies are explicit and visible at the call site\n- Unit tests inject fakes\u002Fmocks directly\n- The DI container validates the dependency graph at startup\n- Missing registrations throw immediately, not at first use\n\n---\n\n## Lifetimes\n\n| Lifetime | Method | Typical use in XAML apps |\n|----------|--------|--------------------------|\n| Singleton | `AddSingleton\u003CT>` | Shell\u002Fmain-window VM, settings, file\u002FHTTP services, the shared `IMessenger`, app-wide caches |\n| Transient | `AddTransient\u003CT>` | Per-page or per-document ViewModels (a fresh instance every resolve) |\n| Scoped | `AddScoped\u003CT>` | Rarely needed in client apps; useful with explicit `IServiceScope` (e.g., per-window scopes) |\n\n```csharp\nservices.AddSingleton\u003CShellViewModel>();   \u002F\u002F 1 instance for app lifetime\nservices.AddTransient\u003CNoteViewModel>();    \u002F\u002F new instance per resolve\nservices.AddScoped\u003CDialogService>();       \u002F\u002F 1 per scope (rare)\n```\n\n---\n\n## Resolving in a View\n\nResolve the page's root ViewModel in code-behind, then let it pull its\nown dependencies:\n\n```csharp\npublic sealed partial class ContactPage : Page\n{\n    public ContactViewModel ViewModel { get; }\n\n    public ContactPage()\n    {\n        ViewModel = App.GetService\u003CContactViewModel>();\n        InitializeComponent();\n    }\n}\n```\n\nBind in XAML with `{x:Bind ViewModel.Xxx}` (compiled bindings) or\n`{Binding Xxx}` against `DataContext`.\n\nFor navigation frameworks (WinUI 3 `Frame.Navigate`, MAUI Shell, Prism,\nMVVMCross), let the framework resolve the page and the page resolves its\nViewModel from DI. Don't `new` ViewModels manually.\n\n---\n\n## `IMessenger` registration\n\nRegister the messenger you want once, inject `IMessenger` everywhere:\n\n```csharp\nservices.AddSingleton\u003CIMessenger>(WeakReferenceMessenger.Default);\n\u002F\u002F or\nservices.AddSingleton\u003CIMessenger>(StrongReferenceMessenger.Default);\n```\n\nThen:\n\n```csharp\npublic sealed partial class MyViewModel(IMessenger messenger)\n    : ObservableRecipient(messenger) { }\n```\n\nFor per-window messengers, register with keyed services or as scoped\ninstances and inject into per-window ViewModels.\n\nSee the **`mvvm-toolkit-messenger`** skill for the messenger surface area.\n\n---\n\n## Keyed services (.NET 8+)\n\nResolve different implementations of the same interface by key:\n\n```csharp\nservices.AddKeyedSingleton\u003CIExporter, CsvExporter>(\"csv\");\nservices.AddKeyedSingleton\u003CIExporter, JsonExporter>(\"json\");\n\npublic sealed partial class ExportViewModel(\n    [FromKeyedServices(\"csv\")] IExporter csvExporter,\n    [FromKeyedServices(\"json\")] IExporter jsonExporter)\n    : ObservableObject { \u002F* ... *\u002F }\n```\n\n---\n\n## Testing seams\n\nConstructor-injected dependencies are trivial to swap in tests. With\n`Moq`:\n\n```csharp\n[Fact]\npublic async Task Save_calls_files_service()\n{\n    var files = new Mock\u003CIFilesService>();\n    var messenger = new WeakReferenceMessenger();\n    var logger = NullLogger\u003CContactViewModel>.Instance;\n\n    var vm = new ContactViewModel(files.Object, messenger, logger)\n    {\n        Name = \"Ada\"\n    };\n\n    await vm.SaveCommand.ExecuteAsync(null);\n\n    files.Verify(f => f.SaveAsync(\"Ada\"), Times.Once);\n}\n```\n\nIf you're mocking `Ioc.Default` or static state, the ViewModel is using a\nservice locator — refactor to constructor injection.\n\n---\n\n## Legacy: `Ioc.Default`\n\n`CommunityToolkit.Mvvm.DependencyInjection.Ioc` is an escape hatch for\ncases where constructor injection is impossible — XAML-instantiated VMs\nfor design-time data, `ValueConverter`s, control templates.\n\n```csharp\nIoc.Default.ConfigureServices(\n    new ServiceCollection()\n        .AddSingleton\u003CIFilesService, FilesService>()\n        .AddTransient\u003CContactViewModel>()\n        .BuildServiceProvider());\n\nvar files = Ioc.Default.GetRequiredService\u003CIFilesService>();\n```\n\nTreat it as the last resort. Inside ViewModels, services, and any class\nthe DI container can construct, prefer constructor injection.\n\n---\n\n## Common pitfalls\n\n1. **`Ioc.Default.GetService\u003CT>()` inside a VM constructor.** Hides the\n   dependency, breaks unit tests, prevents startup graph validation.\n2. **Everything `Singleton`.** A \"per-document\" VM registered as singleton\n   becomes shared state across all documents — subtle data corruption.\n   Use `AddTransient` for per-instance VMs.\n3. **Multiple `BuildServiceProvider()` calls.** Each call is a fresh\n   container — singletons aren't shared. Build once at startup.\n4. **Capturing `IServiceProvider` in long-lived objects.** Indicates a\n   service-locator pattern. Inject the specific dependencies you need.\n5. **No scope validation in development.** Use `Host.CreateDefaultBuilder()`\n   (which sets `ValidateScopes` and `ValidateOnBuild` in development) so\n   registration mistakes fail at startup, not at first use.\n6. **Resolving scoped services from the root provider.** They're\n   effectively promoted to singleton lifetime — the warning is silent\n   without scope validation. Either change the lifetime or resolve from\n   an explicit `IServiceScope`.\n\n---\n\n## References\n\n| Topic | File |\n|-------|------|\n| Full deep dive (Generic Host setup, lifetimes, keyed services, testing patterns, legacy Ioc) | [`references\u002Fdependency-injection.md`](references\u002Fdependency-injection.md) |\n\nExternal:\n\n- DI overview: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Fextensions\u002Fdependency-injection>\n- DI usage: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Fextensions\u002Fdependency-injection-usage>\n- MVVM Toolkit Ioc page: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcommunitytoolkit\u002Fmvvm\u002Fioc>\n- Generic Host: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Fextensions\u002Fgeneric-host>\n",{"name":5,"description":7},"main","5269f7ea2d6c3a9bfda5ed878b6726cf509121fd","skills\u002Fmvvm-toolkit-di",5340,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot","https:\u002F\u002Fawesome-copilot.github.com\u002F","https:\u002F\u002Fgithub.com\u002Fgithub","https:\u002F\u002Fgithub.com\u002Fabout","How people build software.","2026-11-11 13:41:32",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add github\u002Fawesome-copilot --skill mvvm-toolkit-di",{"tool":67,"command":68},"bunx","bunx skills add github\u002Fawesome-copilot --skill mvvm-toolkit-di",{"tool":70,"command":71},"pnpm","pnpm dlx skills add github\u002Fawesome-copilot --skill mvvm-toolkit-di","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fmvvm-toolkit-di\u002FSKILL.md",true,[75,81],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fdependency-injection.md","REFERENCE","参考文档",8186,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fmvvm-toolkit-di\u002Freferences\u002Fdependency-injection.md",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"SKILL.md.tmpl","OTHER","其他",2724,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fgstack\u002Fsetup-browser-cookies\u002FSKILL.md.tmpl",[88,118,146,175,209,226],{"skillNo":89,"name":90,"nameZh":6,"description":91,"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":98,"publishedAt":46},"01M70KXZNX9ES38N2A8M58ZZMZ","supabase-rls-policies","Write, review, and test Supabase Row Level Security (RLS) policies so that one user cannot read or change another user's rows. Use when creating or changing tables, policies, views, or security definer functions in a Supabase project, when reviewing a migration that touches RLS, or when asked to prove user isolation with pgTAP tests that sign in as two users.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fsupabase-rls-policies\u002FSKILL.md",[94,95],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,41,115,116,117],"supabase","rls","supabase rls","supabase rls policies","project","when","review","change","read","write","security","isolation","tables","as","tests","prove","users","functions","with",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":125,"publishedAt":46},"01M70KWA5YWXDV6V8DZ19E3T2Y","skill-distribution-audit","Audit a skill collection before release or investigate installer omissions, archived\u002Ftemplate leakage, duplicate identities, and manifest drift. Reconcile the intended public source set, distribution manifest, and actual discovery output for a specified consumer version. Includes a deterministic set-comparison helper.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fskill-distribution-audit\u002FSKILL.md",[124],{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},[126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145],"distribution","skill distribution audit","audit","SET","deterministic","installer","for","discovery","comparison","helper","manifest","version","collection","drift","output","investigate","duplicate","template","release","reconcile",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":158,"publishedAt":46},"01M70KCJPFVW7PPQ49CC5R8JGK","logicapps-custom-code-net10-migration","Migrate Azure Logic Apps Standard local-function custom-code projects from .NET 8 to .NET 10. Use for legacy Logic Apps custom-code workspace upgrades, project\u002Fpackage configuration, custom-worker settings, publication, and integrated VS Code debugging. Not for ordinary .NET applications, standalone Azure Functions, Consumption workflows, or cloud deployment.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FSKILL.md",[153],{"categoryNo":154,"categoryName":155,"taxonomyType":156,"taxonomyTypeDesc":157},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[159,160,161,162,163,164,132,103,165,166,167,168,169,170,171,41,172,39,173,174],"custom","code","logicapps custom code net10 migration","migration","projects","standalone","deployment","applications","local","azure","worker","upgrades","package","apps","debugging","workflows",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":179,"sourceHtmlUrl":180,"categories":181,"keywords":186,"publishedAt":46},"01M6AEBN37RQMXJ3298PEY7PG1","winmd-api-search","Find and explore Windows desktop APIs. Use when building features that need platform capabilities — camera, file access, notifications, UI controls, AI\u002FML, sensors, networking, etc. Discovers the right API for a task and retrieves full type details (methods, properties, events, enumeration values).","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FSKILL.md",[182,185],{"categoryNo":183,"categoryName":184,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":154,"categoryName":155,"taxonomyType":156,"taxonomyTypeDesc":157},[187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,104,202,203,204,205,206,132,207,208],"winmd api search","search","api","windows","desktop","file access","enumeration","ui","ml","file","networking","capabilities","notifications","explore","access","features","full","camera","events","platform","methods","controls",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":213,"licenseFileUrl":214,"sourceHtmlUrl":215,"categories":216,"keywords":222,"publishedAt":46},"01M6AE571R3SC1ZGE202B3NB5S","resemble-detect","Deepfake detection and media safety — detect AI-generated audio, images, video, and text, trace synthesis sources, apply watermarks, verify speaker identity, and analyze media intelligence using Resemble AI","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FSKILL.md",[217,218,221],{"categoryNo":183,"categoryName":184,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":219,"categoryName":220,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},[223,129,196,224,225],"resemble detect","https","identity",{"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":213,"licenseFileUrl":230,"sourceHtmlUrl":231,"categories":232,"keywords":237,"publishedAt":46},"01M6AE30BSK2HCY4TQQ22Z8JRD","quality-playbook","Run a complete quality engineering audit on any codebase. Derives behavioral requirements from the code, generates spec-traced functional tests, runs a three-pass code review with regression tests, executes a multi-model spec audit (Council of Three), and produces a consolidated bug report with TDD-verified patches. Finds the 35% of real defects that structural code review alone cannot catch. Works with any language. Trigger on 'quality playbook', 'spec audit', 'Council of Three', 'fitness-to-purpose', or 'coverage theater'.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FSKILL.md",[233,236],{"categoryNo":234,"categoryName":235,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},[238,239,240,241,160,105,9,128,242,243,224,244,245,246,247,248,249,250,251,252,253,254,113,255,256,257,258],"playbook","quality playbook","quality","code review","tdd","run","report","spec","bug report","council","engineering","functional","spec audit","bug","verified","multi-model","three","coverage","model","regression","structural"]