[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CPEWYWF6P2T1WETNKA34WR":3,"skill-same:01M6CPEWYWF6P2T1WETNKA34WR":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":70,"repositoryHtmlUrl":71,"repositoryHomepageUrl":72,"ownerHtmlUrl":73,"ownerBlogUrl":74,"ownerDescription":75,"updatedAt":76,"install":77,"resources":89},"01M6CPEWYWF6P2T1WETNKA34WR","mail_draft",null,"Create a Mail draft (saved, not sent) with subject + body and an\noptional attachment. Uses Mail's AppleScript dictionary directly:\n`make new outgoing message` then `save` (NOT `send`). The draft\nappears in the Drafts mailbox of the default account.\n\nThis is the CORRECT path for any task that says \"save as Mail\ndraft\" \u002F \"share via Mail as draft\". Common wrong path: agents\nopen a compose window with Cmd+N, type subject + body, then close\nwith Cmd+W — that prompts a Save sheet they often skip, losing\nthe draft. This skill bypasses the compose window entirely.","LocalKinAI\u002Fkinclaw","LocalKinAI","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F228881863?v=4","01M6CPDM368JVRW78EPV2NDABD","01M6CPDM7CKTKCXE8JD7K3658Q",9,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Fmail_draft\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"mail draft","compose","message","sheet","task","attach","exit","default","properties","Echo","create","cmd","common","text","correct","open","SET","email","file","share","2026-11-10 10:12:30",false,"---\nname: mail_draft\ndescription: |\n  Create a Mail draft (saved, not sent) with subject + body and an\n  optional attachment. Uses Mail's AppleScript dictionary directly:\n  `make new outgoing message` then `save` (NOT `send`). The draft\n  appears in the Drafts mailbox of the default account.\n\n  This is the CORRECT path for any task that says \"save as Mail\n  draft\" \u002F \"share via Mail as draft\". Common wrong path: agents\n  open a compose window with Cmd+N, type subject + body, then close\n  with Cmd+W — that prompts a Save sheet they often skip, losing\n  the draft. This skill bypasses the compose window entirely.\ncommand:\n  - sh\n  - -c\n  - |\n    SUBJECT=\"$1\"; BODY=\"$2\"; ATTACH=\"$3\"; TO=\"$4\"\n    [ -z \"$SUBJECT\" ] && { echo \"subject required\" >&2; exit 1; }\n\n    # Escape backslashes and double-quotes for AppleScript string literals.\n    esc() { printf '%s' \"$1\" | \u002Fusr\u002Fbin\u002Fsed -e 's\u002F\\\\\u002F\\\\\\\\\u002Fg' -e 's\u002F\"\u002F\\\\\"\u002Fg'; }\n    SUBJECT_E=\"$(esc \"$SUBJECT\")\"\n    BODY_E=\"$(esc \"$BODY\")\"\n    TO_E=\"$(esc \"$TO\")\"\n    # ATTACH is a path — leave it as-is for POSIX file coercion\n\n    osascript 2>&1 \u003C\u003CAPPLE\n    tell application \"Mail\"\n        set newMsg to make new outgoing message with properties ¬\n            {subject:\"$SUBJECT_E\", content:\"$BODY_E\", visible:false}\n        if \"$TO_E\" is not \"\" then\n            try\n                tell newMsg to make new to recipient at end of to recipients ¬\n                    with properties {address:\"$TO_E\"}\n            end try\n        end if\n        if \"$ATTACH\" is not \"\" then\n            try\n                tell newMsg to make new attachment ¬\n                    with properties {file name:(POSIX file \"$ATTACH\")}\n            on error errMsg\n                save newMsg\n                return \"draft_saved_no_attach: \" & errMsg\n            end try\n        end if\n        save newMsg\n        return \"draft_saved\"\n    end tell\n    APPLE\n  - \"_\"\nargs:\n  - \"{{subject}}\"\n  - \"{{body}}\"\n  - \"{{attachment}}\"\n  - \"{{to}}\"\nschema:\n  subject:\n    type: string\n    description: Email subject line (required)\n    required: true\n  body:\n    type: string\n    description: Plain-text body of the email\n    required: false\n    default: \"\"\n  attachment:\n    type: string\n    description: Absolute POSIX path to a file to attach (optional)\n    required: false\n    default: \"\"\n  to:\n    type: string\n    description: Recipient email address (optional — drafts can have empty to)\n    required: false\n    default: \"\"\ntimeout: 30\n---\n\n# mail_draft — create + save a Mail draft (no send)\n\nWraps the canonical AppleScript Mail draft pattern. `save` commits\nthe message to the Drafts mailbox without sending. `send` is NEVER\ncalled from this skill.\n\n## Examples\n\n```\nmail_draft subject=\"KinBench Share 167\" body=\"forwarding the note\"\n  → draft_saved\n\nmail_draft subject=\"KinBench 369\" body=\"see attached\" attachment=\"\u002FUsers\u002Fme\u002FDesktop\u002Fkinbench\u002F369-note.pdf\"\n  → draft_saved\n```\n","# mail_draft — create + save a Mail draft (no send)\n\nWraps the canonical AppleScript Mail draft pattern. `save` commits\nthe message to the Drafts mailbox without sending. `send` is NEVER\ncalled from this skill.\n\n## Examples\n\n```\nmail_draft subject=\"KinBench Share 167\" body=\"forwarding the note\"\n  → draft_saved\n\nmail_draft subject=\"KinBench 369\" body=\"see attached\" attachment=\"\u002FUsers\u002Fme\u002FDesktop\u002Fkinbench\u002F369-note.pdf\"\n  → draft_saved\n```\n",{"args":43,"name":5,"schema":48,"command":60,"timeout":65,"description":66},[44,45,46,47],"{{subject}}","{{body}}","{{attachment}}","{{to}}",{"to":49,"body":53,"subject":55,"attachment":58},{"type":50,"default":51,"required":39,"description":52},"string","","Recipient email address (optional — drafts can have empty to)",{"type":50,"default":51,"required":39,"description":54},"Plain-text body of the email",{"type":50,"required":56,"description":57},true,"Email subject line (required)",{"type":50,"default":51,"required":39,"description":59},"Absolute POSIX path to a file to attach (optional)",[61,62,63,64],"sh","-c","SUBJECT=\"$1\"; BODY=\"$2\"; ATTACH=\"$3\"; TO=\"$4\"\n[ -z \"$SUBJECT\" ] && { echo \"subject required\" >&2; exit 1; }\n\n# Escape backslashes and double-quotes for AppleScript string literals.\nesc() { printf '%s' \"$1\" | \u002Fusr\u002Fbin\u002Fsed -e 's\u002F\\\\\u002F\\\\\\\\\u002Fg' -e 's\u002F\"\u002F\\\\\"\u002Fg'; }\nSUBJECT_E=\"$(esc \"$SUBJECT\")\"\nBODY_E=\"$(esc \"$BODY\")\"\nTO_E=\"$(esc \"$TO\")\"\n# ATTACH is a path — leave it as-is for POSIX file coercion\n\nosascript 2>&1 \u003C\u003CAPPLE\ntell application \"Mail\"\n    set newMsg to make new outgoing message with properties ¬\n        {subject:\"$SUBJECT_E\", content:\"$BODY_E\", visible:false}\n    if \"$TO_E\" is not \"\" then\n        try\n            tell newMsg to make new to recipient at end of to recipients ¬\n                with properties {address:\"$TO_E\"}\n        end try\n    end if\n    if \"$ATTACH\" is not \"\" then\n        try\n            tell newMsg to make new attachment ¬\n                with properties {file name:(POSIX file \"$ATTACH\")}\n        on error errMsg\n            save newMsg\n            return \"draft_saved_no_attach: \" & errMsg\n        end try\n    end if\n    save newMsg\n    return \"draft_saved\"\nend tell\nAPPLE\n","_",30,"Create a Mail draft (saved, not sent) with subject + body and an\noptional attachment. Uses Mail's AppleScript dictionary directly:\n`make new outgoing message` then `save` (NOT `send`). The draft\nappears in the Drafts mailbox of the default account.\n\nThis is the CORRECT path for any task that says \"save as Mail\ndraft\" \u002F \"share via Mail as draft\". Common wrong path: agents\nopen a compose window with Cmd+N, type subject + body, then close\nwith Cmd+W — that prompts a Save sheet they often skip, losing\nthe draft. This skill bypasses the compose window entirely.\n","main","d1b92d10cddb779854af342bea74d0b6c46788e2","skills\u002Fmail_draft",3,"https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw","https:\u002F\u002Fwww.localkin.app\u002Fkinclaw","https:\u002F\u002Fgithub.com\u002FLocalKinAI","localkin.ai","Faith and Chinese medicine at localkin.ai · the LocalKin agent platform at localkin.dev · open-source tools (kinfer, KinClaw, …) at localkin.app","2026-11-01 12:25:06",{"source":8,"skillName":5,"commands":78,"prompt":88,"zipAvailable":56},[79,82,85],{"tool":80,"command":81},"npx","npx skills add LocalKinAI\u002Fkinclaw --skill mail_draft",{"tool":83,"command":84},"bunx","bunx skills add LocalKinAI\u002Fkinclaw --skill mail_draft",{"tool":86,"command":87},"pnpm","pnpm dlx skills add LocalKinAI\u002Fkinclaw --skill mail_draft","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Fmail_draft\u002FSKILL.md",[],[91,127,142,170,181,191],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":108,"publishedAt":38},"01M6CPGNC9S31FTGMV90NZ0EN9","web","Universal web tool — fetches and interacts with web pages through\nreal Chromium (Playwright). Renders JavaScript, follows redirects,\nhandles cookies, bypasses many anti-scrape stubs that block plain\n`web_fetch`. Each call launches a fresh browser, executes the\nrequested flow, closes. ~2-3s cold start; no persistent state.\n\nUse INSTEAD of `web_fetch` when:\n  - Target is a JS-heavy SPA (prices via XHR, lazy content)\n  - `web_fetch` returned an anti-scrape placeholder (Zhihu's\n    \"click here\" stub, JD's chrome-only HTML)\n  - You need to interact (click, fill input) before extracting\n\nCommon patterns:\n  fetch rendered text:           url=X\n  wait for content then read:    url=X wait_for=\".price\"\n  extract specific element:      url=X selector=\".product-list\"\n  click and read result:         url=X click=\".search-button\"\n  fill form, then read:          url=X click=\"input[name=q]\" type_text=\"kinclaw\"\n  fill + Enter (React forms):    url=X click=\"input\" type_text=\"hi\" press_enter=true wait_for=\".reply\"\n  screenshot the page:           url=X screenshot=true (returns image:\u002F\u002F marker)\n  run JS and get result:         url=X js=\"document.title\"\n\nFirst-time setup (one-time per machine, ~500MB Chromium download):\n  pip install playwright\n  playwright install chromium","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweb\u002FSKILL.md",[97,102,105],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":103,"categoryName":104,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":106,"categoryName":107,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000009","前端开发",[93,109,110,111,112,113,114,31,115,116,117,118,119,120,121,122,123,124,125,126],"image","search","forms","files","log","read","wait for","how","scrape","start","PDF","run","generate","placeholder","change","react","css","directory",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":38},"01M6CPGJTGF7P8QS3HXPCZE3KV","weather","Current conditions plus a three-day forecast (today \u002F tomorrow \u002F day\nafter) for a place, in metric, from wttr.in. No API key. Use this for\nany weather question — including \"明天\" and \"后天\" — before reaching\nfor web search.","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[129,110,134,135,136,137,138,139,140,141,93],"three","location","use","question","python3","web search","api","forecast",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":154,"publishedAt":38},"01M6CPGDR0W8FR0WMBBJ2282GM","tts","Synthesize speech from text and play it through the macOS speakers.\nTalks to a local LocalKin Service Audio Server (default :8001 \u002F Kokoro).\nWhen `record` is running with audio=true, the spoken audio is\ncaptured into the recording — use this in place of `shell say` for\nhigh-quality multilingual narration in demo videos. Set the\nTTS_ENDPOINT env var to point at a different server.","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftts\u002FSKILL.md",[148,151],{"categoryNo":149,"categoryName":150,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":152,"categoryName":153,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000023","Skill与智能体开发",[144,155,156,157,158,25,27,159,160,161,162,163,31,164,165,34,166,167,168,169],"next","back","chinese","multilingual","payload","pick","code","auto","model","Audio","Video","data","server","only","macos",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":38},"01M6CPGAM9K2VN0MVYD4CMC92E","translate","Translate text between languages using the system's translate command","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftranslate\u002FSKILL.md",[],[172,157,177,178,27,179,31,180],"spanish","language","command","system",{"skillNo":182,"name":183,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":190,"publishedAt":38},"01M6CPG8DWEY0GWCFDGTTBWA2Q","summarize","Summarize a file's contents into key bullet points","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Fsummarize\u002FSKILL.md",[187],{"categoryNo":188,"categoryName":189,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000021","资料检索与研究",[183,36],{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":198,"publishedAt":38},"01M6CPG48P3AYKRREAGYSGT944","stt","Transcribe an audio file (wav\u002Fmp3\u002Fmp4\u002Fm4a) into text via a local\nLocalKin Service Audio Server (default :8000 \u002F SenseVoice). Pair\nwith `record action=start mic=true` to turn a recorded mic track\ninto text. Set STT_ENDPOINT env var to point at a different server.","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Fstt\u002FSKILL.md",[197],{"categoryNo":149,"categoryName":150,"taxonomyType":100,"taxonomyTypeDesc":101},[193,31,156,199,25,27,200,162,201,202,203,204,164,205,34,118,167,206,161,207],"do","en","pair","just","returns","mp4","endpoint","transcribe","go"]