[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CTTTM930DGRPATF983480Y":3,"skill-same:01M6CTTTM930DGRPATF983480Y":67},{"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":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":33,"ownerHtmlUrl":34,"ownerBlogUrl":6,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M6CTTTM930DGRPATF983480Y","makepad-event-action",null,"CRITICAL: Use for Makepad event and action handling. Triggers on:\nmakepad event, makepad action, Event enum, ActionTrait, handle_event,\nMouseDown, KeyDown, TouchUpdate, Hit, FingerDown, post_action,\nmakepad 事件, makepad action, 事件处理","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fmakepad-event-action\u002FSKILL.md",[],[19,20,21,22],"makepad event action","safe","use","community","2026-11-10 10:12:30",false,"---\nname: makepad-event-action\ndescription: |\n  CRITICAL: Use for Makepad event and action handling. Triggers on:\n  makepad event, makepad action, Event enum, ActionTrait, handle_event,\n  MouseDown, KeyDown, TouchUpdate, Hit, FingerDown, post_action,\n  makepad 事件, makepad action, 事件处理\nrisk: safe\nsource: community\n---\n\n# Makepad Event\u002FAction Skill\n\n> **Version:** makepad-widgets (dev branch) | **Last Updated:** 2026-01-19\n>\n> Check for updates: https:\u002F\u002Fcrates.io\u002Fcrates\u002Fmakepad-widgets\n\nYou are an expert at Makepad event and action handling. Help users by:\n- **Handling events**: Mouse, keyboard, touch, lifecycle events\n- **Creating actions**: Widget-to-parent communication\n- **Event flow**: Understanding event propagation\n\n## When to Use\n\n- You need to handle input, lifecycle, or UI interaction events in Makepad.\n- The task involves `handle_event`, `Event` variants, `Hit` processing, or widget action propagation.\n- You need to design or debug Makepad event\u002Faction flow between widgets and parents.\n\n## Documentation\n\nRefer to the local files for detailed documentation:\n- `.\u002Freferences\u002Fevent-system.md` - Event enum and handling\n- `.\u002Freferences\u002Faction-system.md` - Action trait and patterns\n\n## IMPORTANT: Documentation Completeness Check\n\n**Before answering questions, Claude MUST:**\n\n1. Read the relevant reference file(s) listed above\n2. If file read fails or file is empty:\n   - Inform user: \"本地文档不完整，建议运行 `\u002Fsync-crate-skills makepad --force` 更新文档\"\n   - Still answer based on SKILL.md patterns + built-in knowledge\n3. If reference file exists, incorporate its content into the answer\n\n## Event Enum (Key Variants)\n\n```rust\npub enum Event {\n    \u002F\u002F Lifecycle\n    Startup,\n    Shutdown,\n    Foreground,\n    Background,\n    Resume,\n    Pause,\n\n    \u002F\u002F Drawing\n    Draw(DrawEvent),\n    LiveEdit,\n\n    \u002F\u002F Window\n    WindowGotFocus(WindowId),\n    WindowLostFocus(WindowId),\n    WindowGeomChange(WindowGeomChangeEvent),\n    WindowClosed(WindowClosedEvent),\n\n    \u002F\u002F Mouse\n    MouseDown(MouseDownEvent),\n    MouseMove(MouseMoveEvent),\n    MouseUp(MouseUpEvent),\n    Scroll(ScrollEvent),\n\n    \u002F\u002F Touch\n    TouchUpdate(TouchUpdateEvent),\n\n    \u002F\u002F Keyboard\n    KeyDown(KeyEvent),\n    KeyUp(KeyEvent),\n    TextInput(TextInputEvent),\n    TextCopy(TextClipboardEvent),\n\n    \u002F\u002F Timer\n    Timer(TimerEvent),\n    NextFrame(NextFrameEvent),\n\n    \u002F\u002F Network\n    HttpResponse(HttpResponse),\n\n    \u002F\u002F Widget Actions\n    Actions(ActionsBuf),\n}\n```\n\n## Handling Events in Widgets\n\n```rust\nimpl Widget for MyWidget {\n    fn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {\n        \u002F\u002F Check if event hits this widget's area\n        match event.hits(cx, self.area()) {\n            Hit::FingerDown(fe) => {\n                \u002F\u002F Mouse\u002Ftouch down on this widget\n                cx.action(MyWidgetAction::Pressed);\n            }\n            Hit::FingerUp(fe) => {\n                if fe.is_over {\n                    \u002F\u002F Released while still over widget = click\n                    cx.action(MyWidgetAction::Clicked);\n                }\n            }\n            Hit::FingerHoverIn(_) => {\n                self.animator_play(cx, id!(hover.on));\n            }\n            Hit::FingerHoverOut(_) => {\n                self.animator_play(cx, id!(hover.off));\n            }\n            Hit::KeyDown(ke) => {\n                if ke.key_code == KeyCode::Return {\n                    cx.action(MyWidgetAction::Submitted);\n                }\n            }\n            _ => {}\n        }\n    }\n}\n```\n\n## Hit Enum\n\n```rust\npub enum Hit {\n    \u002F\u002F Finger\u002FMouse\n    FingerDown(FingerDownEvent),\n    FingerUp(FingerUpEvent),\n    FingerMove(FingerMoveEvent),\n    FingerHoverIn(FingerHoverEvent),\n    FingerHoverOver(FingerHoverEvent),\n    FingerHoverOut(FingerHoverEvent),\n    FingerLongPress(FingerLongPressEvent),\n\n    \u002F\u002F Keyboard\n    KeyDown(KeyEvent),\n    KeyUp(KeyEvent),\n    KeyFocus,\n    KeyFocusLost,\n    TextInput(TextInputEvent),\n    TextCopy,\n\n    \u002F\u002F Nothing\n    Nothing,\n}\n```\n\n## Action System\n\n### Defining Actions\n\n```rust\n#[derive(Clone, Debug, DefaultNone)]\npub enum ButtonAction {\n    None,\n    Clicked,\n    Pressed,\n    Released,\n}\n\n\u002F\u002F DefaultNone derives Default returning None variant\n```\n\n### Emitting Actions\n\n```rust\n\u002F\u002F From main thread (in handle_event)\ncx.action(ButtonAction::Clicked);\n\n\u002F\u002F From any thread (thread-safe)\nCx::post_action(MyAction::DataLoaded(data));\n```\n\n### Handling Actions\n\n```rust\nfn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {\n    \u002F\u002F Handle child widget actions\n    let actions = cx.capture_actions(|cx| {\n        self.button.handle_event(cx, event, scope);\n    });\n\n    \u002F\u002F Check for specific action\n    if self.button(id!(my_button)).clicked(&actions) {\n        \u002F\u002F Button was clicked\n    }\n\n    \u002F\u002F Or iterate actions\n    for action in actions.iter() {\n        if let Some(ButtonAction::Clicked) = action.downcast_ref() {\n            \u002F\u002F Handle click\n        }\n    }\n}\n```\n\n## Widget Action Helpers\n\n```rust\n\u002F\u002F Common widget action checks\nimpl ButtonRef {\n    fn clicked(&self, actions: &ActionsBuf) -> bool;\n    fn pressed(&self, actions: &ActionsBuf) -> bool;\n    fn released(&self, actions: &ActionsBuf) -> bool;\n}\n\nimpl TextInputRef {\n    fn changed(&self, actions: &ActionsBuf) -> Option\u003CString>;\n    fn returned(&self, actions: &ActionsBuf) -> Option\u003CString>;\n}\n```\n\n## Event Flow\n\n1. **Event arrives** from platform layer\n2. **Root widget** receives event first\n3. **Propagates down** to children via `handle_event`\n4. **Widgets emit actions** via `cx.action()`\n5. **Parent captures actions** via `cx.capture_actions()`\n6. **App handles** remaining actions\n\n## Timer and NextFrame\n\n```rust\n\u002F\u002F Start a timer\nlet timer = cx.start_timer(1.0); \u002F\u002F 1 second\n\n\u002F\u002F In handle_event\nif let Event::Timer(te) = event {\n    if te.timer_id == self.timer {\n        \u002F\u002F Timer fired\n    }\n}\n\n\u002F\u002F Request next frame callback\nlet next_frame = cx.new_next_frame();\n\n\u002F\u002F In handle_event\nif let Event::NextFrame(ne) = event {\n    if ne.frame_id == self.next_frame {\n        \u002F\u002F Next frame arrived\n    }\n}\n```\n\n## When Answering Questions\n\n1. Use `event.hits(cx, area)` to check if event targets a widget\n2. Actions flow UP from child to parent (unlike events which flow DOWN)\n3. Use `cx.capture_actions()` to intercept child actions\n4. `Cx::post_action()` is thread-safe for async operations\n5. `DefaultNone` derive macro auto-implements Default for enums\n","# Makepad Event\u002FAction Skill\n\n> **Version:** makepad-widgets (dev branch) | **Last Updated:** 2026-01-19\n>\n> Check for updates: https:\u002F\u002Fcrates.io\u002Fcrates\u002Fmakepad-widgets\n\nYou are an expert at Makepad event and action handling. Help users by:\n- **Handling events**: Mouse, keyboard, touch, lifecycle events\n- **Creating actions**: Widget-to-parent communication\n- **Event flow**: Understanding event propagation\n\n## When to Use\n\n- You need to handle input, lifecycle, or UI interaction events in Makepad.\n- The task involves `handle_event`, `Event` variants, `Hit` processing, or widget action propagation.\n- You need to design or debug Makepad event\u002Faction flow between widgets and parents.\n\n## Documentation\n\nRefer to the local files for detailed documentation:\n- `.\u002Freferences\u002Fevent-system.md` - Event enum and handling\n- `.\u002Freferences\u002Faction-system.md` - Action trait and patterns\n\n## IMPORTANT: Documentation Completeness Check\n\n**Before answering questions, Claude MUST:**\n\n1. Read the relevant reference file(s) listed above\n2. If file read fails or file is empty:\n   - Inform user: \"本地文档不完整，建议运行 `\u002Fsync-crate-skills makepad --force` 更新文档\"\n   - Still answer based on SKILL.md patterns + built-in knowledge\n3. If reference file exists, incorporate its content into the answer\n\n## Event Enum (Key Variants)\n\n```rust\npub enum Event {\n    \u002F\u002F Lifecycle\n    Startup,\n    Shutdown,\n    Foreground,\n    Background,\n    Resume,\n    Pause,\n\n    \u002F\u002F Drawing\n    Draw(DrawEvent),\n    LiveEdit,\n\n    \u002F\u002F Window\n    WindowGotFocus(WindowId),\n    WindowLostFocus(WindowId),\n    WindowGeomChange(WindowGeomChangeEvent),\n    WindowClosed(WindowClosedEvent),\n\n    \u002F\u002F Mouse\n    MouseDown(MouseDownEvent),\n    MouseMove(MouseMoveEvent),\n    MouseUp(MouseUpEvent),\n    Scroll(ScrollEvent),\n\n    \u002F\u002F Touch\n    TouchUpdate(TouchUpdateEvent),\n\n    \u002F\u002F Keyboard\n    KeyDown(KeyEvent),\n    KeyUp(KeyEvent),\n    TextInput(TextInputEvent),\n    TextCopy(TextClipboardEvent),\n\n    \u002F\u002F Timer\n    Timer(TimerEvent),\n    NextFrame(NextFrameEvent),\n\n    \u002F\u002F Network\n    HttpResponse(HttpResponse),\n\n    \u002F\u002F Widget Actions\n    Actions(ActionsBuf),\n}\n```\n\n## Handling Events in Widgets\n\n```rust\nimpl Widget for MyWidget {\n    fn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {\n        \u002F\u002F Check if event hits this widget's area\n        match event.hits(cx, self.area()) {\n            Hit::FingerDown(fe) => {\n                \u002F\u002F Mouse\u002Ftouch down on this widget\n                cx.action(MyWidgetAction::Pressed);\n            }\n            Hit::FingerUp(fe) => {\n                if fe.is_over {\n                    \u002F\u002F Released while still over widget = click\n                    cx.action(MyWidgetAction::Clicked);\n                }\n            }\n            Hit::FingerHoverIn(_) => {\n                self.animator_play(cx, id!(hover.on));\n            }\n            Hit::FingerHoverOut(_) => {\n                self.animator_play(cx, id!(hover.off));\n            }\n            Hit::KeyDown(ke) => {\n                if ke.key_code == KeyCode::Return {\n                    cx.action(MyWidgetAction::Submitted);\n                }\n            }\n            _ => {}\n        }\n    }\n}\n```\n\n## Hit Enum\n\n```rust\npub enum Hit {\n    \u002F\u002F Finger\u002FMouse\n    FingerDown(FingerDownEvent),\n    FingerUp(FingerUpEvent),\n    FingerMove(FingerMoveEvent),\n    FingerHoverIn(FingerHoverEvent),\n    FingerHoverOver(FingerHoverEvent),\n    FingerHoverOut(FingerHoverEvent),\n    FingerLongPress(FingerLongPressEvent),\n\n    \u002F\u002F Keyboard\n    KeyDown(KeyEvent),\n    KeyUp(KeyEvent),\n    KeyFocus,\n    KeyFocusLost,\n    TextInput(TextInputEvent),\n    TextCopy,\n\n    \u002F\u002F Nothing\n    Nothing,\n}\n```\n\n## Action System\n\n### Defining Actions\n\n```rust\n#[derive(Clone, Debug, DefaultNone)]\npub enum ButtonAction {\n    None,\n    Clicked,\n    Pressed,\n    Released,\n}\n\n\u002F\u002F DefaultNone derives Default returning None variant\n```\n\n### Emitting Actions\n\n```rust\n\u002F\u002F From main thread (in handle_event)\ncx.action(ButtonAction::Clicked);\n\n\u002F\u002F From any thread (thread-safe)\nCx::post_action(MyAction::DataLoaded(data));\n```\n\n### Handling Actions\n\n```rust\nfn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {\n    \u002F\u002F Handle child widget actions\n    let actions = cx.capture_actions(|cx| {\n        self.button.handle_event(cx, event, scope);\n    });\n\n    \u002F\u002F Check for specific action\n    if self.button(id!(my_button)).clicked(&actions) {\n        \u002F\u002F Button was clicked\n    }\n\n    \u002F\u002F Or iterate actions\n    for action in actions.iter() {\n        if let Some(ButtonAction::Clicked) = action.downcast_ref() {\n            \u002F\u002F Handle click\n        }\n    }\n}\n```\n\n## Widget Action Helpers\n\n```rust\n\u002F\u002F Common widget action checks\nimpl ButtonRef {\n    fn clicked(&self, actions: &ActionsBuf) -> bool;\n    fn pressed(&self, actions: &ActionsBuf) -> bool;\n    fn released(&self, actions: &ActionsBuf) -> bool;\n}\n\nimpl TextInputRef {\n    fn changed(&self, actions: &ActionsBuf) -> Option\u003CString>;\n    fn returned(&self, actions: &ActionsBuf) -> Option\u003CString>;\n}\n```\n\n## Event Flow\n\n1. **Event arrives** from platform layer\n2. **Root widget** receives event first\n3. **Propagates down** to children via `handle_event`\n4. **Widgets emit actions** via `cx.action()`\n5. **Parent captures actions** via `cx.capture_actions()`\n6. **App handles** remaining actions\n\n## Timer and NextFrame\n\n```rust\n\u002F\u002F Start a timer\nlet timer = cx.start_timer(1.0); \u002F\u002F 1 second\n\n\u002F\u002F In handle_event\nif let Event::Timer(te) = event {\n    if te.timer_id == self.timer {\n        \u002F\u002F Timer fired\n    }\n}\n\n\u002F\u002F Request next frame callback\nlet next_frame = cx.new_next_frame();\n\n\u002F\u002F In handle_event\nif let Event::NextFrame(ne) = event {\n    if ne.frame_id == self.next_frame {\n        \u002F\u002F Next frame arrived\n    }\n}\n```\n\n## When Answering Questions\n\n1. Use `event.hits(cx, area)` to check if event targets a widget\n2. Actions flow UP from child to parent (unlike events which flow DOWN)\n3. Use `cx.capture_actions()` to intercept child actions\n4. `Cx::post_action()` is thread-safe for async operations\n5. `DefaultNone` derive macro auto-implements Default for enums\n",{"name":5,"risk":20,"source":22,"description":28},"CRITICAL: Use for Makepad event and action handling. Triggers on:\nmakepad event, makepad action, Event enum, ActionTrait, handle_event,\nMouseDown, KeyDown, TouchUpdate, Hit, FingerDown, post_action,\nmakepad 事件, makepad action, 事件处理\n","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fmakepad-event-action",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill makepad-event-action",{"tool":43,"command":44},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill makepad-event-action",{"tool":46,"command":47},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill makepad-event-action","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fmakepad-event-action\u002FSKILL.md",true,[51,57,61],{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"references\u002Fapi_guide.md","REFERENCE","参考文档",12345,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fmedchem\u002Freferences\u002Fapi_guide.md",{"path":58,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":59,"sourceHtmlUrl":60},"references\u002Frules_catalog.md",12513,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fmedchem\u002Freferences\u002Frules_catalog.md",{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"scripts\u002Ffilter_molecules.py","SCRIPT","脚本",15697,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fmedchem\u002Fscripts\u002Ffilter_molecules.py",[68,81,97,124,143,169],{"skillNo":69,"name":70,"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":71,"categories":72,"keywords":78,"publishedAt":23},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[79,80],"Test Skill","test",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":23},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[88,89,90,91,92,93,94,22,95,96],"zustand store ts","zustand","store","with","types","middleware","patterns","create","typescript",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":106,"publishedAt":23},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000023","Skill与智能体开发",[107,108,109,110,111,112,113,114,115,116,117,118,119,120,22,121,122,123],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":131,"publishedAt":23},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[130],{"categoryNo":104,"categoryName":105,"taxonomyType":76,"taxonomyTypeDesc":77},[132,107,133,134,135,136,137,22,112,138,120,139,117,116,111,140,95,141,113,142],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":152,"publishedAt":23},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[149],{"categoryNo":150,"categoryName":151,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000009","前端开发",[153,154,155,156,157,96,20,158,159,160,161,162,91,163,164,165,166,22,167,168],"expert","zod","zod validation expert","validation","react","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":176,"publishedAt":23},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[175],{"categoryNo":104,"categoryName":105,"taxonomyType":76,"taxonomyTypeDesc":77},[177,178,179,180,181,182,183,184,22,185,186,187,188,189,190,191,192,193,194,113],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]