[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X72WT70ESM1FZ66AYZX2VT":3,"skill-same:01M6X72WT70ESM1FZ66AYZX2VT":78},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":61,"ownerDescription":63,"updatedAt":64,"install":65,"resources":77},"01M6X72WT70ESM1FZ66AYZX2VT","laravel-websocket",null,"Use when building Laravel real-time features — Broadcasting events, ShouldBroadcast, private\u002Fpresence channels, Echo client. For non-Laravel WebSockets, use the stack-native skill.","event4u-app\u002Fagent-config","event4u-app","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F199339632?v=4","01M6X5TWBNCQCE1VDKT4E9KF7N","event4u.app","01M6X5TWF4HRM266RG2Q5VVH1X",19,"MIT","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Flaravel-websocket\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"laravel websocket","laravel","websocket","events","when","features","for","true","presence","channels","native","professional","false","websockets","time","broadcasting","Echo","use","stack","real-time","2026-11-10 10:12:30",false,"---\nmodel_tier: medium\nname: laravel-websocket\ndescription: \"Use when building Laravel real-time features — Broadcasting events, ShouldBroadcast, private\u002Fpresence channels, Echo client. For non-Laravel WebSockets, use the stack-native skill.\"\ndomain: engineering\nframework: laravel\nworkspaces:\n  - engineering\npacks:\n  - laravel\ntrust:\n  level: professional\ninstall:\n  default: false\n  removable: true\n---\n\n# laravel-websocket\n\n## When to use\n\nUse when implementing real-time features — WebSockets, Broadcasting, or persistent connections.\n\nDo NOT use when:\n- REST API endpoints (use `api-design` skill)\n- Reverb server setup\u002Fdeployment (use `laravel-reverb` skill)\n\n## Procedure: Create a broadcast event\n\n### Step 0: Inspect\n\n1. Check `config\u002Fbroadcasting.php` for driver (Reverb, Pusher, Ably).\n2. Check existing broadcast events — match patterns.\n3. Check `routes\u002Fchannels.php` for channel authorization.\n\n### Step 1: Create event class\n\n1. Implement `ShouldBroadcast`.\n2. Define `broadcastOn()` with appropriate channel type (public\u002Fprivate\u002Fpresence).\n3. Define `broadcastAs()` for event name.\n4. Define `broadcastWith()` — small payload (IDs + changed fields only).\n\n### Step 2: Authorize channel\n\nAdd authorization in `routes\u002Fchannels.php` for private\u002Fpresence channels.\n\n### Step 3: Client setup\n\nUse Laravel Echo to listen on the channel. Wire up reconnection with exponential backoff.\n\n## Conventions\n\n→ See guideline `php\u002Fwebsocket.md` for broadcasting setup, channel types, connection management, Echo.\n\n### Validate\n\n- Verify private\u002Fpresence channels have authorization in `routes\u002Fchannels.php`.\n- Confirm event implements `ShouldBroadcast` (or `ShouldBroadcastNow`).\n- Check that no sensitive data is broadcast on public channels.\n- Test client receives event — use browser console or Echo debug mode.\n\n## Output format\n\n1. Event class with broadcastOn() and channel definitions\n2. Client-side listener integration code\n\n## Gotcha\n\n- Connections are stateful — don't assume they persist after page navigation.\n- Always implement reconnection with exponential backoff.\n- Don't broadcast sensitive data on public channels — use private\u002Fpresence.\n\n## Do NOT\n\n- Do NOT send entire model objects — select only needed fields.\n- Do NOT skip channel authorization for user-specific data.\n- Do NOT rely on WebSocket delivery — use acknowledgments for critical messages.\n\n## Auto-trigger keywords\n\n- WebSocket\n- real-time\n- broadcasting\n- Laravel Echo\n- channel authorization\n- ShouldBroadcast\n","# laravel-websocket\n\n## When to use\n\nUse when implementing real-time features — WebSockets, Broadcasting, or persistent connections.\n\nDo NOT use when:\n- REST API endpoints (use `api-design` skill)\n- Reverb server setup\u002Fdeployment (use `laravel-reverb` skill)\n\n## Procedure: Create a broadcast event\n\n### Step 0: Inspect\n\n1. Check `config\u002Fbroadcasting.php` for driver (Reverb, Pusher, Ably).\n2. Check existing broadcast events — match patterns.\n3. Check `routes\u002Fchannels.php` for channel authorization.\n\n### Step 1: Create event class\n\n1. Implement `ShouldBroadcast`.\n2. Define `broadcastOn()` with appropriate channel type (public\u002Fprivate\u002Fpresence).\n3. Define `broadcastAs()` for event name.\n4. Define `broadcastWith()` — small payload (IDs + changed fields only).\n\n### Step 2: Authorize channel\n\nAdd authorization in `routes\u002Fchannels.php` for private\u002Fpresence channels.\n\n### Step 3: Client setup\n\nUse Laravel Echo to listen on the channel. Wire up reconnection with exponential backoff.\n\n## Conventions\n\n→ See guideline `php\u002Fwebsocket.md` for broadcasting setup, channel types, connection management, Echo.\n\n### Validate\n\n- Verify private\u002Fpresence channels have authorization in `routes\u002Fchannels.php`.\n- Confirm event implements `ShouldBroadcast` (or `ShouldBroadcastNow`).\n- Check that no sensitive data is broadcast on public channels.\n- Test client receives event — use browser console or Echo debug mode.\n\n## Output format\n\n1. Event class with broadcastOn() and channel definitions\n2. Client-side listener integration code\n\n## Gotcha\n\n- Connections are stateful — don't assume they persist after page navigation.\n- Always implement reconnection with exponential backoff.\n- Don't broadcast sensitive data on public channels — use private\u002Fpresence.\n\n## Do NOT\n\n- Do NOT send entire model objects — select only needed fields.\n- Do NOT skip channel authorization for user-specific data.\n- Do NOT rely on WebSocket delivery — use acknowledgments for critical messages.\n\n## Auto-trigger keywords\n\n- WebSocket\n- real-time\n- broadcasting\n- Laravel Echo\n- channel authorization\n- ShouldBroadcast\n",{"name":5,"packs":49,"trust":50,"domain":51,"install":52,"framework":25,"model_tier":54,"workspaces":55,"description":7},[25],{"level":35},"engineering",{"default":45,"removable":53},true,"medium",[51],"main","12bd765ce1d800501d45dfb8232102793af01290","src\u002Fskills\u002Flaravel-websocket",1,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config","https:\u002F\u002Fevent4u.app","https:\u002F\u002Fgithub.com\u002Fevent4u-app","Your events in your hand","2026-11-11 22:25:41",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":53},[67,70,73],{"tool":68,"command":69},"npx","npx skills add event4u-app\u002Fagent-config --skill laravel-websocket",{"tool":71,"command":72},"bunx","bunx skills add event4u-app\u002Fagent-config --skill laravel-websocket",{"tool":74,"command":75},"pnpm","pnpm dlx skills add event4u-app\u002Fagent-config --skill laravel-websocket","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Flaravel-websocket\u002FSKILL.md",[],[79,93,106,118,130,140],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":86,"publishedAt":44},"01M6X84PK96XBPENXH66JCTSD1","unknown-key-fixture","Declares a key the schema does not know.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Funknown-key\u002FSKILL.md",[85],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[87,88,89,90,91,92],"unknown key fixture","Unknown key","fixture","unknown","schema","package",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":100,"publishedAt":44},"01M6X84HW7NAHZ7GZMQ9RXK1XJ","portable-fixture","Declares only semantics the MCP-lite carrier transports whole.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fportable\u002FSKILL.md",[99],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[89,101,102,103,104,92,105],"portable","portable fixture","engineer","only","MCP",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":113,"publishedAt":44},"01M6X84F29FE0RGGZ1ZTFGZTX2","non-portable-fixture","Declares a runtime semantic the carrier drops.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fnon-portable\u002FSKILL.md",[112],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[102,114,101,89,115,116,117,92],"non portable fixture","semantic","high","runtime",{"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":44},"01M6X848F706PT9MDCX75JKJ6B","candidate-zero-width","A candidate whose prose carries an invisible joiner.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fzero-width-injection\u002FSKILL.md",[124],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[126,127,128,129],"candidate zero width","candidate","ZeRO","prose",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":137,"publishedAt":44},"01M6X841SSC2T31VDF41SA6DG1","candidate-disclosure-suppression","A candidate whose prose tells the agent to withhold from the user.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdisclosure-suppression\u002FSKILL.md",[136],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[138,127,129,139],"candidate disclosure suppression","user",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":147,"publishedAt":44},"01M6X83TFS5AGPBPVTQNWP0BB3","candidate-dangerous-frontmatter","A candidate claiming an unscoped tool grant and a permission bypass.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdangerous-frontmatter\u002FSKILL.md",[146],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[148,127,149,150,151,152],"candidate dangerous frontmatter","frontmatter","shell","permission","tool"]