[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7EM05J7PBY5QMWT8C1EGCJ7":3,"skill-same:01M7EM05J7PBY5QMWT8C1EGCJ7":57},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":36,"ownerDescription":6,"updatedAt":37,"install":38,"resources":50},"01M7EM05J7PBY5QMWT8C1EGCJ7","switchbot",null,"Read and control SwitchBot devices: Bots, Locks, curtains, plugs, lights, AC, IR remotes, scenes. Trigger phrases: switchbot, switchbot lock, switchbot bot, switchbot curtain.","TanNhatCMS\u002Fjarvis","TanNhatCMS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F113796420?v=4","01M753MV17KG5CD3152G3WQEQY","KietNT","01M7EKEDYVYQ6PWVJJMZ911VMX",0,"MIT","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fconnectors\u002Fswitchbot\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: \"switchbot\"\ndescription: \"Read and control SwitchBot devices: Bots, Locks, curtains, plugs, lights, AC, IR remotes, scenes. Trigger phrases: switchbot, switchbot lock, switchbot bot, switchbot curtain.\"\nmetadata: { \"includeInPrompt\": true }\ntagline: \"Read status and send commands to SwitchBot devices over the official OpenAPI v1.1: SwitchBot Bot (physical button presser), SwitchBot Lock, Curtain and Blind Tilt motors, plugs, lights, air conditioners, infrared remotes, and saved scenes. Use it when the user asks about or wants to change anything in their SwitchBot setup. Commands drive real physical hardware, so writes are confirmation-gated (see Operating Rules).\"\ncatalog_auth: \"token + secret pair via the secure credential flow\"\ncatalog_hosts: [\"api.switch-bot.com\"]\n---\n\n# SwitchBot\n\n## Purpose\nRead status and send commands to SwitchBot devices over the official OpenAPI\nv1.1: SwitchBot Bot (physical button presser), SwitchBot Lock, Curtain and\nBlind Tilt motors, plugs, lights, air conditioners, infrared remotes, and\nsaved scenes. Use it when the user asks about or wants to change anything in\ntheir SwitchBot setup. Commands drive real physical hardware, so writes are\nconfirmation-gated (see Operating Rules).\n\n## Tooling\nAll commands go through `bin\u002Fswitchbot.py`:\n\n```bash\nbin\u002Fswitchbot.py auth                                   # status check: verify token, count devices\nbin\u002Fswitchbot.py devices                                # list devices and IR remotes\nbin\u002Fswitchbot.py status --id \u003CdeviceId>                 # read device status\n\n# Writes. lock\u002Funlock are HIGH: they REQUIRE --confirm naming the exact\n# physical effect, on every run:\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command lock \\\n    --confirm \"lock the back door SwitchBot lock\"\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command unlock \\\n    --confirm \"unlock the back door SwitchBot lock\"\n\n# press \u002F turnOn \u002F turnOff \u002F setAll are MEDIUM: --confirm on first use per\n# device, then proceed:\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command press \\\n    --confirm \"press the coffee machine power button with the SwitchBot Bot\"\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command turnOn \\\n    --confirm \"turn on the SwitchBot plug in the workshop\"\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command setAll \\\n    --param mode=1 --param temperature=24 --param fanSpeed=2 \\\n    --confirm \"set the bedroom AC to cool 24 degrees, fan medium\"\n\n# Curtain\u002Fblind moves (setPosition) are LOW: they proceed with a logged notice:\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command setPosition --param position=0\n\n# Scenes are HIGH (their effects are whatever was saved into them):\nbin\u002Fswitchbot.py scenes\nbin\u002Fswitchbot.py scene-execute --scene-id \u003CsceneId> \\\n    --confirm \"run the Movie Night scene (dims lights, closes curtains)\"\n```\n\n`--param KEY=VALUE` builds the command's parameter as a JSON object\n(`setPosition` uses `position`, AC `setAll` uses `mode`, `temperature`,\n`fanSpeed`, `power`). For simple commands (`press`, `turnOn`, `turnOff`,\n`lock`, `unlock`) omit `--param` and the default parameter `\"default\"` is\nused, or pass `--parameter` with a raw string.\n\n## Auth\n- Provider id: `switchbot` (credential is collected as `custom.switchbot`)\n- Collection: ONE combined value `token:secret` via the secure credential\n  flow (`credentials.request_api_access`). In the SwitchBot app go to\n  Profile > Preferences, tap the app version several times to reveal\n  developer options, and copy the open token plus the secret. The CLI sends\n  the token in the `Authorization` header and an HMAC-SHA256 signature of\n  `token + t + nonce` (keyed by the secret) in the `sign` header, with `t`\n  and `nonce` headers.\n- BLE devices (Bot, Lock, Curtain, Blind Tilt) need a SwitchBot Hub with\n  cloud services enabled to be reachable through this API.\n- Allowed hosts: `api.switch-bot.com`\n- Status check: `bin\u002Fswitchbot.py auth`\n\n## Operating Rules\n1. **HIGH actuations are blocked without explicit confirmation.** `lock` and\n   `unlock` on a SwitchBot Lock, and scene executions, require\n   `--confirm \"\u003Cexact physical effect>\"` on every run. Never pre-fill the\n   confirmation: the exact effect must come from the user's own words.\n2. **MEDIUM actuations confirm on first use per device.** Bot `press`\n   (physically presses a real button), plug and light toggles, and AC\n   commands (`setAll`, `setMode`) need `--confirm` the first time a device\n   is actuated; the CLI records it locally\n   (`~\u002F.config\u002Fmuse-connectors\u002Fswitchbot\u002Fconfirmed.json`) and later runs\n   proceed.\n3. **LOW actuations proceed with a logged notice.** Curtain and Blind Tilt\n   moves (`setPosition`) print a notice to stderr and run without\n   confirmation.\n4. A scene's physical effects are whatever the user saved into it. Read back\n   what the scene does before confirming if it is not obvious from its name.\n5. Reads (`auth`, `devices`, `status`, `scenes`) never need confirmation.\n6. **Rate limit:** about 10,000 requests\u002Fday. Poll `status` sparingly.\n7. **Open item:** the HMAC signature is computed over the credential\n   surrogate as delivered by the credential store. Confirm the signature\n   verifies against SwitchBot's servers on first live use before trusting\n   signed calls.\n8. Never exfiltrate the credential: the CLI only ever handles surrogates. Do\n   not print, log, or transmit the token or secret values.\n\n## Files\n- SKILL.md\n- bin\u002Fswitchbot.py\n\n## Maturity\n🧪 Draft: written from SwitchBot's public OpenAPI v1.1 docs; not yet\nlive-tested end-to-end. The signature-header construction and the command\nparameter shapes are untested against real SwitchBot devices.\n","# SwitchBot\n\n## Purpose\nRead status and send commands to SwitchBot devices over the official OpenAPI\nv1.1: SwitchBot Bot (physical button presser), SwitchBot Lock, Curtain and\nBlind Tilt motors, plugs, lights, air conditioners, infrared remotes, and\nsaved scenes. Use it when the user asks about or wants to change anything in\ntheir SwitchBot setup. Commands drive real physical hardware, so writes are\nconfirmation-gated (see Operating Rules).\n\n## Tooling\nAll commands go through `bin\u002Fswitchbot.py`:\n\n```bash\nbin\u002Fswitchbot.py auth                                   # status check: verify token, count devices\nbin\u002Fswitchbot.py devices                                # list devices and IR remotes\nbin\u002Fswitchbot.py status --id \u003CdeviceId>                 # read device status\n\n# Writes. lock\u002Funlock are HIGH: they REQUIRE --confirm naming the exact\n# physical effect, on every run:\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command lock \\\n    --confirm \"lock the back door SwitchBot lock\"\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command unlock \\\n    --confirm \"unlock the back door SwitchBot lock\"\n\n# press \u002F turnOn \u002F turnOff \u002F setAll are MEDIUM: --confirm on first use per\n# device, then proceed:\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command press \\\n    --confirm \"press the coffee machine power button with the SwitchBot Bot\"\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command turnOn \\\n    --confirm \"turn on the SwitchBot plug in the workshop\"\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command setAll \\\n    --param mode=1 --param temperature=24 --param fanSpeed=2 \\\n    --confirm \"set the bedroom AC to cool 24 degrees, fan medium\"\n\n# Curtain\u002Fblind moves (setPosition) are LOW: they proceed with a logged notice:\nbin\u002Fswitchbot.py command --id \u003CdeviceId> --command setPosition --param position=0\n\n# Scenes are HIGH (their effects are whatever was saved into them):\nbin\u002Fswitchbot.py scenes\nbin\u002Fswitchbot.py scene-execute --scene-id \u003CsceneId> \\\n    --confirm \"run the Movie Night scene (dims lights, closes curtains)\"\n```\n\n`--param KEY=VALUE` builds the command's parameter as a JSON object\n(`setPosition` uses `position`, AC `setAll` uses `mode`, `temperature`,\n`fanSpeed`, `power`). For simple commands (`press`, `turnOn`, `turnOff`,\n`lock`, `unlock`) omit `--param` and the default parameter `\"default\"` is\nused, or pass `--parameter` with a raw string.\n\n## Auth\n- Provider id: `switchbot` (credential is collected as `custom.switchbot`)\n- Collection: ONE combined value `token:secret` via the secure credential\n  flow (`credentials.request_api_access`). In the SwitchBot app go to\n  Profile > Preferences, tap the app version several times to reveal\n  developer options, and copy the open token plus the secret. The CLI sends\n  the token in the `Authorization` header and an HMAC-SHA256 signature of\n  `token + t + nonce` (keyed by the secret) in the `sign` header, with `t`\n  and `nonce` headers.\n- BLE devices (Bot, Lock, Curtain, Blind Tilt) need a SwitchBot Hub with\n  cloud services enabled to be reachable through this API.\n- Allowed hosts: `api.switch-bot.com`\n- Status check: `bin\u002Fswitchbot.py auth`\n\n## Operating Rules\n1. **HIGH actuations are blocked without explicit confirmation.** `lock` and\n   `unlock` on a SwitchBot Lock, and scene executions, require\n   `--confirm \"\u003Cexact physical effect>\"` on every run. Never pre-fill the\n   confirmation: the exact effect must come from the user's own words.\n2. **MEDIUM actuations confirm on first use per device.** Bot `press`\n   (physically presses a real button), plug and light toggles, and AC\n   commands (`setAll`, `setMode`) need `--confirm` the first time a device\n   is actuated; the CLI records it locally\n   (`~\u002F.config\u002Fmuse-connectors\u002Fswitchbot\u002Fconfirmed.json`) and later runs\n   proceed.\n3. **LOW actuations proceed with a logged notice.** Curtain and Blind Tilt\n   moves (`setPosition`) print a notice to stderr and run without\n   confirmation.\n4. A scene's physical effects are whatever the user saved into it. Read back\n   what the scene does before confirming if it is not obvious from its name.\n5. Reads (`auth`, `devices`, `status`, `scenes`) never need confirmation.\n6. **Rate limit:** about 10,000 requests\u002Fday. Poll `status` sparingly.\n7. **Open item:** the HMAC signature is computed over the credential\n   surrogate as delivered by the credential store. Confirm the signature\n   verifies against SwitchBot's servers on first live use before trusting\n   signed calls.\n8. Never exfiltrate the credential: the CLI only ever handles surrogates. Do\n   not print, log, or transmit the token or secret values.\n\n## Files\n- SKILL.md\n- bin\u002Fswitchbot.py\n\n## Maturity\n🧪 Draft: written from SwitchBot's public OpenAPI v1.1 docs; not yet\nlive-tested end-to-end. The signature-header construction and the command\nparameter shapes are untested against real SwitchBot devices.\n",{"name":5,"tagline":24,"metadata":25,"description":7,"catalog_auth":27,"catalog_hosts":28},"Read status and send commands to SwitchBot devices over the official OpenAPI v1.1: SwitchBot Bot (physical button presser), SwitchBot Lock, Curtain and Blind Tilt motors, plugs, lights, air conditioners, infrared remotes, and saved scenes. Use it when the user asks about or wants to change anything in their SwitchBot setup. Commands drive real physical hardware, so writes are confirmation-gated (see Operating Rules).",{"includeInPrompt":26},true,"token + secret pair via the secure credential flow",[29],"api.switch-bot.com","main","af388a77c2fe5e0b4fd879cca4300a0ffa9a6579","connectors\u002Fswitchbot",1,"https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis","https:\u002F\u002Fgithub.com\u002FTanNhatCMS","https:\u002F\u002Fmrkiet.name.vn","2026-11-07 14:23:08",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":26},[40,43,46],{"tool":41,"command":42},"npx","npx skills add TanNhatCMS\u002Fjarvis --skill switchbot",{"tool":44,"command":45},"bunx","bunx skills add TanNhatCMS\u002Fjarvis --skill switchbot",{"tool":47,"command":48},"pnpm","pnpm dlx skills add TanNhatCMS\u002Fjarvis --skill switchbot","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fconnectors\u002Fswitchbot\u002FSKILL.md",[51],{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"bin\u002Fswitchbot.py","SCRIPT","脚本",12056,"https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fconnectors\u002Fswitchbot\u002Fbin\u002Fswitchbot.py",[58,65,73,80,87,94],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M7EWYJR0J8DARY7E59Z6Y9MV","web-scrape","Turn web pages into LLM-ready markdown via the Firecrawl API (renders JS, anti-bot handling). Use when browser_open\u002Ffetch fails on JS-heavy pages, or when you need clean markdown\u002Fstructured extraction from a site. Requires FIRECRAWL_API_KEY.","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fweb-scrape\u002FSKILL.md",[],[],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":69,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M7EWYBN5P6F2AJG3FR24T9BP","design-taste-frontend","tasteskill v2, the anti-slop frontend skill. Art direction for websites, distilled from a study of 247 curated gallery sites (One Page Love, Awwwards Sites of the Day). Deals researched directions (idea, composition, type, palette, photographs, section blueprints) from a library, enforces a strict no-slop house style with a real-browser inspector, and runs a look-and-fix loop on screenshots. Use this whenever you build, design, redesign, restyle, polish or review a landing page, marketing site, portfolio, product page, one-pager, hero or any public-facing web page, in any stack (HTML\u002FCSS, React, Next.js, Vue, Svelte, Astro, Tailwind) — also when the user says a page looks generic, templated, \"AI-made\", sloppy, or asks to make it look designed, premium, award-level or less like every other site. Not for dashboards or app screens.","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Ftaste-design\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Ftaste-design\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M7EWY8FQFNQ2GB7NZZWGSSDX","test-driven-development","Use when implementing any feature or bugfix, before writing implementation code","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-tdd\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M7EWY5SHBFRH1HDHVWM9K7TV","systematic-debugging","Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-debugging\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":19},"01M7EWY3NM0Z0JAKS7HDZ24K66","requesting-code-review","Use when completing tasks, implementing major features, or before merging to verify work meets requirements","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-code-review\u002FSKILL.md",[],[],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":19},"01M7EWY0WRMWX4M9ZFY0WKC593","brainstorming","You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-brainstorming\u002FSKILL.md",[],[]]