[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ADWG0QHDNAY9X4654CQ9FF":3,"skill-same:01M6ADWG0QHDNAY9X4654CQ9FF":79},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":48,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6ADWG0QHDNAY9X4654CQ9FF","mvvm-toolkit-messenger",null,"CommunityToolkit.Mvvm Messenger pub\u002Fsub for decoupled communication between ViewModels (or any objects). Covers WeakReferenceMessenger vs StrongReferenceMessenger, IRecipient\u003CTMessage>, RequestMessage\u003CT> \u002F AsyncRequestMessage\u003CT> \u002F CollectionRequestMessage\u003CT>, ValueChangedMessage\u003CT>, channels (tokens), and the ObservableRecipient activation lifecycle. 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",41162,"MIT","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fmvvm-toolkit-messenger\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"messenger","mvvm toolkit messenger","mvvm toolkit","mvvm","toolkit","activation","activation lifecycle","for","channels","maui","avalonia","tokens","across","objects","use","lifecycle","communication","wpf","winui","2026-11-10 10:12:30",false,"---\nname: mvvm-toolkit-messenger\ndescription: 'CommunityToolkit.Mvvm Messenger pub\u002Fsub for decoupled communication between ViewModels (or any objects). Covers WeakReferenceMessenger vs StrongReferenceMessenger, IRecipient\u003CTMessage>, RequestMessage\u003CT> \u002F AsyncRequestMessage\u003CT> \u002F CollectionRequestMessage\u003CT>, ValueChangedMessage\u003CT>, channels (tokens), and the ObservableRecipient activation lifecycle. Use across WPF, WinUI 3, .NET MAUI, Uno, and Avalonia.'\n---\n\n# CommunityToolkit.Mvvm Messenger\n\nPub\u002Fsub messaging for ViewModels (or any objects) without forcing a shared\nreference graph. Part of `CommunityToolkit.Mvvm` 8.x.\n\n> **TL;DR.** Default to `WeakReferenceMessenger.Default`. Register handlers\n> with the `(recipient, message)` lambda and the `static` modifier so you\n> never capture `this`. Inherit from `ObservableRecipient` and toggle\n> `IsActive` at activation\u002Fdeactivation to get automatic register\u002Funregister.\n\n---\n\n## When to use this skill\n\n- Two or more ViewModels need to react to an event (login, theme change,\n  save, navigation) without holding references to each other\n- A ViewModel needs to ask another VM for a value (request\u002Freply)\n- You're scoping events to a sub-system or window with channel tokens\n- Diagnosing \"my handler never fires\" or weak-reference recipient lifetime\n  problems\n\nFor source generators, base classes, and commands see the **`mvvm-toolkit`**\nskill. For DI wiring (registering an `IMessenger` instance), see\n**`mvvm-toolkit-di`**.\n\n---\n\n## Choose an implementation\n\n| Type | When |\n|------|------|\n| `WeakReferenceMessenger.Default` | **Default.** Recipients held weakly — eligible for GC even while registered. Internal trimming runs during full GCs; no manual `Cleanup()` needed. |\n| `StrongReferenceMessenger.Default` | Profiler shows the messenger is hot and allocation matters. Recipients are pinned until you `Unregister`. Forgetting unregistration leaks them. |\n| Custom `IMessenger` instance | Per-window\u002Fper-scope (e.g., one messenger per app window). Construct directly, inject via DI. |\n\n`ObservableRecipient`'s parameterless constructor uses\n`WeakReferenceMessenger.Default`. Pass a different `IMessenger` to its\nconstructor to override.\n\n---\n\n## Define a message\n\nThe toolkit ships base classes; any class works.\n\n```csharp\nusing CommunityToolkit.Mvvm.Messaging.Messages;\n\n\u002F\u002F Single-payload broadcast\npublic sealed class LoggedInUserChangedMessage(User user)\n    : ValueChangedMessage\u003CUser>(user);\n\n\u002F\u002F Custom shape (records are great for this)\npublic sealed record ThemeChangedMessage(AppTheme NewTheme);\n\n\u002F\u002F Empty signal\npublic sealed record RefreshRequestedMessage;\n```\n\n---\n\n## Register a recipient\n\n### Lambda style (recommended)\n\n```csharp\nWeakReferenceMessenger.Default.Register\u003CMyViewModel, ThemeChangedMessage>(\n    this,\n    static (recipient, message) => recipient.OnThemeChanged(message.NewTheme));\n```\n\nThe `static` modifier prevents accidental closure allocation and keeps\n`this` out of the lambda — use the `recipient` parameter instead.\n\n### `IRecipient\u003CTMessage>` interface style\n\n```csharp\npublic sealed class MyViewModel : ObservableRecipient,\n    IRecipient\u003CThemeChangedMessage>,\n    IRecipient\u003CRefreshRequestedMessage>\n{\n    public void Receive(ThemeChangedMessage message) { \u002F* ... *\u002F }\n    public void Receive(RefreshRequestedMessage message) { \u002F* ... *\u002F }\n}\n```\n\n`ObservableRecipient.OnActivated()` calls `Messenger.RegisterAll(this)`,\nwhich subscribes every `IRecipient\u003CT>` interface implemented by the type.\nIf you're not using `ObservableRecipient`, register manually:\n\n```csharp\nWeakReferenceMessenger.Default.RegisterAll(this);\n```\n\n---\n\n## Send a message\n\n```csharp\nWeakReferenceMessenger.Default.Send(new ThemeChangedMessage(AppTheme.Dark));\n\n\u002F\u002F Empty payloads use the parameterless overload:\nWeakReferenceMessenger.Default.Send\u003CRefreshRequestedMessage>();\n```\n\n---\n\n## Channels (tokens)\n\nScope messages to a sub-system or window with a token (any equatable\nvalue — `int`, `string`, `Guid`):\n\n```csharp\nconst int LeftPaneChannel = 1;\n\nWeakReferenceMessenger.Default.Register\u003CMyViewModel, RefreshRequestedMessage, int>(\n    this, LeftPaneChannel,\n    static (r, _) => r.RefreshLeft());\n\nWeakReferenceMessenger.Default.Send(new RefreshRequestedMessage(), LeftPaneChannel);\n```\n\nMessages sent without a token use the default shared channel — they are\n**not** delivered to channel-scoped recipients.\n\n---\n\n## Request \u002F reply\n\nFor ask-style scenarios where a recipient provides a value back to the\nsender, use the `RequestMessage\u003CT>` family.\n\n### Sync request\n\n```csharp\npublic sealed class CurrentUserRequest : RequestMessage\u003CUser> { }\n\nWeakReferenceMessenger.Default.Register\u003CUserService, CurrentUserRequest>(\n    this,\n    static (r, m) => m.Reply(r.CurrentUser));\n\nUser user = WeakReferenceMessenger.Default.Send\u003CCurrentUserRequest>();\n```\n\nThe implicit conversion from `CurrentUserRequest` to `User` throws if no\nrecipient called `Reply`. Capture the message to check first:\n\n```csharp\nvar request = WeakReferenceMessenger.Default.Send\u003CCurrentUserRequest>();\nif (request.HasReceivedResponse)\n    User user = request.Response;\n```\n\n### Async request\n\n```csharp\npublic sealed class CurrentUserRequest : AsyncRequestMessage\u003CUser> { }\n\nWeakReferenceMessenger.Default.Register\u003CUserService, CurrentUserRequest>(\n    this,\n    static (r, m) => m.Reply(r.GetCurrentUserAsync()));\n\nUser user = await WeakReferenceMessenger.Default.Send\u003CCurrentUserRequest>();\n```\n\n### Collection requests (fan-in)\n\n`CollectionRequestMessage\u003CT>` and `AsyncCollectionRequestMessage\u003CT>` collect\na `Reply` from every responding recipient:\n\n```csharp\npublic sealed class OpenDocumentsRequest : CollectionRequestMessage\u003CDocument> { }\n\nvar docs = WeakReferenceMessenger.Default.Send\u003COpenDocumentsRequest>();\nforeach (Document doc in docs) { \u002F* ... *\u002F }\n```\n\n---\n\n## Lifecycle\n\nEven with `WeakReferenceMessenger`, unregister explicitly when a recipient\nis being torn down — it trims dead entries and improves performance:\n\n```csharp\nWeakReferenceMessenger.Default.Unregister\u003CThemeChangedMessage>(this);\nWeakReferenceMessenger.Default.Unregister\u003CThemeChangedMessage, int>(this, LeftPaneChannel);\nWeakReferenceMessenger.Default.UnregisterAll(this);\n```\n\n`ObservableRecipient.OnDeactivated()` does this automatically when\n`IsActive` flips to `false`. Set it from your activation hook:\n\n```csharp\nprotected override void OnNavigatedTo(NavigationEventArgs e)\n{\n    base.OnNavigatedTo(e);\n    ViewModel.IsActive = true;\n}\n\nprotected override void OnNavigatedFrom(NavigationEventArgs e)\n{\n    ViewModel.IsActive = false;\n    base.OnNavigatedFrom(e);\n}\n```\n\n---\n\n## Common pitfalls\n\n1. **Capturing `this` in the lambda.** `(r, m) => OnX(m)` implicitly\n   captures `this`; allocates a closure and confuses lifetime. Always use\n   `(r, m) => r.OnX(m)` with `static`.\n2. **Strong-ref recipients without `Unregister`.** With\n   `StrongReferenceMessenger`, recipients (and their entire object graph)\n   stay pinned forever. Either inherit from `ObservableRecipient`\n   (auto-unregisters in `OnDeactivated`) or call `UnregisterAll(this)`.\n3. **Inherited message types.** A handler registered for `BaseMessage` is\n   **not** invoked for `DerivedMessage : BaseMessage`. Register each\n   concrete type.\n4. **Wrong messenger instance.** Sending via `WeakReferenceMessenger.Default`\n   and registering via an injected per-window messenger means the message\n   never arrives. Use the same `IMessenger` everywhere (typically inject\n   it via `ObservableRecipient(messenger)`).\n5. **`OnActivated` never runs.** `ObservableRecipient` only registers\n   `IRecipient\u003CT>` handlers when `IsActive` flips from `false` to `true`.\n6. **Cross-thread updates.** The messenger is thread-agnostic. If a\n   handler updates UI, marshal manually\n   (`DispatcherQueue.TryEnqueue` \u002F `Dispatcher.BeginInvoke`).\n\n---\n\n## Multiple messengers (per-window scoping)\n\n```csharp\nservices.AddSingleton\u003CIMessenger>(WeakReferenceMessenger.Default); \u002F\u002F app-wide\nservices.AddScoped\u003CWindowScopedMessenger>();                       \u002F\u002F per-window\n```\n\nInject the appropriate `IMessenger` into the ViewModel constructor:\n\n```csharp\npublic sealed partial class WindowViewModel(IMessenger messenger)\n    : ObservableRecipient(messenger) { }\n```\n\nThis isolates broadcasts to a single window — useful for multi-window\ndesktop apps (WinUI 3, WPF, MAUI desktop, Avalonia).\n\n---\n\n## References\n\n| Topic | File |\n|-------|------|\n| Full deep dive (more channel\u002Flifecycle examples, diagnostics) | [`references\u002Fmessenger-patterns.md`](references\u002Fmessenger-patterns.md) |\n\nExternal:\n\n- Messenger docs: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcommunitytoolkit\u002Fmvvm\u002Fmessenger>\n- `WeakReferenceMessenger` API: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fapi\u002Fcommunitytoolkit.mvvm.messaging.weakreferencemessenger>\n- Source: \u003Chttps:\u002F\u002Fgithub.com\u002FCommunityToolkit\u002Fdotnet>\n","# CommunityToolkit.Mvvm Messenger\n\nPub\u002Fsub messaging for ViewModels (or any objects) without forcing a shared\nreference graph. Part of `CommunityToolkit.Mvvm` 8.x.\n\n> **TL;DR.** Default to `WeakReferenceMessenger.Default`. Register handlers\n> with the `(recipient, message)` lambda and the `static` modifier so you\n> never capture `this`. Inherit from `ObservableRecipient` and toggle\n> `IsActive` at activation\u002Fdeactivation to get automatic register\u002Funregister.\n\n---\n\n## When to use this skill\n\n- Two or more ViewModels need to react to an event (login, theme change,\n  save, navigation) without holding references to each other\n- A ViewModel needs to ask another VM for a value (request\u002Freply)\n- You're scoping events to a sub-system or window with channel tokens\n- Diagnosing \"my handler never fires\" or weak-reference recipient lifetime\n  problems\n\nFor source generators, base classes, and commands see the **`mvvm-toolkit`**\nskill. For DI wiring (registering an `IMessenger` instance), see\n**`mvvm-toolkit-di`**.\n\n---\n\n## Choose an implementation\n\n| Type | When |\n|------|------|\n| `WeakReferenceMessenger.Default` | **Default.** Recipients held weakly — eligible for GC even while registered. Internal trimming runs during full GCs; no manual `Cleanup()` needed. |\n| `StrongReferenceMessenger.Default` | Profiler shows the messenger is hot and allocation matters. Recipients are pinned until you `Unregister`. Forgetting unregistration leaks them. |\n| Custom `IMessenger` instance | Per-window\u002Fper-scope (e.g., one messenger per app window). Construct directly, inject via DI. |\n\n`ObservableRecipient`'s parameterless constructor uses\n`WeakReferenceMessenger.Default`. Pass a different `IMessenger` to its\nconstructor to override.\n\n---\n\n## Define a message\n\nThe toolkit ships base classes; any class works.\n\n```csharp\nusing CommunityToolkit.Mvvm.Messaging.Messages;\n\n\u002F\u002F Single-payload broadcast\npublic sealed class LoggedInUserChangedMessage(User user)\n    : ValueChangedMessage\u003CUser>(user);\n\n\u002F\u002F Custom shape (records are great for this)\npublic sealed record ThemeChangedMessage(AppTheme NewTheme);\n\n\u002F\u002F Empty signal\npublic sealed record RefreshRequestedMessage;\n```\n\n---\n\n## Register a recipient\n\n### Lambda style (recommended)\n\n```csharp\nWeakReferenceMessenger.Default.Register\u003CMyViewModel, ThemeChangedMessage>(\n    this,\n    static (recipient, message) => recipient.OnThemeChanged(message.NewTheme));\n```\n\nThe `static` modifier prevents accidental closure allocation and keeps\n`this` out of the lambda — use the `recipient` parameter instead.\n\n### `IRecipient\u003CTMessage>` interface style\n\n```csharp\npublic sealed class MyViewModel : ObservableRecipient,\n    IRecipient\u003CThemeChangedMessage>,\n    IRecipient\u003CRefreshRequestedMessage>\n{\n    public void Receive(ThemeChangedMessage message) { \u002F* ... *\u002F }\n    public void Receive(RefreshRequestedMessage message) { \u002F* ... *\u002F }\n}\n```\n\n`ObservableRecipient.OnActivated()` calls `Messenger.RegisterAll(this)`,\nwhich subscribes every `IRecipient\u003CT>` interface implemented by the type.\nIf you're not using `ObservableRecipient`, register manually:\n\n```csharp\nWeakReferenceMessenger.Default.RegisterAll(this);\n```\n\n---\n\n## Send a message\n\n```csharp\nWeakReferenceMessenger.Default.Send(new ThemeChangedMessage(AppTheme.Dark));\n\n\u002F\u002F Empty payloads use the parameterless overload:\nWeakReferenceMessenger.Default.Send\u003CRefreshRequestedMessage>();\n```\n\n---\n\n## Channels (tokens)\n\nScope messages to a sub-system or window with a token (any equatable\nvalue — `int`, `string`, `Guid`):\n\n```csharp\nconst int LeftPaneChannel = 1;\n\nWeakReferenceMessenger.Default.Register\u003CMyViewModel, RefreshRequestedMessage, int>(\n    this, LeftPaneChannel,\n    static (r, _) => r.RefreshLeft());\n\nWeakReferenceMessenger.Default.Send(new RefreshRequestedMessage(), LeftPaneChannel);\n```\n\nMessages sent without a token use the default shared channel — they are\n**not** delivered to channel-scoped recipients.\n\n---\n\n## Request \u002F reply\n\nFor ask-style scenarios where a recipient provides a value back to the\nsender, use the `RequestMessage\u003CT>` family.\n\n### Sync request\n\n```csharp\npublic sealed class CurrentUserRequest : RequestMessage\u003CUser> { }\n\nWeakReferenceMessenger.Default.Register\u003CUserService, CurrentUserRequest>(\n    this,\n    static (r, m) => m.Reply(r.CurrentUser));\n\nUser user = WeakReferenceMessenger.Default.Send\u003CCurrentUserRequest>();\n```\n\nThe implicit conversion from `CurrentUserRequest` to `User` throws if no\nrecipient called `Reply`. Capture the message to check first:\n\n```csharp\nvar request = WeakReferenceMessenger.Default.Send\u003CCurrentUserRequest>();\nif (request.HasReceivedResponse)\n    User user = request.Response;\n```\n\n### Async request\n\n```csharp\npublic sealed class CurrentUserRequest : AsyncRequestMessage\u003CUser> { }\n\nWeakReferenceMessenger.Default.Register\u003CUserService, CurrentUserRequest>(\n    this,\n    static (r, m) => m.Reply(r.GetCurrentUserAsync()));\n\nUser user = await WeakReferenceMessenger.Default.Send\u003CCurrentUserRequest>();\n```\n\n### Collection requests (fan-in)\n\n`CollectionRequestMessage\u003CT>` and `AsyncCollectionRequestMessage\u003CT>` collect\na `Reply` from every responding recipient:\n\n```csharp\npublic sealed class OpenDocumentsRequest : CollectionRequestMessage\u003CDocument> { }\n\nvar docs = WeakReferenceMessenger.Default.Send\u003COpenDocumentsRequest>();\nforeach (Document doc in docs) { \u002F* ... *\u002F }\n```\n\n---\n\n## Lifecycle\n\nEven with `WeakReferenceMessenger`, unregister explicitly when a recipient\nis being torn down — it trims dead entries and improves performance:\n\n```csharp\nWeakReferenceMessenger.Default.Unregister\u003CThemeChangedMessage>(this);\nWeakReferenceMessenger.Default.Unregister\u003CThemeChangedMessage, int>(this, LeftPaneChannel);\nWeakReferenceMessenger.Default.UnregisterAll(this);\n```\n\n`ObservableRecipient.OnDeactivated()` does this automatically when\n`IsActive` flips to `false`. Set it from your activation hook:\n\n```csharp\nprotected override void OnNavigatedTo(NavigationEventArgs e)\n{\n    base.OnNavigatedTo(e);\n    ViewModel.IsActive = true;\n}\n\nprotected override void OnNavigatedFrom(NavigationEventArgs e)\n{\n    ViewModel.IsActive = false;\n    base.OnNavigatedFrom(e);\n}\n```\n\n---\n\n## Common pitfalls\n\n1. **Capturing `this` in the lambda.** `(r, m) => OnX(m)` implicitly\n   captures `this`; allocates a closure and confuses lifetime. Always use\n   `(r, m) => r.OnX(m)` with `static`.\n2. **Strong-ref recipients without `Unregister`.** With\n   `StrongReferenceMessenger`, recipients (and their entire object graph)\n   stay pinned forever. Either inherit from `ObservableRecipient`\n   (auto-unregisters in `OnDeactivated`) or call `UnregisterAll(this)`.\n3. **Inherited message types.** A handler registered for `BaseMessage` is\n   **not** invoked for `DerivedMessage : BaseMessage`. Register each\n   concrete type.\n4. **Wrong messenger instance.** Sending via `WeakReferenceMessenger.Default`\n   and registering via an injected per-window messenger means the message\n   never arrives. Use the same `IMessenger` everywhere (typically inject\n   it via `ObservableRecipient(messenger)`).\n5. **`OnActivated` never runs.** `ObservableRecipient` only registers\n   `IRecipient\u003CT>` handlers when `IsActive` flips from `false` to `true`.\n6. **Cross-thread updates.** The messenger is thread-agnostic. If a\n   handler updates UI, marshal manually\n   (`DispatcherQueue.TryEnqueue` \u002F `Dispatcher.BeginInvoke`).\n\n---\n\n## Multiple messengers (per-window scoping)\n\n```csharp\nservices.AddSingleton\u003CIMessenger>(WeakReferenceMessenger.Default); \u002F\u002F app-wide\nservices.AddScoped\u003CWindowScopedMessenger>();                       \u002F\u002F per-window\n```\n\nInject the appropriate `IMessenger` into the ViewModel constructor:\n\n```csharp\npublic sealed partial class WindowViewModel(IMessenger messenger)\n    : ObservableRecipient(messenger) { }\n```\n\nThis isolates broadcasts to a single window — useful for multi-window\ndesktop apps (WinUI 3, WPF, MAUI desktop, Avalonia).\n\n---\n\n## References\n\n| Topic | File |\n|-------|------|\n| Full deep dive (more channel\u002Flifecycle examples, diagnostics) | [`references\u002Fmessenger-patterns.md`](references\u002Fmessenger-patterns.md) |\n\nExternal:\n\n- Messenger docs: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcommunitytoolkit\u002Fmvvm\u002Fmessenger>\n- `WeakReferenceMessenger` API: \u003Chttps:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fapi\u002Fcommunitytoolkit.mvvm.messaging.weakreferencemessenger>\n- Source: \u003Chttps:\u002F\u002Fgithub.com\u002FCommunityToolkit\u002Fdotnet>\n",{"name":5,"description":7},"main","5269f7ea2d6c3a9bfda5ed878b6726cf509121fd","skills\u002Fmvvm-toolkit-messenger",5360,"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-15 04:42:30",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add github\u002Fawesome-copilot --skill mvvm-toolkit-messenger",{"tool":59,"command":60},"bunx","bunx skills add github\u002Fawesome-copilot --skill mvvm-toolkit-messenger",{"tool":62,"command":63},"pnpm","pnpm dlx skills add github\u002Fawesome-copilot --skill mvvm-toolkit-messenger","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fmvvm-toolkit-messenger\u002FSKILL.md",true,[67,73],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fmessenger-patterns.md","REFERENCE","参考文档",7033,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fmvvm-toolkit-messenger\u002Freferences\u002Fmessenger-patterns.md",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"SKILL.md.tmpl","OTHER","其他",7780,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002Fgstack\u002Fsetup-deploy\u002FSKILL.md.tmpl",[80,114,141,171,205,222],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":94,"publishedAt":38},"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",[86,91],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":92,"categoryName":93,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000023","Skill与智能体开发",[95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,33,111,112,113],"supabase","rls","supabase rls","supabase rls policies","project","when","review","change","read","write","security","isolation","tables","as","tests","prove","users","functions","with",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":121,"publishedAt":38},"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",[120],{"categoryNo":92,"categoryName":93,"taxonomyType":89,"taxonomyTypeDesc":90},[122,123,124,125,126,127,26,128,129,130,131,132,133,134,135,136,137,138,139,140],"distribution","skill distribution audit","audit","SET","deterministic","installer","discovery","comparison","helper","manifest","version","collection","drift","output","investigate","duplicate","template","release","reconcile",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":145,"sourceHtmlUrl":146,"categories":147,"keywords":153,"publishedAt":38},"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",[148],{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[154,155,156,157,158,159,26,99,160,161,162,163,164,165,166,33,167,168,169,170],"custom","code","logicapps custom code net10 migration","migration","projects","standalone","deployment","applications","local","azure","worker","upgrades","package","apps","Legacy","debugging","workflows",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":175,"sourceHtmlUrl":176,"categories":177,"keywords":182,"publishedAt":38},"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",[178,181],{"categoryNo":179,"categoryName":180,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},[183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,100,198,199,200,201,202,26,203,204],"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":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":209,"licenseFileUrl":210,"sourceHtmlUrl":211,"categories":212,"keywords":218,"publishedAt":38},"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",[213,214,217],{"categoryNo":179,"categoryName":180,"taxonomyType":89,"taxonomyTypeDesc":90},{"categoryNo":215,"categoryName":216,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":92,"categoryName":93,"taxonomyType":89,"taxonomyTypeDesc":90},[219,125,192,220,221],"resemble detect","https","identity",{"skillNo":223,"name":224,"nameZh":6,"description":225,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":209,"licenseFileUrl":226,"sourceHtmlUrl":227,"categories":228,"keywords":233,"publishedAt":38},"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",[229,232],{"categoryNo":230,"categoryName":231,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":92,"categoryName":93,"taxonomyType":89,"taxonomyTypeDesc":90},[234,235,236,237,155,101,9,124,238,239,220,240,241,242,243,244,245,246,247,248,249,250,109,251,252,253,254],"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"]