[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698XN0ZFZGA4W5167331E8J":3,"skill-same:01M698XN0ZFZGA4W5167331E8J":63},{"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":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":45,"ownerHtmlUrl":46,"ownerBlogUrl":45,"ownerDescription":47,"updatedAt":48,"install":49,"resources":62},"01M698XN0ZFZGA4W5167331E8J","node-inspect-debugger",null,"Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394352,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fnode-inspect-debugger\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29],"node inspect debugger","debugger","node","inspect","debug","js","cdp","CPU","with","profiles","heap","breakpoints","2026-11-10 10:12:30",false,"---\nname: node-inspect-debugger\ndescription: Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.\nmetadata: { \"openclaw\": { \"emoji\": \"?\", \"requires\": { \"bins\": [\"node\"] } } }\n---\n\n# Node Inspect Debugger\n\nUse for Node.js debugging that needs inspector access: hidden locals, async hangs, flaky tests, child processes, startup races, memory growth, or CPU hot paths.\n\nDefault to `node inspect` first. Use Chrome DevTools Protocol only when you need scripted breakpoints, automated state capture, heap snapshots, or CPU profiles.\n\nQuick start\n\n- Pause on entry: `node inspect path\u002Fto\u002Fscript.js`\n- TypeScript: `node --inspect-brk --import tsx path\u002Fto\u002Fscript.ts`\n- Existing PID: `kill -SIGUSR1 \u003Cpid>` then `node inspect -p \u003Cpid>`\n- Inspect target list: `curl -s http:\u002F\u002F127.0.0.1:9229\u002Fjson\u002Flist | jq`\n- OpenClaw CLI path: `node --inspect-brk openclaw.mjs ...`\n- OpenClaw test path: `OPENCLAW_VITEST_MAX_WORKERS=1 node --inspect-brk scripts\u002Frun-vitest.mjs \u003Cfile>`\n\nDebugger REPL\n\n- Continue\u002Fstep: `cont`, `next`, `step`, `out`, `pause`\n- Breakpoints: `sb('file.js', 42)`, `sb(42)`, `sb('functionName')`, `breakpoints`, `cb('file.js', 42)`\n- Inspect: `bt`, `list(8)`, `watch('expr')`, `exec expr`\n- Current scope: `repl`, then evaluate locals directly; `Ctrl+C` exits repl mode.\n- Exit safely: `cont` before quitting if the process should continue; otherwise `kill`.\n\nOpenClaw tips\n\n- Prefer `127.0.0.1` inspector binds. Do not expose `--inspect=0.0.0.0` unless the network is isolated.\n- For Vitest, debug one file with one worker. Avoid worker pools while stepping.\n- For TS source breakpoints, use `--enable-source-maps` when useful; `node inspect` can still show emitted paths.\n- For child processes, `NODE_OPTIONS=--inspect-brk` can propagate the inspector, but each child needs its own port.\n- For long-lived gateway or dev processes, attach by PID after confirming the target with `\u002Fjson\u002Flist`.\n\nProgrammatic CDP\n\nInstall tooling outside the repo unless the project already depends on it:\n\n```bash\nmkdir -p \u002Ftmp\u002Fcdp-tools\nnpm --prefix \u002Ftmp\u002Fcdp-tools i chrome-remote-interface\nNODE_PATH=\u002Ftmp\u002Fcdp-tools\u002Fnode_modules node \u002Ftmp\u002Fcdp-debug.cjs\n```\n\nMinimal driver:\n\n```js\nconst CDP = require(\"chrome-remote-interface\");\n\n(async () => {\n  const client = await CDP({ port: 9229 });\n  const { Debugger, Runtime } = client;\n\n  Debugger.paused(async ({ callFrames, reason }) => {\n    const top = callFrames[0];\n    console.log(\"paused\", reason, top.url, top.location.lineNumber + 1);\n    const { result } = await Debugger.evaluateOnCallFrame({\n      callFrameId: top.callFrameId,\n      expression: \"JSON.stringify({ pid: process.pid })\",\n    });\n    console.log(result.value ?? result.description);\n    await Debugger.resume();\n  });\n\n  await Runtime.enable();\n  await Debugger.enable();\n  await Debugger.setBreakpointByUrl({ urlRegex: \".*target\\\\.js$\", lineNumber: 41 });\n  await Runtime.runIfWaitingForDebugger();\n})();\n```\n\nProfiles\n\n- CPU: enable `Profiler`, `start`, wait, `stop`, write `\u002Ftmp\u002Fprofile.cpuprofile`, open in Chrome DevTools.\n- Heap: enable `HeapProfiler`, collect `addHeapSnapshotChunk`, call `takeHeapSnapshot`, write `\u002Ftmp\u002Fheap.heapsnapshot`.\n\nPitfalls\n\n- `--inspect` does not pause; use `--inspect-brk` when setup must happen before code runs.\n- Default port is `9229`; use `--inspect=0` or a unique port for parallel targets.\n- If a breakpoint misses, confirm file path, source map behavior, and whether execution already passed the line.\n- If the process appears frozen after detaching, it may still be paused in the debugger.\n","# Node Inspect Debugger\n\nUse for Node.js debugging that needs inspector access: hidden locals, async hangs, flaky tests, child processes, startup races, memory growth, or CPU hot paths.\n\nDefault to `node inspect` first. Use Chrome DevTools Protocol only when you need scripted breakpoints, automated state capture, heap snapshots, or CPU profiles.\n\nQuick start\n\n- Pause on entry: `node inspect path\u002Fto\u002Fscript.js`\n- TypeScript: `node --inspect-brk --import tsx path\u002Fto\u002Fscript.ts`\n- Existing PID: `kill -SIGUSR1 \u003Cpid>` then `node inspect -p \u003Cpid>`\n- Inspect target list: `curl -s http:\u002F\u002F127.0.0.1:9229\u002Fjson\u002Flist | jq`\n- OpenClaw CLI path: `node --inspect-brk openclaw.mjs ...`\n- OpenClaw test path: `OPENCLAW_VITEST_MAX_WORKERS=1 node --inspect-brk scripts\u002Frun-vitest.mjs \u003Cfile>`\n\nDebugger REPL\n\n- Continue\u002Fstep: `cont`, `next`, `step`, `out`, `pause`\n- Breakpoints: `sb('file.js', 42)`, `sb(42)`, `sb('functionName')`, `breakpoints`, `cb('file.js', 42)`\n- Inspect: `bt`, `list(8)`, `watch('expr')`, `exec expr`\n- Current scope: `repl`, then evaluate locals directly; `Ctrl+C` exits repl mode.\n- Exit safely: `cont` before quitting if the process should continue; otherwise `kill`.\n\nOpenClaw tips\n\n- Prefer `127.0.0.1` inspector binds. Do not expose `--inspect=0.0.0.0` unless the network is isolated.\n- For Vitest, debug one file with one worker. Avoid worker pools while stepping.\n- For TS source breakpoints, use `--enable-source-maps` when useful; `node inspect` can still show emitted paths.\n- For child processes, `NODE_OPTIONS=--inspect-brk` can propagate the inspector, but each child needs its own port.\n- For long-lived gateway or dev processes, attach by PID after confirming the target with `\u002Fjson\u002Flist`.\n\nProgrammatic CDP\n\nInstall tooling outside the repo unless the project already depends on it:\n\n```bash\nmkdir -p \u002Ftmp\u002Fcdp-tools\nnpm --prefix \u002Ftmp\u002Fcdp-tools i chrome-remote-interface\nNODE_PATH=\u002Ftmp\u002Fcdp-tools\u002Fnode_modules node \u002Ftmp\u002Fcdp-debug.cjs\n```\n\nMinimal driver:\n\n```js\nconst CDP = require(\"chrome-remote-interface\");\n\n(async () => {\n  const client = await CDP({ port: 9229 });\n  const { Debugger, Runtime } = client;\n\n  Debugger.paused(async ({ callFrames, reason }) => {\n    const top = callFrames[0];\n    console.log(\"paused\", reason, top.url, top.location.lineNumber + 1);\n    const { result } = await Debugger.evaluateOnCallFrame({\n      callFrameId: top.callFrameId,\n      expression: \"JSON.stringify({ pid: process.pid })\",\n    });\n    console.log(result.value ?? result.description);\n    await Debugger.resume();\n  });\n\n  await Runtime.enable();\n  await Debugger.enable();\n  await Debugger.setBreakpointByUrl({ urlRegex: \".*target\\\\.js$\", lineNumber: 41 });\n  await Runtime.runIfWaitingForDebugger();\n})();\n```\n\nProfiles\n\n- CPU: enable `Profiler`, `start`, wait, `stop`, write `\u002Ftmp\u002Fprofile.cpuprofile`, open in Chrome DevTools.\n- Heap: enable `HeapProfiler`, collect `addHeapSnapshotChunk`, call `takeHeapSnapshot`, write `\u002Ftmp\u002Fheap.heapsnapshot`.\n\nPitfalls\n\n- `--inspect` does not pause; use `--inspect-brk` when setup must happen before code runs.\n- Default port is `9229`; use `--inspect=0` or a unique port for parallel targets.\n- If a breakpoint misses, confirm file path, source map behavior, and whether execution already passed the line.\n- If the process appears frozen after detaching, it may still be paused in the debugger.\n",{"name":5,"metadata":35,"description":7},{"openclaw":36},{"emoji":37,"requires":38},"?",{"bins":39},[20],"main","f1c93577085244aa96aa87b53a2df9b59d293bd7","skills\u002Fnode-inspect-debugger",82861,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-12 03:01:25",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add openclaw\u002Fopenclaw --skill node-inspect-debugger",{"tool":55,"command":56},"bunx","bunx skills add openclaw\u002Fopenclaw --skill node-inspect-debugger",{"tool":58,"command":59},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill node-inspect-debugger","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fnode-inspect-debugger\u002FSKILL.md",true,[],[64,70,92,109,131,155],{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":30},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[66],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":30},"01M698YY8QGQ7S8TJNKJG6VTPH","xurl","xurl CLI for authenticated X posts, replies, reads\u002Fsearch, DMs, media upload, followers, auth status, or raw v2 API calls.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[],[72,77,78,79,80,81,82,83,84,85,20,86,87,88,89,90,91],"for","api","calls","replies","posts","upload","tap","install","brew","Media","search","npm","status","auth","cli",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":30},"01M698YWT1CJ0WK88WB909R9RT","weather","Current weather and forecasts with web_fetch, falling back to wttr.in curl for locations, rain, temperature, travel planning.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[94,99,100,84,101,85,102,103,104,105,106,107,77,108,26],"travel planning","travel","fetch","curl","https","help","planning","web","back","temperature",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":120,"publishedAt":30},"01M698YV2Q0R0JJKAWGFS21K0N","visualize","Create inline visuals for code and explanations, or author persistent OpenClaw dashboard widgets with show_widget.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fvisualize\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[111,121,122,123,124,77,26,125,126,127,128,129,9,130],"widgets","openclaw dashboard","author","inline","show","code","create","visuals","dashboard","widget",{"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":145,"publishedAt":30},"01M698YS2TRJH9ENG28HD9CD87","trello","Manage Trello boards, lists, and cards via the Trello REST API.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftrello\u002FSKILL.md",[137,142],{"categoryNo":138,"categoryName":139,"taxonomyType":140,"taxonomyTypeDesc":141},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":143,"categoryName":144,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000030","开发工程师",[133,103,146,147,148,149,150,151,84,85,152,102,78,153,154],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":30},"01M698YQ9Q3M4W78EWV2KSCSVW","tmux","Control tmux sessions\u002Fpanes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftmux\u002FSKILL.md",[],[157,84,162,163,77,164,165,166,167,168,169,170,85,171,172,173,174,175,176],"send","darwin","keys","paste","output","control","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]