[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CPED5M2ZXAVJDVT1K94GJS":3,"skill-same:01M6CPED5M2ZXAVJDVT1K94GJS":95},{"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":27,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":71,"commitSha":72,"skillDirectory":73,"forksCount":74,"repositoryHtmlUrl":75,"repositoryHomepageUrl":76,"ownerHtmlUrl":77,"ownerBlogUrl":78,"ownerDescription":79,"updatedAt":80,"install":81,"resources":94},"01M6CPED5M2ZXAVJDVT1K94GJS","learn",null,"The agent's cross-session notebook at ~\u002F.kinclaw\u002Flearned.md, organized\nby bundle_id \u002F topic. The kernel reads it at every boot and injects\nit into the system prompt (when it outgrows the prompt budget you see\na topic index plus the newest notes — use action=recall for the rest).\n\naction=add (default) — append one lesson after a task:\n  - AX schema quirks (depth needed, weird matchers)\n  - Working keyboard \u002F shell shortcuts that beat ui clicks\n  - Failed approaches + their error codes (so you don't retry next time)\n  - First-launch modal patterns\n  - bundle_id spelling (some apps use lowercase like com.apple.mail)\naction=recall topic=X — print one section (case-insensitive match)\naction=list — print the topic index\n\nAppends go to a section keyed on `topic` (usually a bundle_id).\nCreates the section if it doesn't exist; appends bullet lines if it\ndoes. No-op if the exact same line already exists (idempotent).","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\u002Flearn\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[5,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"append","next","lesson","patterns","notebook","default","Echo","up","only","session","go","list","common","system","Budget","ui","create","notes","kernel","2026-11-10 10:12:30",false,"---\nname: learn\ndescription: |\n  The agent's cross-session notebook at ~\u002F.kinclaw\u002Flearned.md, organized\n  by bundle_id \u002F topic. The kernel reads it at every boot and injects\n  it into the system prompt (when it outgrows the prompt budget you see\n  a topic index plus the newest notes — use action=recall for the rest).\n\n  action=add (default) — append one lesson after a task:\n    - AX schema quirks (depth needed, weird matchers)\n    - Working keyboard \u002F shell shortcuts that beat ui clicks\n    - Failed approaches + their error codes (so you don't retry next time)\n    - First-launch modal patterns\n    - bundle_id spelling (some apps use lowercase like com.apple.mail)\n  action=recall topic=X — print one section (case-insensitive match)\n  action=list — print the topic index\n\n  Appends go to a section keyed on `topic` (usually a bundle_id).\n  Creates the section if it doesn't exist; appends bullet lines if it\n  does. No-op if the exact same line already exists (idempotent).\ncommand:\n  - sh\n  - -c\n  - |\n    ACTION=\"${1:-add}\"\n    TOPIC=\"$2\"\n    NOTE=\"$3\"\n    FILE=\"$HOME\u002F.kinclaw\u002Flearned.md\"\n    mkdir -p \"$HOME\u002F.kinclaw\"\n    [ -f \"$FILE\" ] || printf '# KinClaw — learned across sessions\\n\\n' > \"$FILE\"\n\n    case \"$ACTION\" in\n      list)\n        # Topic index: every ## header with its bullet count.\n        awk '\u002F^## \u002F{ if (t!=\"\") printf \"%s (%d)\\n\", t, n; t=substr($0,4); n=0; next }\n             \u002F^- \u002F{ n++ }\n             END{ if (t!=\"\") printf \"%s (%d)\\n\", t, n }' \"$FILE\"\n        exit 0 ;;\n      recall)\n        [ -z \"$TOPIC\" ] && { echo \"topic required for recall\" >&2; exit 1; }\n        OUT=$(awk -v q=\"$(printf '%s' \"$TOPIC\" | tr 'A-Z' 'a-z')\" '\n             \u002F^## \u002F{ inhit = index(tolower(substr($0,4)), q) > 0 }\n             inhit { print }' \"$FILE\")\n        [ -z \"$OUT\" ] && { echo \"no section matching: $TOPIC (try action=list)\"; exit 0; }\n        printf '%s\\n' \"$OUT\"\n        exit 0 ;;\n      add|\"\") ;;\n      *) echo \"action must be add | recall | list (got $ACTION)\" >&2; exit 1 ;;\n    esac\n\n    [ -z \"$TOPIC\" ] && { echo \"topic required\" >&2; exit 1; }\n    [ -z \"$NOTE\" ] && { echo \"note required\" >&2; exit 1; }\n\n    # Idempotent: if exact line already exists, no-op. The `--` is\n    # important — leading \"- \" in $LINE would otherwise get parsed as\n    # a grep flag. Same for the section header check below.\n    LINE=\"- $NOTE\"\n    if grep -Fq -- \"$LINE\" \"$FILE\" 2>\u002Fdev\u002Fnull; then\n      echo \"already known: $TOPIC :: $NOTE\"\n      exit 0\n    fi\n\n    # Append to existing section if header exists, else create section.\n    HEADER=\"## $TOPIC\"\n    if grep -Fqx -- \"$HEADER\" \"$FILE\"; then\n      # Insert line right after the section header using awk so order is preserved.\n      awk -v hdr=\"$HEADER\" -v line=\"$LINE\" '\n        $0 == hdr { print; print line; next }\n        { print }\n      ' \"$FILE\" > \"$FILE.new\" && mv \"$FILE.new\" \"$FILE\"\n    else\n      printf '\\n%s\\n%s\\n' \"$HEADER\" \"$LINE\" >> \"$FILE\"\n    fi\n    echo \"learned: $TOPIC :: $NOTE\"\n  - \"_\"\nargs:\n  - \"{{action}}\"\n  - \"{{topic}}\"\n  - \"{{note}}\"\nschema:\n  action:\n    type: string\n    description: |\n      add (default) | recall | list. add appends a note; recall prints one topic's section; list prints the topic index.\n  topic:\n    type: string\n    description: |\n      Section header to file the note under (add) or look up (recall) — typically a bundle_id like \"com.apple.calculator\", \"com.apple.Notes\", or a generic category like \"Common: focus protection\". Required for add and recall.\n  note:\n    type: string\n    description: |\n      Single-line lesson learned (add only). Concise. No outer \"- \" (added automatically). Examples — \"AX tree depth ≥ 6 to see number buttons\", \"cmd+N + type more reliable than ui click 'New Note'\", \"AXError -25205 means the element is offscreen \u002F collapsed\".\ntimeout: 10\n---\n\n# learn — append to the cross-session notebook\n\nKinClaw's persistence layer for Genesis Protocol. Every successful\ntask or hard-won failure is an opportunity to make next session\nsmarter. This skill is the standardized way to write into\n`~\u002F.kinclaw\u002Flearned.md` — kernel auto-loads that file at boot and\ninjects it into the agent's system prompt. (Until v1.18 this skill wrote\nto `~\u002F.localkin\u002Flearned.md` while the kernel read `~\u002F.kinclaw\u002F` — the\nkernel still reads the old file so nothing written there is lost.)\n\n## Idempotent\n\nCalling `learn` with the same topic + note twice is a no-op. Safe to\nspam without polluting the notebook.\n\n## Examples\n\n```\nlearn topic=com.apple.calculator note=\"AX tree depth ≥ 6 to see number buttons\"\nlearn topic=com.apple.Notes note=\"cmd+N more reliable than ui click 'New Note'\"\nlearn topic=com.apple.reminders note=\"ui click description='Add Reminder' fails with AXError -25205; use cmd+N + type\"\nlearn topic=\"Common: focus protection\" note=\"osascript activate from Terminal-driven KinClaw rarely takes frontmost\"\nlearn action=list\nlearn action=recall topic=com.apple.Notes\n```\n\n## Why a SKILL.md and not native\n\nPure shell + awk. No Go state. The notebook lives at a known path\nthat the kernel already reads — this skill is just an idempotent\nappend helper. Nothing here belongs in the kernel.\n","# learn — append to the cross-session notebook\n\nKinClaw's persistence layer for Genesis Protocol. Every successful\ntask or hard-won failure is an opportunity to make next session\nsmarter. This skill is the standardized way to write into\n`~\u002F.kinclaw\u002Flearned.md` — kernel auto-loads that file at boot and\ninjects it into the agent's system prompt. (Until v1.18 this skill wrote\nto `~\u002F.localkin\u002Flearned.md` while the kernel read `~\u002F.kinclaw\u002F` — the\nkernel still reads the old file so nothing written there is lost.)\n\n## Idempotent\n\nCalling `learn` with the same topic + note twice is a no-op. Safe to\nspam without polluting the notebook.\n\n## Examples\n\n```\nlearn topic=com.apple.calculator note=\"AX tree depth ≥ 6 to see number buttons\"\nlearn topic=com.apple.Notes note=\"cmd+N more reliable than ui click 'New Note'\"\nlearn topic=com.apple.reminders note=\"ui click description='Add Reminder' fails with AXError -25205; use cmd+N + type\"\nlearn topic=\"Common: focus protection\" note=\"osascript activate from Terminal-driven KinClaw rarely takes frontmost\"\nlearn action=list\nlearn action=recall topic=com.apple.Notes\n```\n\n## Why a SKILL.md and not native\n\nPure shell + awk. No Go state. The notebook lives at a known path\nthat the kernel already reads — this skill is just an idempotent\nappend helper. Nothing here belongs in the kernel.\n",{"args":52,"name":5,"schema":56,"command":64,"timeout":69,"description":70},[53,54,55],"{{action}}","{{topic}}","{{note}}",{"note":57,"topic":60,"action":62},{"type":58,"description":59},"string","Single-line lesson learned (add only). Concise. No outer \"- \" (added automatically). Examples — \"AX tree depth ≥ 6 to see number buttons\", \"cmd+N + type more reliable than ui click 'New Note'\", \"AXError -25205 means the element is offscreen \u002F collapsed\".\n",{"type":58,"description":61},"Section header to file the note under (add) or look up (recall) — typically a bundle_id like \"com.apple.calculator\", \"com.apple.Notes\", or a generic category like \"Common: focus protection\". Required for add and recall.\n",{"type":58,"description":63},"add (default) | recall | list. add appends a note; recall prints one topic's section; list prints the topic index.\n",[65,66,67,68],"sh","-c","ACTION=\"${1:-add}\"\nTOPIC=\"$2\"\nNOTE=\"$3\"\nFILE=\"$HOME\u002F.kinclaw\u002Flearned.md\"\nmkdir -p \"$HOME\u002F.kinclaw\"\n[ -f \"$FILE\" ] || printf '# KinClaw — learned across sessions\\n\\n' > \"$FILE\"\n\ncase \"$ACTION\" in\n  list)\n    # Topic index: every ## header with its bullet count.\n    awk '\u002F^## \u002F{ if (t!=\"\") printf \"%s (%d)\\n\", t, n; t=substr($0,4); n=0; next }\n         \u002F^- \u002F{ n++ }\n         END{ if (t!=\"\") printf \"%s (%d)\\n\", t, n }' \"$FILE\"\n    exit 0 ;;\n  recall)\n    [ -z \"$TOPIC\" ] && { echo \"topic required for recall\" >&2; exit 1; }\n    OUT=$(awk -v q=\"$(printf '%s' \"$TOPIC\" | tr 'A-Z' 'a-z')\" '\n         \u002F^## \u002F{ inhit = index(tolower(substr($0,4)), q) > 0 }\n         inhit { print }' \"$FILE\")\n    [ -z \"$OUT\" ] && { echo \"no section matching: $TOPIC (try action=list)\"; exit 0; }\n    printf '%s\\n' \"$OUT\"\n    exit 0 ;;\n  add|\"\") ;;\n  *) echo \"action must be add | recall | list (got $ACTION)\" >&2; exit 1 ;;\nesac\n\n[ -z \"$TOPIC\" ] && { echo \"topic required\" >&2; exit 1; }\n[ -z \"$NOTE\" ] && { echo \"note required\" >&2; exit 1; }\n\n# Idempotent: if exact line already exists, no-op. The `--` is\n# important — leading \"- \" in $LINE would otherwise get parsed as\n# a grep flag. Same for the section header check below.\nLINE=\"- $NOTE\"\nif grep -Fq -- \"$LINE\" \"$FILE\" 2>\u002Fdev\u002Fnull; then\n  echo \"already known: $TOPIC :: $NOTE\"\n  exit 0\nfi\n\n# Append to existing section if header exists, else create section.\nHEADER=\"## $TOPIC\"\nif grep -Fqx -- \"$HEADER\" \"$FILE\"; then\n  # Insert line right after the section header using awk so order is preserved.\n  awk -v hdr=\"$HEADER\" -v line=\"$LINE\" '\n    $0 == hdr { print; print line; next }\n    { print }\n  ' \"$FILE\" > \"$FILE.new\" && mv \"$FILE.new\" \"$FILE\"\nelse\n  printf '\\n%s\\n%s\\n' \"$HEADER\" \"$LINE\" >> \"$FILE\"\nfi\necho \"learned: $TOPIC :: $NOTE\"\n","_",10,"The agent's cross-session notebook at ~\u002F.kinclaw\u002Flearned.md, organized\nby bundle_id \u002F topic. The kernel reads it at every boot and injects\nit into the system prompt (when it outgrows the prompt budget you see\na topic index plus the newest notes — use action=recall for the rest).\n\naction=add (default) — append one lesson after a task:\n  - AX schema quirks (depth needed, weird matchers)\n  - Working keyboard \u002F shell shortcuts that beat ui clicks\n  - Failed approaches + their error codes (so you don't retry next time)\n  - First-launch modal patterns\n  - bundle_id spelling (some apps use lowercase like com.apple.mail)\naction=recall topic=X — print one section (case-insensitive match)\naction=list — print the topic index\n\nAppends go to a section keyed on `topic` (usually a bundle_id).\nCreates the section if it doesn't exist; appends bullet lines if it\ndoes. No-op if the exact same line already exists (idempotent).\n","main","d1b92d10cddb779854af342bea74d0b6c46788e2","skills\u002Flearn",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":82,"prompt":92,"zipAvailable":93},[83,86,89],{"tool":84,"command":85},"npx","npx skills add LocalKinAI\u002Fkinclaw --skill learn",{"tool":87,"command":88},"bunx","bunx skills add LocalKinAI\u002Fkinclaw --skill learn",{"tool":90,"command":91},"pnpm","pnpm dlx skills add LocalKinAI\u002Fkinclaw --skill learn","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Flearn\u002FSKILL.md",true,[],[96,131,146,171,181,192],{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":111,"publishedAt":47},"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",[102,105,108],{"categoryNo":103,"categoryName":104,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理",{"categoryNo":106,"categoryName":107,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":109,"categoryName":110,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",[98,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130],"image","search","forms","files","log","read","text","wait for","how","scrape","start","PDF","run","generate","placeholder","change","react","css","directory",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":47},"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",[],[133,113,138,139,140,141,142,143,144,145,98],"three","location","use","question","python3","web search","api","forecast",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":156,"publishedAt":47},"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",[152,155],{"categoryNo":153,"categoryName":154,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[148,29,157,158,159,33,34,160,161,162,163,164,118,165,166,167,168,169,36,170],"back","chinese","multilingual","payload","pick","code","auto","model","Audio","Video","SET","data","server","macos",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":47},"01M6CPGAM9K2VN0MVYD4CMC92E","translate","Translate text between languages using the system's translate command","https:\u002F\u002Fgithub.com\u002FLocalKinAI\u002Fkinclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftranslate\u002FSKILL.md",[],[173,158,178,179,34,180,118,41],"spanish","language","command",{"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":47},"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":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究",[183,191],"file",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":199,"publishedAt":47},"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",[198],{"categoryNo":153,"categoryName":154,"taxonomyType":20,"taxonomyTypeDesc":21},[194,118,157,200,33,34,201,163,202,203,204,205,165,206,167,122,169,207,162,38],"do","en","pair","just","returns","mp4","endpoint","transcribe"]