How to run Node.js package binaries with npm/pnpm/npx. Use when installing global packages, running CLI tools, or configuring editor formatters.
Runs Node.js package binaries using npm, pnpm, and npx with proper global/local resolution.
/plugin marketplace add jasonkuhrt/claude-marketplace/plugin install node-packages@jasonkuhrtThis skill inherits all available tools. When active, it can use any tool Claude has access to.
DO NOT assume pnpm and npm CLIs are equivalent for running binaries.
The matrix is complex and getting it wrong causes subtle failures.
pnpm manages node versions via pnpm env use. If npm globals are installed to pnpm's node directory, switching node versions breaks your global tools (claude-code, dprint, etc. vanish).
Solution: Set npm prefix to a fixed location:
# .npmrc
prefix=~/.npm-global
This keeps globals at ~/.npm-global/bin/ regardless of which node version pnpm is using.
┌─────────────────────────────────────────────────────────────────┐
│ PATH order (first wins) │
├─────────────────────────────────────────────────────────────────┤
│ ~/.npm-global/bin ← npm globals (claude, dprint, nx, etc) │
│ ~/Library/pnpm ← pnpm binaries (node, npm, pnpm) │
│ /opt/homebrew/bin ← brew (fallback node, initial pnpm) │
└─────────────────────────────────────────────────────────────────┘
| Tool | Manages | Location |
|---|---|---|
| Homebrew | Initial bootstrap (node + pnpm) | /opt/homebrew/bin |
| pnpm | Node versions (pnpm env use) | ~/Library/pnpm/nodejs/<ver> |
| npm | Global CLI tools | ~/.npm-global (fixed, version-agnostic) |
brew install node pnpm — initial node + pnpmpnpm env use --global lts — pnpm installs its own node, shadows brew's~/.npm-globalAfter bootstrap, brew's node is effectively unused (pnpm's comes first in PATH).
| Command | In project (has package.json) | Outside project |
|---|---|---|
npx <pkg> | local node_modules → npm global → downloads | npm global → downloads |
pnpm exec <pkg> | local node_modules → pnpm global | FAILS with ERR_PNPM_RECURSIVE_EXEC_NO_PACKAGE |
pnpm dlx <pkg> | downloads to temp (ignores local) | downloads to temp |
Direct <pkg> | uses PATH | uses PATH |
npx checks node_modules/.bin/ regardless of which package manager installed them. So in a pnpm project, npx dprint finds the local dprint.
npx reads npm's config (~/.npmrc) to find globals. With prefix=~/.npm-global, npx checks there:
npx <cmd> → local node_modules → ~/.npm-global → downloads
This is why we use npm (not pnpm) for globals.
Use npm with a fixed prefix:
# .npmrc sets prefix=~/.npm-global
npm install -g dprint
# Now works everywhere:
npx dprint --version # finds ~/.npm-global/bin/dprint
dprint --version # finds via PATH
Option A: npx (recommended)
{
"command": "npx",
"arguments": ["dprint", "fmt", "--stdin", "markdown"]
}
Uses local version if in project, falls back to npm global, downloads if needed.
Option B: Direct PATH call
{
"command": "dprint",
"arguments": ["fmt", "--stdin", "markdown"]
}
Works if package is in PATH.
# Without fixed prefix, npm installs to pnpm's node directory:
npm install -g dprint # → ~/Library/pnpm/nodejs/24.12.0/lib/...
pnpm env use 22 # switch node version
dprint --version # ERROR: not found (it's in 24.12.0 dir)
Fix: Set prefix=~/.npm-global in .npmrc
# In project: works
cd my-project && pnpm exec dprint --version
# Outside project: FAILS
cd /tmp && pnpm exec dprint --version
# ERR_PNPM_RECURSIVE_EXEC_NO_PACKAGE
pnpx (alias for pnpm dlx) always downloads to temp. It does NOT check local or global.
npx dprint --version # → checks local, then global, then downloads
pnpx dprint --version # → always downloads (ignores local/global)
| Goal | Solution |
|---|---|
| Run local package in project | npx <pkg> or pnpm exec <pkg> |
| Run global package anywhere | Install with npm -g, run with npx or directly |
| Globals survive node version changes | Set prefix=~/.npm-global in .npmrc |
| Editor formatter | npx <pkg> (works everywhere) |
This skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.