К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

node-inspect-debugger — скилл для Claude Code: отладка Node.js

Скилл запускает отладчик Node.js с реальными брейкпоинтами, шагованием и доступом к переменным вместо console.log. Работает с любым Node-процессом: тесты, dev-сервер, Ink-компоненты.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add NousResearch/hermes-agent --skill node-inspect-debugger -a claude-code
Открыть на GitHub

Что делает node-inspect-debugger

node-inspect-debugger оборачивает встроенный V8 инспектор Node.js и Chrome DevTools Protocol. Можно выбрать две стратегии: быстрый node inspect с REPL для живого пробивания (брейкпоинты, шаг, стек вызовов, вычисление выражений в текущем scope), или chrome-remote-interface для автоматизации — скрипты, которые ловят паузы, собирают значения переменных и ходят по фреймам без интерактивного ввода.

Внутри две главные команды: запуск paused на первой строке (node --inspect-brk script.js) и присоединение к уже работающему процессу (отправить SIGUSR1, затем node inspect -p <pid>). Для TypeScript через tsx: node --inspect-brk --import tsx script.ts. Если нужна автоматизация — chrome-remote-interface не входит в зависимости проекта; устанавливают отдельно или в throwaway папку через NODE_PATH.

В Hermes ui-tui (Ink + tsx) скилл ловит компоненты, состояние, обработчики ввода. Для Python-процессов вроде _SlashWorker этот скилл не подходит.

Какие задачи решает

  • найти значение переменной в замыкании, которое console.log не видит
  • отследить ошибку теста пошагово вместо угадывания по логам
  • собрать снимок стека вызовов и local-scope при краше React-компонента
  • автоматизировать брейкпоинты и проверку состояния через CDP-скрипт
  • подключиться к работающему dev-серверу и паузить его по запросу

Примеры запросов агенту

  • Отладь компонент: `node inspect app.js`, затем `sb('app.js', 220)`, `cont`, `repl`, посмотри props
  • Захвати стек: запусти `node --inspect-brk script.ts`, присоедини `node inspect -p <pid>`, остановись на ошибке
  • Собери снимок scope: скрипт с `chrome-remote-interface` ловит `Debugger.paused`, итерирует `callFrames`, вычисляет выражение в фрейме

Как установить node-inspect-debugger

1Через Skills CLI (Vercel)

npx skills add NousResearch/hermes-agent --skill node-inspect-debugger -a claude-code

2Вручную: положить файлы

~/.claude/skills/node-inspect-debugger/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/node-inspect-debugger/

Из того же набора42

Весь набор →
dogfood Teknium (teknium1), Hermes Agent Скилл проводит разведочное тестирование веб-приложения через браузер: обходит страницы, ловит ошибки в консоли, копит скриншоты и отдаёт отчёт с багами. Claude Code CX Codex Cursor +1 6 400установок humanizer Siqi Chen (@blader, https://github.com/blader/humanizer), ported by Hermes Agent Скилл убирает характерные AI-обороты и переписывает текст живее. Пригодится для постов, документации, писем и других черновиков. Claude Code CX Codex Cursor +1 1 300установок popular-web-designs Hermes Agent + Teknium (design systems sourced from VoltAgent/awesome-design-md) 54 готовых дизайн-систем реальных сайтов (Stripe, Linear, Vercel, Claude) с CSS-токенами, типографикой и компонентами для быстрой вёрстки в стиле известных брендов. Claude Code CX Codex Cursor +1 914установок powerpoint Nous Research Создаёт, читает и редактирует презентации .pptx через python-pptx. Пригодится для сборки слайдов, разбора чужих deck-файлов и правок шаблонов. Claude Code CX Codex Cursor +1 751установок claude-design BadTechBandit Скилл для сборки HTML-артефактов — лендингов, прототипов, деков — в Claude Code, Codex и Cursor. Читает контекст проекта и собирает самодостаточный файл с вёрсткой и стилями. Claude Code CX Codex Cursor +1 645установок llm-wiki Hermes Agent Скилл для построения персональной базы знаний из interlinked markdown-файлов. Агент суммирует источники, перекрёстно ссылается и поддерживает консистентность, а вы курируете и направляете анализ. Claude Code CX Codex Cursor +1 603установок yuanbao Teknium (teknium1), Hermes Agent Скилл для взаимодействия с группами в Yuanbao: ищет участников, отправляет упоминания через @nickname и доставляет личные сообщения с файлами. Claude Code CX Codex Cursor +1 564установок songwriting-and-ai-music Teknium (teknium1), Hermes Agent Скилл помогает писать тексты песен, подбирать рифмы и составлять промпты для генератора Suno AI без упоминания имён защищённых артистов. Claude Code CX Codex Cursor +1 563установок

Похожие

nestjs-expert https://github.com/Jeffallan Скилл помогает проектировать и писать NestJS бэкенд-приложения на TypeScript: модули, сервисы, контроллеры, валидацию, аутентификацию и тесты. Нужен, если строишь REST API или GraphQL с enterprise-паттернами. Claude Code CX Codex Cursor +1 5 900установок java-architect https://github.com/Jeffallan Скилл помогает проектировать Java-приложения на Spring Boot, писать реактивные API, разбирать запросы JPA и настраивать безопасность через OAuth2 и JWT. Claude Code CX Codex Cursor +1 5 900установок debug-issue tirth8205 Скилл ведёт поиск причины ошибки через граф кода, а затем проверяет цепочку вызовов и последствия правки. Пригодится, когда нужно сузить область отладки до чтения исходников. Claude Code CX Codex Cursor +1 1 000установок qa-only garrytan Находит и фиксирует баги в браузерных сценариях, API, CLI и воркерах без изменения кода. Пригодится для чистого тестирования перед релизом. Claude Code CX Codex Cursor +1 395установок ab-test-analysis phuryn Оценивает результаты сплит-тестов, проверяет статистическую значимость и даёт рекомендацию по раскатке варианта. Claude Code CX Codex Cursor +1 2 900установок unit-test-vue-pinia официальный github Помогает писать и проверять юнит-тесты для Vue 3, TypeScript, Vitest и Pinia. Пригодится, когда тесты уже есть, но лезут во внутренности компонентов. GitHub Copilot 1 800установок improve-codebase-architecture Matt Pocock Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. Claude Code 1 163 035установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. Claude Code CX Codex Cursor +1 673 100установок

Вопросы о node-inspect-debugger

Как установить node-inspect-debugger в Claude Code?

Выполни npx skills add NousResearch/hermes-agent --skill node-inspect-debugger -a claude-code. После установки скилл будет в ~/.claude/skills/node-inspect-debugger/SKILL.md.

Что делает node-inspect-debugger?

Даёт доступ к отладчику Node.js через V8 inspector: брейкпоинты, пошаговое выполнение, просмотр переменных в scope, вычисление выражений без перезапуска. Может работать интерактивно или через автоматизированные скрипты.

Нужно ли устанавливать зависимости?

Для node inspect — нет, это встроено. Для chrome-remote-interface (автоматизация) — устанавливают отдельно: npm i -g chrome-remote-interface или в проект.

Исходный текст

SKILL.md · MIT
---
name: node-inspect-debugger
description: "Debug Node.js via --inspect + Chrome DevTools Protocol CLI."
version: 1.0.0
author: Hermes Agent
license: MIT
platforms: [linux, macos, windows]
metadata:
  hermes:
    tags: [debugging, nodejs, node-inspect, cdp, breakpoints, ui-tui]
    related_skills: [systematic-debugging, python-debugpy]
---

# Node.js Inspect Debugger

## Overview

When `console.log` isn't enough, drive Node's built-in V8 inspector programmatically from the terminal. You get real breakpoints, step in/over/out, call-stack walking, local/closure scope dumps, and arbitrary expression evaluation in the paused frame.

Two tools, pick one:

- **`node inspect`** — built-in, zero install, CLI REPL. Best for quick poking.
- **`ndb` / CDP via `chrome-remote-interface`** — scriptable from Node/Python; best when you want to automate many breakpoints, collect state across runs, or debug non-interactively from an agent loop.

**Prefer `node inspect` first.** It's always available and the REPL is fast.

## When to Use

- A Node test fails and you need to see intermediate state
- ui-tui crashes or behaves wrong and you want to inspect React/Ink state pre-render
- tui_gateway child processes (`_SlashWorker`, PTY bridge workers) misbehave
- You need to inspect a value in a closure that `console.log` can't reach without patching
- Perf: attach to a running process to capture a CPU profile or heap snapshot

**Don't use for:** things `console.log` solves in under a minute. Breakpoint-driven debugging is heavier; use it when the payoff is real.

## Quick Reference: `node inspect` REPL

Launch paused on first line:

```bash
node inspect path/to/script.js
# or with tsx
node --inspect-brk $(which tsx) path/to/script.ts
```

The `debug>` prompt accepts:

| Command | Action |
|---|---|
| `c` or `cont` | continue |
| `n` or `next` | step over |
| `s` or `step` | step into |
| `o` or `out` | step out |
| `pause` | pause running code |
| `sb('file.js', 42)` | set breakpoint at file.js line 42 |
| `sb(42)` | set breakpoint at line 42 of current file |
| `sb('functionName')` | break when function is called |
| `cb('file.js', 42)` | clear breakpoint |
| `breakpoints` | list all breakpoints |
| `bt` | backtrace (call stack) |
| `list(5)` | show 5 lines of source around current position |
| `watch('expr')` | evaluate expr on every pause |
| `watchers` | show watched expressions |
| `repl` | drop into REPL in current scope (Ctrl+C to exit REPL) |
| `exec expr` | evaluate expression once |
| `restart` | restart script |
| `kill` | kill the script |
| `.exit` | quit debugger |

**In the `repl` sub-mode:** type any JS expression, including access to locals/closure variables. `Ctrl+C` exits back to `debug>`.

## Attaching to a Running Process

When the process is already running (e.g. a long-lived dev server or the TUI gateway):

```bash
# 1. Send SIGUSR1 to enable the inspector on an existing process
kill -SIGUSR1 <pid>
# Node prints: Debugger listening on ws://127.0.0.1:9229/<uuid>

# 2. Attach the debugger CLI
node inspect -p <pid>
# or by URL
node inspect ws://127.0.0.1:9229/<uuid>
```

To start a process with the inspector from the beginning:

```bash
node --inspect script.js           # listen on 127.0.0.1:9229, keep running
node --inspect-brk script.js       # listen AND pause on first line
node --inspect=0.0.0.0:9230 script.js   # custom host:port
```

For TypeScript via tsx:

```bash
node --inspect-brk --import tsx script.ts
# or older tsx
node --inspect-brk -r tsx/cjs script.ts
```

## Programmatic CDP (scripting from terminal)

When you want to automate — set many breakpoints, capture scope state, script a repro — use `chrome-remote-interface`:

```bash
npm i -g chrome-remote-interface        # or project-local
# Start your target:
node --inspect-brk=9229 target.js &
```

Driver script (save as `~/.hermes/cache/scratch/cdp-debug.js`):

```javascript
const CDP = require('chrome-remote-interface');

(async () => {
  const client = await CDP({ port: 9229 });
  const { Debugger, Runtime } = client;

  Debugger.paused(async ({ callFrames, reason }) => {
    const top = callFrames[0];
    console.log(`PAUSED: ${reason} @ ${top.url}:${top.location.lineNumber + 1}`);

    // Walk scopes for locals
    for (const scope of top.scopeChain) {
      if (scope.type === 'local' || scope.type === 'closure') {
        const { result } = await Runtime.getProperties({
          objectId: scope.object.objectId,
          ownProperties: true,
        });
        for (const p of result) {
          console.log(`  ${scope.type}.${p.name} =`, p.value?.value ?? p.value?.description);
        }
      }
    }

    // Evaluate an expression in the paused frame
    const { result } = await Debugger.evaluateOnCallFrame({
      callFrameId: top.callFrameId,
      expression: 'typeof state !== "undefined" ? JSON.stringify(state) : "n/a"',
    });
    console.log('state =', result.value ?? result.description);

    await Debugger.resume();
  });

  await Runtime.enable();
  await Debugger.enable();

  // Set a breakpoint by URL regex + line
  await Debugger.setBreakpointByUrl({
    urlRegex: '.*app\\.tsx$',
    lineNumber: 119,       // 0-indexed
    columnNumber: 0,
  });

  await Runtime.runIfWaitingForDebugger();
})();
```

Run it:

```bash
node ~/.hermes/cache/scratch/cdp-debug.js
```

Hermes-specific note: `chrome-remote-interface` is NOT in `ui-tui/package.json`. Install it to a throwaway location if you don't want to dirty the project:

```bash
mkdir -p ~/.hermes/cache/scratch/cdp-tools && cd ~/.hermes/cache/scratch/cdp-tools && npm i chrome-remote-interface
NODE_PATH=~/.hermes/cache/scratch/cdp-tools/node_modules node ~/.hermes/cache/scratch/cdp-debug.js
```

## Debugging Hermes ui-tui

The TUI is built Ink + tsx. Two common scenarios:

### Debugging a single Ink component under dev

`ui-tui/package.json` has `npm run dev` (tsx --watch). Add `--inspect-brk` by running tsx directly:

```bash
cd <hermes-agent-repo>/ui-tui
npm run build    # produce dist/ once so transpile isn't needed on first load
node --inspect-brk dist/entry.js
# In another terminal:
node inspect -p <node pid>
```

Then inside `debug>`:

```
sb('dist/app.js', 220)     # or wherever the suspect render is
cont
```

When it pauses, `repl` → inspect `props`, state refs, `useInput` handler values, etc.

### Debugging a running `hermes --tui`

The TUI spawns Node from the Python CLI. Easiest path:

```bash
# 1. Launch TUI
hermes --tui &
TUI_PID=$(pgrep -f 'ui-tui/dist/entry' | head -1)

# 2. Enable inspector on that Node PID
kill -SIGUSR1 "$TUI_PID"

# 3. Find the WS URL
curl -s http://127.0.0.1:9229/json/list | jq -r '.[0].webSocketDebuggerUrl'

# 4. Attach
node inspect ws://127.0.0.1:9229/<uuid>
```

Interacting with the TUI (typing in its window) continues to advance execution; your debugger can pause it on a breakpoint at any `sb(...)`.

### Debugging `_SlashWorker` / PTY child processes

Those are Python, not Node — use the `python-debugpy` skill for them. Only Node portions (Ink UI, tui_gateway client, tsx-run tests under `ui-tui/`) use this skill.

## Running Vitest Tests Under the Debugger

```bash
cd <hermes-agent-repo>/ui-tui
# Run a single test file paused on entry
node --inspect-brk ./node_modules/vitest/vitest.mjs run --no-file-parallelism src/app/foo.test.tsx
```

In another terminal: `node inspect -p <pid>`, then `sb('src/app/foo.tsx', 42)`, `cont`.

Use `--no-file-parallelism` (vitest) or `--runInBand` (jest) so only one worker exists — debugging a pool is painful.

## Heap Snapshots & CPU Profiles (Non-interactive)

From the CDP driver above, swap Debugger for `HeapProfiler` / `Profiler`:

```javascript
// CPU profile for 5 seconds
await client.Profiler.enable();
await client.Profiler.start();
await new Promise(r => setTimeout(r, 5000));
const { profile } = await client.Profiler.stop();
require('fs').writeFileSync('~/.hermes/cache/scratch/cpu.cpuprofile', JSON.stringify(profile));
// Open ~/.hermes/cache/scratch/cpu.cpuprofile in Chrome DevTools → Performance tab
```

```javascript
// Heap snapshot
await client.HeapProfiler.enable();
const chunks = [];
client.HeapProfiler.addHeapSnapshotChunk(({ chunk }) => chunks.push(chunk));
await client.HeapProfiler.takeHeapSnapshot({ reportProgress: false });
require('fs').writeFileSync('~/.hermes/cache/scratch/heap.heapsnapshot', chunks.join(''));
```

## Common Pitfalls

1. **Wrong line numbers in TS source.** Breakpoints hit the emitted JS, not the `.ts`. Either (a) break in the built `dist/*.js`, or (b) enable sourcemaps (`node --enable-source-maps`) and use `sb('src/app.tsx', N)` — but only with CDP clients that follow sourcemaps. `node inspect` CLI does not.

2. **`--inspect` vs `--inspect-brk`.** `--inspect` starts the inspector but doesn't pause; your script races past your first breakpoint if you attach too late. Use `--inspect-brk` when you need to set breakpoints before any code runs.

3. **Port collisions.** Default is `9229`. If multiple Node processes are inspecting, pass `--inspect=0` (random port) and read the actual URL from `/json/list`:
   ```bash
   curl -s http://127.0.0.1:9229/json/list   # lists all inspectable targets on the host
   ```

4. **Child processes.** `--inspect` on a parent does NOT inspect its children. Use `NODE_OPTIONS='--inspect-brk' node parent.js` to propagate to every child; be aware they all need unique ports (Node auto-increments when `NODE_OPTIONS='--inspect'` is inherited).

5. **Background kills.** If you `Ctrl+C` out of `node inspect` while the target is paused, the target stays paused. Either `cont` first, or `kill` the target explicitly.

6. **Running `node inspect` through an agent terminal.** It's a PTY-friendly REPL. In Hermes, launch it with `terminal(pty=true)` or `background=true` + `process(action='submit', data='...')`. Non-PTY foreground mode will work for one-shot commands but not for interactive stepping.

7. **Security.** `--inspect=0.0.0.0:9229` exposes arbitrary code execution. Always bind to `127.0.0.1` (the default) unless you have an isolated network.

## Verification Checklist

After setting up a debug session, verify:

- [ ] `curl -s http://127.0.0.1:9229/json/list` returns exactly the target you expect
- [ ] First breakpoint actually hits (if it doesn't, you likely missed `--inspect-brk` or attached after execution completed)
- [ ] Source listing at pause shows the right file (mismatch = sourcemap issue, see pitfall 1)
- [ ] `exec process.pid` in `repl` returns the PID you meant to attach to

## One-Shot Recipes

**"Why is this variable undefined at line X?"**
```bash
node --inspect-brk script.js &
node inspect -p $!
# debug>
sb('script.js', X)
cont
# paused. Now:
repl
> myVariable
> Object.keys(this)
```

**"What's the call path into this function?"**
```
debug> sb('suspectFn')
debug> cont
# paused on entry
debug> bt
```

**"This async chain hangs — where?"**
```
# Start with --inspect (no -brk), let it run to the hang, then:
debug> pause
debug> bt
# Now you see the stuck frame
```

© Hermes Agent · MIT · NousResearch/hermes-agent

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой