[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E2DHB3SM2WPF75DMQA6PP3":3,"skill-same:01M6E2DHB3SM2WPF75DMQA6PP3":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":13,"repositoryHtmlUrl":43,"repositoryHomepageUrl":44,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6E2DHB3SM2WPF75DMQA6PP3","node-connect",null,"Diagnose OpenClaw Android, iOS, or macOS node pairing, QR\u002Fsetup code, route, auth, and connection failures.","7dvq6yrkgs-stack\u002Fplaywright","7dvq6yrkgs-stack","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F251638143?v=4","01M6E061J2AMGWYZ6TK7Y8NM74","01M6E061PQCQJGQMPBERMCFN5G",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fnode-connect\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34],"node connect","connect","node","openclaw","macos","android","auth","setup","diagnose","code","ios","route","2026-11-10 10:12:30",false,"---\nname: node-connect\ndescription: Diagnose OpenClaw Android, iOS, or macOS node pairing, QR\u002Fsetup code, route, auth, and connection failures.\n---\n\n# Node Connect\n\nGoal: find the one real route from node -> gateway, verify OpenClaw is advertising that route, then fix pairing\u002Fauth.\n\n## Topology first\n\nDecide which case you are in before proposing fixes:\n\n- same machine \u002F emulator \u002F USB tunnel\n- same LAN \u002F local Wi-Fi\n- same Tailscale tailnet\n- public URL \u002F reverse proxy\n\nDo not mix them.\n\n- Local Wi-Fi problem: do not switch to Tailscale unless remote access is actually needed.\n- VPS \u002F remote gateway problem: do not keep debugging `localhost` or LAN IPs.\n\n## If ambiguous, ask first\n\nIf the setup is unclear or the failure report is vague, ask short clarifying questions before diagnosing.\n\nAsk for:\n\n- which route they intend: same machine, same LAN, Tailscale tailnet, or public URL\n- whether they used QR\u002Fsetup code or manual host\u002Fport\n- the exact app text\u002Fstatus\u002Ferror, quoted exactly if possible\n- whether `openclaw devices list` shows a pending pairing request\n\nDo not guess from `can't connect`.\n\n## Canonical checks\n\nPrefer `openclaw qr --json`. It uses the same setup-code payload Android scans.\n\n```bash\nopenclaw config get gateway.mode\nopenclaw config get gateway.bind\nopenclaw config get gateway.tailscale.mode\nopenclaw config get gateway.remote.url\nopenclaw config get gateway.auth.mode\nopenclaw config get gateway.auth.allowTailscale\nopenclaw config get plugins.entries.device-pair.config.publicUrl\nopenclaw qr --json\nopenclaw devices list\nopenclaw nodes status\n```\n\nIf this OpenClaw instance is pointed at a remote gateway, also run:\n\n```bash\nopenclaw qr --remote --json\n```\n\nIf Tailscale is part of the story:\n\n```bash\ntailscale status --json\n```\n\n## Read the result, not guesses\n\n`openclaw qr --json` success means:\n\n- `gatewayUrl`: this is the actual endpoint the app should use.\n- `urlSource`: this tells you which config path won.\n\nCommon good sources:\n\n- `gateway.bind=lan`: same Wi-Fi \u002F LAN only\n- `gateway.bind=tailnet`: direct tailnet access\n- `gateway.tailscale.mode=serve` or `gateway.tailscale.mode=funnel`: Tailscale route\n- `plugins.entries.device-pair.config.publicUrl`: explicit public\u002Freverse-proxy route\n- `gateway.remote.url`: remote gateway route\n\n## Root-cause map\n\nIf `openclaw qr --json` says `Gateway is only bound to loopback`:\n\n- remote node cannot connect yet\n- fix the route, then generate a fresh setup code\n- `gateway.bind=auto` is not enough if the effective QR route is still loopback\n- same LAN: use `gateway.bind=lan`\n- same tailnet: prefer `gateway.tailscale.mode=serve` or use `gateway.bind=tailnet`\n- public internet: set a real `plugins.entries.device-pair.config.publicUrl` or `gateway.remote.url`\n\nIf `gateway.bind=tailnet set, but no tailnet IP was found`:\n\n- gateway host is not actually on Tailscale\n\nIf `qr --remote requires gateway.remote.url`:\n\n- remote-mode config is incomplete\n\nIf the app says `pairing required`:\n\n- network route and auth worked\n- approve the pending device\n\n```bash\nopenclaw devices list\nopenclaw devices approve --latest\n```\n\nIf the app says `bootstrap token invalid or expired`:\n\n- old setup code\n- generate a fresh one and rescan\n- do this after any URL\u002Fauth fix too\n\nIf the app says `unauthorized`:\n\n- wrong token\u002Fpassword, or wrong Tailscale expectation\n- for Tailscale Serve, `gateway.auth.allowTailscale` must match the intended flow\n- otherwise use explicit token\u002Fpassword\n\n## Fast heuristics\n\n- Same Wi-Fi setup + gateway advertises `127.0.0.1`, `localhost`, or loopback-only config: wrong.\n- Remote setup + setup\u002Fmanual uses private LAN IP: wrong.\n- Tailnet setup + gateway advertises LAN IP instead of MagicDNS \u002F tailnet route: wrong.\n- Public URL set but QR still advertises something else: inspect `urlSource`; config is not what you think.\n- `openclaw devices list` shows pending requests: stop changing network config and approve first.\n\n## Fix style\n\nReply with one concrete diagnosis and one route.\n\nIf there is not enough signal yet, ask for setup + exact app text instead of guessing.\n\nGood:\n\n- `The gateway is still loopback-only, so a node on another network can never reach it. Enable Tailscale Serve, restart the gateway, run openclaw qr again, rescan, then approve the pending device pairing.`\n\nBad:\n\n- `Maybe LAN, maybe Tailscale, maybe port forwarding, maybe public URL.`\n","# Node Connect\n\nGoal: find the one real route from node -> gateway, verify OpenClaw is advertising that route, then fix pairing\u002Fauth.\n\n## Topology first\n\nDecide which case you are in before proposing fixes:\n\n- same machine \u002F emulator \u002F USB tunnel\n- same LAN \u002F local Wi-Fi\n- same Tailscale tailnet\n- public URL \u002F reverse proxy\n\nDo not mix them.\n\n- Local Wi-Fi problem: do not switch to Tailscale unless remote access is actually needed.\n- VPS \u002F remote gateway problem: do not keep debugging `localhost` or LAN IPs.\n\n## If ambiguous, ask first\n\nIf the setup is unclear or the failure report is vague, ask short clarifying questions before diagnosing.\n\nAsk for:\n\n- which route they intend: same machine, same LAN, Tailscale tailnet, or public URL\n- whether they used QR\u002Fsetup code or manual host\u002Fport\n- the exact app text\u002Fstatus\u002Ferror, quoted exactly if possible\n- whether `openclaw devices list` shows a pending pairing request\n\nDo not guess from `can't connect`.\n\n## Canonical checks\n\nPrefer `openclaw qr --json`. It uses the same setup-code payload Android scans.\n\n```bash\nopenclaw config get gateway.mode\nopenclaw config get gateway.bind\nopenclaw config get gateway.tailscale.mode\nopenclaw config get gateway.remote.url\nopenclaw config get gateway.auth.mode\nopenclaw config get gateway.auth.allowTailscale\nopenclaw config get plugins.entries.device-pair.config.publicUrl\nopenclaw qr --json\nopenclaw devices list\nopenclaw nodes status\n```\n\nIf this OpenClaw instance is pointed at a remote gateway, also run:\n\n```bash\nopenclaw qr --remote --json\n```\n\nIf Tailscale is part of the story:\n\n```bash\ntailscale status --json\n```\n\n## Read the result, not guesses\n\n`openclaw qr --json` success means:\n\n- `gatewayUrl`: this is the actual endpoint the app should use.\n- `urlSource`: this tells you which config path won.\n\nCommon good sources:\n\n- `gateway.bind=lan`: same Wi-Fi \u002F LAN only\n- `gateway.bind=tailnet`: direct tailnet access\n- `gateway.tailscale.mode=serve` or `gateway.tailscale.mode=funnel`: Tailscale route\n- `plugins.entries.device-pair.config.publicUrl`: explicit public\u002Freverse-proxy route\n- `gateway.remote.url`: remote gateway route\n\n## Root-cause map\n\nIf `openclaw qr --json` says `Gateway is only bound to loopback`:\n\n- remote node cannot connect yet\n- fix the route, then generate a fresh setup code\n- `gateway.bind=auto` is not enough if the effective QR route is still loopback\n- same LAN: use `gateway.bind=lan`\n- same tailnet: prefer `gateway.tailscale.mode=serve` or use `gateway.bind=tailnet`\n- public internet: set a real `plugins.entries.device-pair.config.publicUrl` or `gateway.remote.url`\n\nIf `gateway.bind=tailnet set, but no tailnet IP was found`:\n\n- gateway host is not actually on Tailscale\n\nIf `qr --remote requires gateway.remote.url`:\n\n- remote-mode config is incomplete\n\nIf the app says `pairing required`:\n\n- network route and auth worked\n- approve the pending device\n\n```bash\nopenclaw devices list\nopenclaw devices approve --latest\n```\n\nIf the app says `bootstrap token invalid or expired`:\n\n- old setup code\n- generate a fresh one and rescan\n- do this after any URL\u002Fauth fix too\n\nIf the app says `unauthorized`:\n\n- wrong token\u002Fpassword, or wrong Tailscale expectation\n- for Tailscale Serve, `gateway.auth.allowTailscale` must match the intended flow\n- otherwise use explicit token\u002Fpassword\n\n## Fast heuristics\n\n- Same Wi-Fi setup + gateway advertises `127.0.0.1`, `localhost`, or loopback-only config: wrong.\n- Remote setup + setup\u002Fmanual uses private LAN IP: wrong.\n- Tailnet setup + gateway advertises LAN IP instead of MagicDNS \u002F tailnet route: wrong.\n- Public URL set but QR still advertises something else: inspect `urlSource`; config is not what you think.\n- `openclaw devices list` shows pending requests: stop changing network config and approve first.\n\n## Fix style\n\nReply with one concrete diagnosis and one route.\n\nIf there is not enough signal yet, ask for setup + exact app text instead of guessing.\n\nGood:\n\n- `The gateway is still loopback-only, so a node on another network can never reach it. Enable Tailscale Serve, restart the gateway, run openclaw qr again, rescan, then approve the pending device pairing.`\n\nBad:\n\n- `Maybe LAN, maybe Tailscale, maybe port forwarding, maybe public URL.`\n",{"name":5,"description":7},"main","a2e3284ed4488780397ee2f78217366e11470dfb","skills\u002Fnode-connect","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright","https:\u002F\u002Fplaywright.dev","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack","2026-04-25 06:04:45",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill node-connect",{"tool":53,"command":54},"bunx","bunx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill node-connect",{"tool":56,"command":57},"pnpm","pnpm dlx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill node-connect","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fnode-connect\u002FSKILL.md",true,[61],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},".skillfish.json","REFERENCE","参考文档",217,"https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fnode-connect\u002F.skillfish.json",[68,98,108,118,133,148],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":86,"publishedAt":35},"01M6E3XK4PRPMQHM7Y98FQPTY1","zyte-api-automation","Automate Zyte API tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzyte-api-automation\u002FSKILL.md",[74,75,78,81],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":76,"categoryName":77,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[87,88,89,90,91,92,93,94,95,96,97],"zyte api automation","api","automation","MCP","tasks","search","Tools","first","automate","composio","via",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":106,"publishedAt":35},"01M6E3XFX6QSTR1QR59NFXJTMA","zylvie-automation","Automate Zylvie tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzylvie-automation\u002FSKILL.md",[104,105],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},[107,89,95,90,91,92,93,94,96,97],"zylvie automation",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":116,"publishedAt":35},"01M6E3XCX2GDYYCHN58ZJHT37M","zoominfo-automation","Automate Zoominfo tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoominfo-automation\u002FSKILL.md",[114,115],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},[117,89,92,93,94,95,96,97,91,90],"zoominfo automation",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":126,"publishedAt":35},"01M6E3X9WJ2T73216WQHHTB9BD","zoho_mail-automation","Automate Zoho Mail tasks via Rube MCP (Composio): email sending, folders, labels, and mailbox management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_mail-automation\u002FSKILL.md",[124,125],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},[127,128,129,89,90,91,92,130,93,94,95,131,96,132,97],"mail","zoho mail automation","zoho","email","management","mailbox",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":144,"publishedAt":35},"01M6E3X719W648XZBW1EC6JQ64","zoho_invoice-automation","Automate Zoho Invoice tasks via Rube MCP (Composio): invoices, estimates, expenses, clients, and payment tracking. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_invoice-automation\u002FSKILL.md",[139,140,141],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":142,"categoryName":143,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000040","财务",[145,129,89,91,92,93,94,95,146,147,96,97,90],"zoho invoice automation","tracking","payment",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":156,"publishedAt":35},"01M6E3X28JYTC3QTK32AQF7BYB","zoho_inventory-automation","Automate Zoho Inventory tasks via Rube MCP (Composio): items, orders, warehouses, shipments, and stock management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_inventory-automation\u002FSKILL.md",[154,155],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},[89,157,129,158,94,95,93,92,91,90,96,97,159,160,131],"inventory","zoho inventory automation","stock","orders"]