When to use
Use this skill when you need deep Node.js internals expertise, including:
- C++ addon development
- V8 engine debugging
- libuv event loop issues
- Build system problems
- Compilation failures
- Performance optimization at the engine level
- Understanding Node.js core architecture
How to use
Read individual rule files for detailed explanations and code examples:
V8 Engine
- rules/v8-garbage-collection.md - Scavenger, Mark-Sweep, Mark-Compact, generational GC
- rules/v8-hidden-classes.md - Hidden classes, inline caching, optimization
- rules/v8-jit-compilation.md - TurboFan, optimization/deoptimization patterns
libuv
- rules/libuv-event-loop.md - Event loop phases, timers, I/O, idle, check, close
- rules/libuv-thread-pool.md - Thread pool size, blocking operations, UV_THREADPOOL_SIZE
- rules/libuv-async-io.md - Async I/O patterns, handles, requests
Native Addons
- rules/napi.md - N-API development, ABI stability, async workers
- rules/node-addon-api.md - C++ wrapper patterns, best practices
- rules/native-memory.md - Buffer handling, external memory, prevent leaks
Core Modules Internals
- rules/streams-internals.md - How Node.js streams work at C++ level
- rules/net-internals.md - TCP/UDP implementation, socket handling
- rules/fs-internals.md - libuv fs operations, sync vs async
- rules/crypto-internals.md - OpenSSL integration, performance considerations
- rules/child-process-internals.md - IPC, spawn, fork implementation
- rules/worker-threads-internals.md - SharedArrayBuffer, Atomics, MessageChannel
Build & Contributing
- rules/build-system.md - gyp, ninja, make, cross-platform compilation
- rules/contributing.md - How to contribute to Node.js core, the process
- rules/commit-messages.md - Node.js-style commit message formatting and validation
Debugging & Profiling
- rules/debugging-native.md - gdb, lldb, debugging C++ addons
- rules/profiling-v8.md - --prof, --trace-opt, --trace-deopt, flame graphs
- rules/memory-debugging.md - Heap snapshots, memory leak detection
Instructions
Apply deep knowledge of Node.js internals across these domains:
- Core architecture: Node.js core modules and their C++ implementations, V8 GC and JIT, libuv event loop mechanics, thread pool behavior, startup/module-loading lifecycle
- Native development: N-API, node-addon-api, and NAN addon development; V8 C++ API handle management; memory safety; native debugging with gdb/lldb
- Build systems: node-gyp, gyp, ninja, make; cross-platform compilation; linker errors; dependency issues; platform-specific considerations (Windows, macOS, Linux, embedded)
- Performance & debugging: Event loop profiling, memory leak detection in JS and native code, CPU flame graphs, V8 optimization/deoptimization tracing
Quick-reference debugging commands
V8 optimization tracing:
node --trace-opt --trace-deopt script.js
# Checkpoint: confirm no unexpected deoptimization warnings before proceeding to profiling
node --prof script.js && node --prof-process isolate-*.log > processed.txt
Event loop lag detection:
node --trace-event-categories v8,node,node.async_hooks script.js
Native addon debugging (gdb):
gdb --args node --napi-modules ./build/Release/addon.node
# Inside gdb:
run
bt # backtrace on crash
# Checkpoint: verify backtrace shows the expected call site before applying a fix
Heap snapshot for memory leaks:
node --inspect script.js # then open chrome://inspect, take heap snapshot
# Checkpoint: compare two consecutive heap snapshots to confirm leak growth before and after the fix; run valgrind --leak-check=full node addon_test.js to confirm no native leaks remain
Node.js-specific diagnostic decision trees
Segfault / crash in native addon:
- Is the crash reproducible with
node --napi-modules? → Run gdb, capture bt
- Does
bt point to a V8 handle scope issue? → Check HandleScope / EscapableHandleScope usage in the addon
- Does it point to a libuv callback? → Inspect async handle lifetime and
uv_close() sequencing
- No clear C++ frame? → Check for JS-side type mismatches passed into the native binding
V8 deoptimization / performance regression:
- Run
--trace-opt --trace-deopt → identify the deoptimized function and reason (e.g., "not a Smi", "wrong map")
- Checkpoint: confirm the same function deoptimizes consistently across runs
- Inspect hidden class transitions (
--trace-ic) and fix property addition order or type inconsistencies
- Re-run
--trace-opt to confirm the function is now optimized
Build failure (node-gyp / binding.gyp):
- Is it a missing header? → Verify
include_dirs in binding.gyp and Node.js header installation
- Is it a linker error? → Check
libraries and link_settings entries; confirm ABI compatibility
- Is it platform-specific? → Consult
rules/build-system.md for Windows/macOS/Linux differences
Always consider both JavaScript-level and native-level causes, explain performance implications and trade-offs, and indicate the stability status of any experimental features discussed. Code examples should demonstrate Node.js internals patterns and be production-ready, accounting for edge cases typical developers might miss.
1---2name: nodejs-core3description: Debugs native module crashes, optimizes V8 performance, configures node-gyp builds, writes N-API/node-addon-api bindings, and diagnoses libuv event loop issues in Node.js. Use when working with C++ addons, native modules, binding.gyp, node-gyp errors, segfaults, memory leaks in native code, V8 optimization/deoptimization, libuv thread pool tuning, N-API or NAN bindings, build system failures, or any Node.js internals below the JavaScript layer.4---56## When to use78Use this skill when you need deep Node.js internals expertise, including:9- C++ addon development10- V8 engine debugging11- libuv event loop issues12- Build system problems13- Compilation failures14- Performance optimization at the engine level15- Understanding Node.js core architecture1617## How to use1819Read individual rule files for detailed explanations and code examples:2021### V8 Engine2223- [rules/v8-garbage-collection.md](rules/v8-garbage-collection.md) - Scavenger, Mark-Sweep, Mark-Compact, generational GC24- [rules/v8-hidden-classes.md](rules/v8-hidden-classes.md) - Hidden classes, inline caching, optimization25- [rules/v8-jit-compilation.md](rules/v8-jit-compilation.md) - TurboFan, optimization/deoptimization patterns2627### libuv2829- [rules/libuv-event-loop.md](rules/libuv-event-loop.md) - Event loop phases, timers, I/O, idle, check, close30- [rules/libuv-thread-pool.md](rules/libuv-thread-pool.md) - Thread pool size, blocking operations, UV_THREADPOOL_SIZE31- [rules/libuv-async-io.md](rules/libuv-async-io.md) - Async I/O patterns, handles, requests3233### Native Addons3435- [rules/napi.md](rules/napi.md) - N-API development, ABI stability, async workers36- [rules/node-addon-api.md](rules/node-addon-api.md) - C++ wrapper patterns, best practices37- [rules/native-memory.md](rules/native-memory.md) - Buffer handling, external memory, prevent leaks3839### Core Modules Internals4041- [rules/streams-internals.md](rules/streams-internals.md) - How Node.js streams work at C++ level42- [rules/net-internals.md](rules/net-internals.md) - TCP/UDP implementation, socket handling43- [rules/fs-internals.md](rules/fs-internals.md) - libuv fs operations, sync vs async44- [rules/crypto-internals.md](rules/crypto-internals.md) - OpenSSL integration, performance considerations45- [rules/child-process-internals.md](rules/child-process-internals.md) - IPC, spawn, fork implementation46- [rules/worker-threads-internals.md](rules/worker-threads-internals.md) - SharedArrayBuffer, Atomics, MessageChannel4748### Build & Contributing4950- [rules/build-system.md](rules/build-system.md) - gyp, ninja, make, cross-platform compilation51- [rules/contributing.md](rules/contributing.md) - How to contribute to Node.js core, the process52- [rules/commit-messages.md](rules/commit-messages.md) - Node.js-style commit message formatting and validation5354### Debugging & Profiling5556- [rules/debugging-native.md](rules/debugging-native.md) - gdb, lldb, debugging C++ addons57- [rules/profiling-v8.md](rules/profiling-v8.md) - --prof, --trace-opt, --trace-deopt, flame graphs58- [rules/memory-debugging.md](rules/memory-debugging.md) - Heap snapshots, memory leak detection5960## Instructions6162Apply deep knowledge of Node.js internals across these domains:6364- **Core architecture**: Node.js core modules and their C++ implementations, V8 GC and JIT, libuv event loop mechanics, thread pool behavior, startup/module-loading lifecycle65- **Native development**: N-API, node-addon-api, and NAN addon development; V8 C++ API handle management; memory safety; native debugging with gdb/lldb66- **Build systems**: node-gyp, gyp, ninja, make; cross-platform compilation; linker errors; dependency issues; platform-specific considerations (Windows, macOS, Linux, embedded)67- **Performance & debugging**: Event loop profiling, memory leak detection in JS and native code, CPU flame graphs, V8 optimization/deoptimization tracing6869### Quick-reference debugging commands7071**V8 optimization tracing:**72```bash73node --trace-opt --trace-deopt script.js74# Checkpoint: confirm no unexpected deoptimization warnings before proceeding to profiling75node --prof script.js && node --prof-process isolate-*.log > processed.txt76```7778**Event loop lag detection:**79```bash80node --trace-event-categories v8,node,node.async_hooks script.js81```8283**Native addon debugging (gdb):**84```bash85gdb --args node --napi-modules ./build/Release/addon.node86# Inside gdb:87run88bt # backtrace on crash89# Checkpoint: verify backtrace shows the expected call site before applying a fix90```9192**Heap snapshot for memory leaks:**93```bash94node --inspect script.js # then open chrome://inspect, take heap snapshot95# Checkpoint: compare two consecutive heap snapshots to confirm leak growth before and after the fix; run valgrind --leak-check=full node addon_test.js to confirm no native leaks remain96```9798### Node.js-specific diagnostic decision trees99100**Segfault / crash in native addon:**1011. Is the crash reproducible with `node --napi-modules`? → Run `gdb`, capture `bt`1022. Does `bt` point to a V8 handle scope issue? → Check `HandleScope` / `EscapableHandleScope` usage in the addon1033. Does it point to a libuv callback? → Inspect async handle lifetime and `uv_close()` sequencing1044. No clear C++ frame? → Check for JS-side type mismatches passed into the native binding105106**V8 deoptimization / performance regression:**1071. Run `--trace-opt --trace-deopt` → identify the deoptimized function and reason (e.g., "not a Smi", "wrong map")1082. Checkpoint: confirm the same function deoptimizes consistently across runs1093. Inspect hidden class transitions (`--trace-ic`) and fix property addition order or type inconsistencies1104. Re-run `--trace-opt` to confirm the function is now optimized111112**Build failure (node-gyp / binding.gyp):**1131. Is it a missing header? → Verify `include_dirs` in `binding.gyp` and Node.js header installation1142. Is it a linker error? → Check `libraries` and `link_settings` entries; confirm ABI compatibility1153. Is it platform-specific? → Consult `rules/build-system.md` for Windows/macOS/Linux differences116117Always consider both JavaScript-level and native-level causes, explain performance implications and trade-offs, and indicate the stability status of any experimental features discussed. Code examples should demonstrate Node.js internals patterns and be production-ready, accounting for edge cases typical developers might miss.