{"id":"cc65335e-16ba-4cd4-b5fc-cd95fc04febc","shortId":"YUmSun","kind":"skill","title":"molykit","tagline":"CRITICAL: Use for MolyKit AI chat toolkit. Triggers on:\nBotClient, OpenAI, SSE streaming, AI chat, molykit,\nPlatformSend, spawn(), ThreadToken, cross-platform async,\nChat widget, Messages, PromptInput, Avatar, LLM","description":"# MolyKit Skill\n\nBest practices for building AI chat interfaces with Makepad using MolyKit - a toolkit for cross-platform AI chat applications.\n\n**Source codebase**: `/Users/zhangalex/Work/Projects/FW/robius/moly/moly-kit`\n\n## When to Use\nUse this skill when:\n- Building AI chat interfaces with Makepad\n- Integrating OpenAI or other LLM APIs\n- Implementing cross-platform async for native and WASM\n- Creating chat widgets (messages, prompts, avatars)\n- Handling SSE streaming responses\n- Keywords: molykit, moly-kit, ai chat, bot client, openai makepad, chat widget, sse streaming\n\n## Overview\n\nMolyKit provides:\n- Cross-platform async utilities (PlatformSend, spawn(), ThreadToken)\n- Ready-to-use chat widgets (Chat, Messages, PromptInput, Avatar)\n- BotClient trait for AI provider integration\n- OpenAI-compatible client with SSE streaming\n- Protocol types for messages, bots, and tool calls\n- MCP (Model Context Protocol) support\n\n## Cross-Platform Async Patterns\n\n### PlatformSend - Send Only on Native\n\n```rust\n/// Implies Send only on native platforms, not on WASM\n/// - On native: implemented by types that implement Send\n/// - On WASM: implemented by ALL types\npub trait PlatformSend: PlatformSendInner {}\n\n/// Boxed future type for cross-platform use\npub type BoxPlatformSendFuture<'a, T> = Pin<Box<dyn PlatformSendFuture<Output = T> + 'a>>;\n\n/// Boxed stream type for cross-platform use\npub type BoxPlatformSendStream<'a, T> = Pin<Box<dyn PlatformSendStream<Item = T> + 'a>>;\n```\n\n### Platform-Agnostic Spawning\n\n```rust\n/// Runs a future independently\n/// - Uses tokio on native (requires Send)\n/// - Uses wasm-bindgen-futures on WASM (no Send required)\npub fn spawn(fut: impl PlatformSendFuture<Output = ()> + 'static);\n\n// Usage\nspawn(async move {\n    let result = fetch_data().await;\n    Cx::post_action(DataReady(result));\n    SignalToUI::set_ui_signal();\n});\n```\n\n### Task Cancellation with AbortOnDropHandle\n\n```rust\n/// Handle that aborts its future when dropped\npub struct AbortOnDropHandle(AbortHandle);\n\n// Usage - task cancelled when widget dropped\n#[rust]\ntask_handle: Option<AbortOnDropHandle>,\n\nfn start_task(&mut self) {\n    let (future, handle) = abort_on_drop(async move {\n        // async work...\n    });\n    self.task_handle = Some(handle);\n    spawn(async move { let _ = future.await; });\n}\n```\n\n### ThreadToken for Non-Send Types on WASM\n\n```rust\n/// Store non-Send value in thread-local, access via token\npub struct ThreadToken<T: 'static>;\n\nimpl<T> ThreadToken<T> {\n    pub fn new(value: T) -> Self;\n    pub fn peek<R>(&self, f: impl FnOnce(&T) -> R) -> R;\n    pub fn peek_mut<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;\n}\n\n// Usage - wrap non-Send type for use across Send boundaries\nlet token = ThreadToken::new(non_send_value);\nspawn(async move {\n    token.peek(|value| {\n        // use value...\n    });\n});\n```\n\n## BotClient Trait\n\n### Implementing AI Provider Integration\n\n```rust\npub trait BotClient: Send {\n    /// Send message with streamed response\n    fn send(\n        &mut self,\n        bot_id: &BotId,\n        messages: &[Message],\n        tools: &[Tool],\n    ) -> BoxPlatformSendStream<'static, ClientResult<MessageContent>>;\n\n    /// Get available bots/models\n    fn bots(&self) -> BoxPlatformSendFuture<'static, ClientResult<Vec<Bot>>>;\n\n    /// Clone for passing around\n    fn clone_box(&self) -> Box<dyn BotClient>;\n}\n\n// Usage\nlet client = OpenAIClient::new(\"https://api.openai.com/v1\".into());\nclient.set_key(\"sk-...\")?;\nlet context = BotContext::from(client);\n```\n\n### BotContext - Sharable Wrapper\n\n```rust\n/// Sharable wrapper with loaded bots for sync UI access\npub struct BotContext(Arc<Mutex<InnerBotContext>>);\n\nimpl BotContext {\n    pub fn load(&mut self) -> BoxPlatformSendFuture<ClientResult<()>>;\n    pub fn bots(&self) -> Vec<Bot>;\n    pub fn get_bot(&self, id: &BotId) -> Option<Bot>;\n    pub fn client(&self) -> Box<dyn BotClient>;\n}\n\n// Usage\nlet mut context = BotContext::from(client);\nspawn(async move {\n    if let Err(errors) = context.load().await.into_result() {\n        // handle errors\n    }\n    Cx::post_action(BotsLoaded);\n});\n```\n\n## Protocol Types\n\n### Message Structure\n\n```rust\npub struct Message {\n    pub from: EntityId,         // User, System, Bot(BotId), App\n    pub metadata: MessageMetadata,\n    pub content: MessageContent,\n}\n\npub struct MessageContent {\n    pub text: String,           // Main content (markdown)\n    pub reasoning: String,      // AI reasoning/thinking\n    pub citations: Vec<String>, // Source URLs\n    pub attachments: Vec<Attachment>,\n    pub tool_calls: Vec<ToolCall>,\n    pub tool_results: Vec<ToolResult>,\n}\n\npub struct MessageMetadata {\n    pub is_writing: bool,       // Still being streamed\n    pub created_at: DateTime<Utc>,\n}\n```\n\n### Bot Identification\n\n```rust\n/// Globally unique bot ID: <len>;<id>@<provider>\npub struct BotId(Arc<str>);\n\nimpl BotId {\n    pub fn new(id: &str, provider: &str) -> Self;\n    pub fn id(&self) -> &str;       // provider-local id\n    pub fn provider(&self) -> &str; // provider domain\n}\n\n// Example: BotId::new(\"gpt-4\", \"api.openai.com\")\n// -> \"5;gpt-4@api.openai.com\"\n```\n\n## Widget Patterns\n\n### Slot Widget - Runtime Content Replacement\n\n```rust\nlive_design! {\n    pub Slot = {{Slot}} {\n        width: Fill, height: Fit,\n        slot = <View> {}  // default content\n    }\n}\n\n// Usage - replace content at runtime\nlet mut slot = widget.slot(id!(content));\nif let Some(custom) = client.content_widget(cx, ...) {\n    slot.replace(custom);\n} else {\n    slot.restore();  // back to default\n    slot.default().as_standard_message_content().set_content(cx, &content);\n}\n```\n\n### Avatar Widget - Text/Image Toggle\n\n```rust\nlive_design! {\n    pub Avatar = {{Avatar}} <View> {\n        grapheme = <RoundedView> {\n            visible: false,\n            label = <Label> { text: \"P\" }\n        }\n        dependency = <RoundedView> {\n            visible: false,\n            image = <Image> {}\n        }\n    }\n}\n\nimpl Widget for Avatar {\n    fn draw_walk(&mut self, cx: &mut Cx2d, ...) -> DrawStep {\n        if let Some(avatar) = &self.avatar {\n            match avatar {\n                Picture::Grapheme(g) => {\n                    self.view(id!(grapheme)).set_visible(cx, true);\n                    self.view(id!(dependency)).set_visible(cx, false);\n                    self.label(id!(label)).set_text(cx, &g);\n                }\n                Picture::Dependency(d) => {\n                    self.view(id!(dependency)).set_visible(cx, true);\n                    self.view(id!(grapheme)).set_visible(cx, false);\n                    self.image(id!(image)).load_image_dep_by_path(cx, d.as_str());\n                }\n            }\n        }\n        self.deref.draw_walk(cx, scope, walk)\n    }\n}\n```\n\n### PromptInput Widget\n\n```rust\n#[derive(Live, Widget)]\npub struct PromptInput {\n    #[deref] deref: CommandTextInput,\n    #[live] pub send_icon: LiveValue,\n    #[live] pub stop_icon: LiveValue,\n    #[rust] pub task: Task,           // Send or Stop\n    #[rust] pub interactivity: Interactivity,\n}\n\nimpl PromptInput {\n    pub fn submitted(&self, actions: &Actions) -> bool;\n    pub fn reset(&mut self, cx: &mut Cx);\n    pub fn set_send(&mut self);\n    pub fn set_stop(&mut self);\n    pub fn enable(&mut self);\n    pub fn disable(&mut self);\n}\n```\n\n### Messages Widget - Conversation View\n\n```rust\n#[derive(Live, Widget)]\npub struct Messages {\n    #[deref] deref: View,\n    #[rust] pub messages: Vec<Message>,\n    #[rust] pub bot_context: Option<BotContext>,\n}\n\nimpl Messages {\n    pub fn set_messages(&mut self, messages: Vec<Message>, scroll_to_bottom: bool);\n    pub fn scroll_to_bottom(&mut self, cx: &mut Cx, triggered_by_stream: bool);\n    pub fn is_at_bottom(&self) -> bool;\n}\n```\n\n## UiRunner Pattern for Async-to-UI\n\n```rust\nimpl Widget for PromptInput {\n    fn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {\n        self.deref.handle_event(cx, event, scope);\n        self.ui_runner().handle(cx, event, scope, self);\n\n        if self.button(id!(attach)).clicked(event.actions()) {\n            let ui = self.ui_runner();\n            Attachment::pick_multiple(move |result| match result {\n                Ok(attachments) => {\n                    ui.defer_with_redraw(move |me, cx, _| {\n                        me.attachment_list_ref().write().attachments.extend(attachments);\n                    });\n                }\n                Err(_) => {}\n            });\n        }\n    }\n}\n```\n\n## SSE Streaming\n\n```rust\n/// Parse SSE byte stream into message stream\npub fn parse_sse<S, B, E>(s: S) -> impl Stream<Item = Result<String, E>>\nwhere\n    S: Stream<Item = Result<B, E>>,\n    B: AsRef<[u8]>,\n{\n    // Split on \"\\n\\n\", extract \"data:\" content\n    // Filter comments and [DONE] messages\n}\n\n// Usage in BotClient::send\nfn send(&mut self, ...) -> BoxPlatformSendStream<...> {\n    let stream = stream! {\n        let response = client.post(url).send().await?;\n        let events = parse_sse(response.bytes_stream());\n\n        for await event in events {\n            let completion: Completion = serde_json::from_str(&event)?;\n            content.text.push_str(&completion.delta.content);\n            yield ClientResult::new_ok(content.clone());\n        }\n    };\n    Box::pin(stream)\n}\n```\n\n## Best Practices\n\n1. **Use PlatformSend for cross-platform**: Same code works on native and WASM\n2. **Use spawn() not tokio::spawn**: Platform-agnostic task spawning\n3. **Use AbortOnDropHandle**: Cancel tasks when widget drops\n4. **Use ThreadToken for non-Send on WASM**: Thread-local storage with token access\n5. **Use Slot for custom content**: Allow BotClient to provide custom widgets\n6. **Use read()/write() pattern**: Safe borrow access via WidgetRef\n7. **Use UiRunner::defer_with_redraw**: Update widget from async context\n8. **Handle ClientResult partial success**: May have value AND errors\n\n## Reference Files\n\n- `llms.txt` - Complete MolyKit API reference\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["molykit","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity-skills"],"capabilities":["skill","source-sickn33","skill-molykit","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/molykit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34666 github stars · SKILL.md body (10,238 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T06:51:34.900Z","embedding":null,"createdAt":"2026-04-18T21:40:56.976Z","updatedAt":"2026-04-23T06:51:34.900Z","lastSeenAt":"2026-04-23T06:51:34.900Z","tsv":"'-4':651 '/users/zhangalex/work/projects/fw/robius/moly/moly-kit':55 '/v1':468 '/write':1166 '1':1102 '2':1116 '3':1127 '4':1135 '5':653,1151 '6':1163 '7':1173 '8':1184 'abort':288,315 'aborthandl':296 'abortondrophandl':284,295,1129 'access':349,490,1150,1170 'across':395 'action':274,544,845,846 'agnost':232,1124 'ai':6,15,37,50,64,99,133,415,580 'allow':1157 'api':74,1199 'api.openai.com':467,652 'api.openai.com/v1':466 'app':561 'applic':52 'arc':494,622 'around':455 'ask':1234 'asref':1038 'async':24,79,115,159,265,318,320,327,406,531,940,1182 'async-to-ui':939 'attach':588,976,983,991,1003 'attachments.extend':1002 'avail':443 'avatar':29,89,129,709,717,718,732,745,748 'await':271,1069,1077 'await.into':538 'b':1020,1035,1037 'back':697 'best':33,1100 'bindgen':248 'bool':604,847,914,928,935 'borrow':1169 'bot':101,147,432,446,486,507,513,559,612,617,898 'botclient':11,130,412,421,1054,1158 'botcontext':475,478,493,497,527 'botid':434,516,560,621,624,648 'bots/models':444 'botsload':545 'bottom':913,919,933 'boundari':397,1242 'box':194,208,212,226,458,460,522,1097 'boxplatformsendfutur':204,448,503 'boxplatformsendstream':222,439,1060 'build':36,63 'byte':1010 'call':150,592 'cancel':282,299,1130 'chat':7,16,25,38,51,65,85,100,105,124,126 'citat':583 'clarif':1236 'clear':1209 'click':977 'client':102,139,463,477,520,529 'client.content':690 'client.post':1066 'client.set':470 'clientresult':441,450,504,1093,1186 'clone':452,457 'code':1110 'codebas':54 'commandtextinput':817 'comment':1048 'compat':138 'complet':1082,1083,1197 'completion.delta.content':1091 'content':566,575,660,674,677,685,704,706,708,1046,1156 'content.clone':1096 'content.text.push':1089 'context':153,474,526,899,1183 'context.load':537 'convers':880 'creat':84,609 'criteria':1245 'critic':2 'cross':22,48,77,113,157,199,217,1107 'cross-platform':21,47,76,112,156,198,216,1106 'custom':689,694,1155,1161 'cx':272,542,692,707,738,757,764,771,781,788,798,803,853,855,922,924,953,955,963,969,997 'cx2d':740 'd':775 'd.as':799 'data':270,1045 'datareadi':275 'datetim':611 'default':673,699 'defer':1176 'dep':795 'depend':725,761,774,778 'deref':815,816,889,890 'deriv':809,883 'describ':1213 'design':664,715 'disabl':875 'domain':646 'done':1050 'draw':734 'drawstep':741 'drop':292,302,317,1134 'dyn':209,227 'e':1021,1029,1036 'els':695 'enabl':870 'entityid':556 'environ':1225 'environment-specif':1224 'err':535,1004 'error':536,541,1193 'event':950,956,957,962,964,970,1071,1078,1080,1088 'event.actions':978 'exampl':647 'expert':1230 'extract':1044 'f':369,380 'fals':721,727,765,789 'fetch':269 'file':1195 'fill':669 'filter':1047 'fit':671 'fn':256,307,360,366,376,428,445,456,499,506,511,519,626,634,642,733,842,849,857,863,869,874,904,916,930,948,1016,1056 'fnonc':371,382 'fut':258 'futur':195,237,249,290,313 'future.await':330 'g':751,772 'get':442,512 'global':615 'gpt':650 'gpt-4@api.openai.com':654 'graphem':719,750,754,785 'handl':90,286,305,314,323,325,540,949,968,1185 'height':670 'icon':821,826 'id':433,515,618,628,635,640,684,753,760,767,777,784,791,975 'identif':613 'imag':728,792,794 'impl':259,357,370,381,496,623,729,839,901,944,1024 'implement':75,178,182,186,414 'impli':167 'independ':238 'input':1239 'integr':69,135,417 'interact':837,838 'interfac':39,66 'item':1026,1033 'json':1085 'key':471 'keyword':94 'kit':98 'label':722,768 'let':267,312,329,398,462,473,524,534,680,687,743,979,1061,1064,1070,1081 'limit':1201 'list':999 'live':663,714,810,818,823,884 'livevalu':822,827 'llm':30,73 'llms.txt':1196 'load':485,500,793 'local':348,639,1146 'main':574 'makepad':41,68,104 'markdown':576 'match':747,988,1210 'may':1189 'mcp':151 'me.attachment':998 'messag':27,87,127,146,424,435,436,548,553,703,878,888,894,902,906,909,1013,1051 'messagecont':567,570 'messagemetadata':564,600 'metadata':563 'miss':1247 'model':152 'moli':97 'moly-kit':96 'molykit':1,5,17,31,43,95,110,1198 'move':266,319,328,407,532,986,995 'multipl':985 'mut':310,378,383,430,501,525,681,736,739,851,854,860,866,871,876,907,920,923,951,954,959,1058 'mutex':495 'n':1042,1043 'nativ':81,165,171,177,242,1113 'new':361,401,465,627,649,1094 'non':334,342,390,402,1140 'non-send':333,341,389,1139 'ok':990,1095 'openai':12,70,103,137 'openai-compat':136 'openaicli':464 'option':306,517,900 'output':261,1219 'overview':109 'p':724 'pars':1008,1017,1072 'partial':1187 'pass':454 'path':797 'pattern':160,656,937,1167 'peek':367,377 'permiss':1240 'pick':984 'pictur':749,773 'pin':207,225,1098 'platform':23,49,78,114,158,172,200,218,231,1108,1123 'platform-agnost':230,1122 'platformsend':18,117,161,192,1104 'platformsendfutur':210,260 'platformsendinn':193 'platformsendstream':228 'post':273,543 'practic':34,1101 'prompt':88 'promptinput':28,128,806,814,840,947 'protocol':143,154,546 'provid':111,134,416,630,638,643,645,1160 'provider-loc':637 'pub':190,202,220,255,293,352,359,365,375,419,491,498,505,510,518,551,554,562,565,568,571,577,582,587,590,594,598,601,608,619,625,633,641,665,716,812,819,824,829,836,841,848,856,862,868,873,886,893,897,903,915,929,1015 'r':373,374,385,386 'read':1165 'readi':121 'ready-to-us':120 'reason':578 'reasoning/thinking':581 'redraw':994,1178 'ref':1000 'refer':1194,1200 'replac':661,676 'requir':243,254,1238 'reset':850 'respons':93,427,1065 'response.bytes':1074 'result':268,276,539,596,987,989,1027,1034 'review':1231 'run':235 'runner':967,982 'runtim':659,679 'rust':166,234,285,303,339,418,481,550,614,662,713,808,828,835,882,892,896,943,1007 'safe':1168 'safeti':1241 'scope':804,958,960,965,971,1212 'scroll':911,917 'self':311,364,368,379,431,447,459,502,508,514,521,632,636,644,737,844,852,861,867,872,877,908,921,934,952,972,1059 'self.avatar':746 'self.button':974 'self.deref.draw':801 'self.deref.handle':961 'self.image':790 'self.label':766 'self.task':322 'self.ui':966,981 'self.view':752,759,776,783 'send':162,168,183,244,253,335,343,391,396,403,422,423,429,820,832,859,1055,1057,1068,1141 'serd':1084 'set':278,705,755,762,769,779,786,858,864,905 'sharabl':479,482 'signal':280 'signaltoui':277 'sk':472 'skill':32,61,1204 'skill-molykit' 'slot':657,666,667,672,682,1153 'slot.default':700 'slot.replace':693 'slot.restore':696 'sourc':53,585 'source-sickn33' 'spawn':19,118,233,257,264,326,405,530,1118,1121,1126 'specif':1226 'split':1040 'sse':13,91,107,141,1005,1009,1018,1073 'standard':702 'start':308 'static':262,356,440,449 'still':605 'stop':825,834,865,1232 'storag':1147 'store':340 'str':629,631,800,1087,1090 'stream':14,92,108,142,213,426,607,927,1006,1011,1014,1025,1032,1062,1063,1075,1099 'string':573,579,1028 'struct':294,353,492,552,569,599,620,813,887 'structur':549 'submit':843 'substitut':1222 'success':1188,1244 'support':155 'sync':488 'system':558 'task':281,298,304,309,830,831,1125,1131,1208 'test':1228 'text':572,723,770 'text/image':711 'thread':347,1145 'thread-loc':346,1144 'threadtoken':20,119,331,354,358,400,1137 'toggl':712 'token':351,399,1149 'token.peek':408 'tokio':240,1120 'tool':149,437,438,591,595 'toolkit':8,45 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'trait':131,191,413,420 'treat':1217 'trigger':9,925 'true':758,782 'type':144,180,189,196,203,214,221,336,392,547 'u8':1039 'ui':279,489,942,980 'ui.defer':992 'uirunn':936,1175 'uniqu':616 'updat':1179 'url':586,1067 'usag':263,297,387,461,523,675,1052 'use':3,42,58,59,123,201,219,239,245,394,410,1103,1117,1128,1136,1152,1164,1174,1202 'user':557 'util':116 'valid':1227 'valu':344,362,404,409,411,1191 'vec':451,509,584,589,593,597,895,910 'via':350,1171 'view':881,891 'visibl':720,726,756,763,780,787 'walk':735,802,805 'wasm':83,175,185,247,251,338,1115,1143 'wasm-bindgen-futur':246 'widget':26,86,106,125,301,655,658,691,710,730,807,811,879,885,945,1133,1162,1180 'widget.slot':683 'widgetref':1172 'width':668 'work':321,1111 'wrap':388 'wrapper':480,483 'write':603,1001 'yield':1092","prices":[{"id":"5e7b9ece-f4d9-4924-a2a6-fe964db714a7","listingId":"cc65335e-16ba-4cd4-b5fc-cd95fc04febc","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:40:56.976Z"}],"sources":[{"listingId":"cc65335e-16ba-4cd4-b5fc-cd95fc04febc","source":"github","sourceId":"sickn33/antigravity-awesome-skills/molykit","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/molykit","isPrimary":false,"firstSeenAt":"2026-04-18T21:40:56.976Z","lastSeenAt":"2026-04-23T06:51:34.900Z"}],"details":{"listingId":"cc65335e-16ba-4cd4-b5fc-cd95fc04febc","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"molykit","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34666,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"eb8f18fee9f8d636a82faf43c5076823334a7137","skill_md_path":"skills/molykit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/molykit"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"molykit","description":"CRITICAL: Use for MolyKit AI chat toolkit. Triggers on:\nBotClient, OpenAI, SSE streaming, AI chat, molykit,\nPlatformSend, spawn(), ThreadToken, cross-platform async,\nChat widget, Messages, PromptInput, Avatar, LLM"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/molykit"},"updatedAt":"2026-04-23T06:51:34.900Z"}}