About node-packaging
node-packaging is a skill for Node.js package maintainers who need consumer-compatible module formats, exports, types, and tarballs. It guides format decisions from Node engine support and checks package output before release.
Key features
- 01Choose ESM or dual format from engine support
- 02Define explicit exports maps
- 03Configure builds and declaration output
- 04Whitelist published tarball contents
- 05Run package validation gates
Use cases
- 01Prepare a package for a stated Node support range
- 02Diagnose module or type resolution errors
- 03Review package contents before publishing
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ paldom/ node-skills --skill node-packagingAfter installing, type/node-packagingin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
evals/evals.jsonreferences/packaging-playbook.mdscripts/check_package.shDetails
From the project READMEnode-packaging
Makes a package that installs and resolves correctly for every consumer you claim to support — module format, exports map, types, and tarball contents. The failures this skill fixes: models declare "ESM-only is fine now" without checking the consumer Node range, write exports maps whose types don't resolve, and publish tarballs full of source and CI junk.
When NOT to use
- Version bumps, changelogs, publishing, OIDC →
node-release. - Declaration emission / tsconfig →
node-typescript(this skill owns how consumers resolve what was emitted). - Dependency hygiene →
node-supply-chain.
Workflow
- Decide format from evidence, not fashion — ESM-first, not ESM-always:
read
package.json#enginesand the consumer reality.require(esm)exists only on specific Node lines and has real constraints (no top-level await in the required graph) — the support matrix and decision framework live inreferences/packaging-playbook.md. Dual ESM+CJS when older engines, tooling, or stated consumers demand it — with the dual-package hazard mitigation from the playbook. - Write the exports map explicitly (playbook blocks for ESM-only and dual):
correct
typescondition placement, subpath exports only for supported API,sideEffectswhere true. - Build: tsdown as the current default (tsup acceptable with rationale) —
declarations on, target matching
engines. - Tarball hygiene:
fileswhitelist (never.npmignorearchaeology),engines,packageManagerwhere the repo pins one. - Gate — never skip:
(npm pack dry-run inspection +bash "${CLAUDE_SKILL_DIR}/scripts/check_package.sh"publint+arethetypeswrong— exact commands in the script; it exits non-zero on any finding.) - Consumer-error diagnosis (
ERR_REQUIRE_ESM, "types not found"): playbook has the decision tree — identify the consumer's Node/module context first; options are documented support-range, genuine dual build, or exports fix. Never blind-add CJS.
Output spec
Explicit exports map; format decision written down with the engines evidence;
build emitting exactly what exports declares; files whitelist; both gates
(publint, attw) clean; npm pack --dry-run tarball reviewed. Changing format or
exports of a published package is semver-major — say so.
Gotchas
- The dual-package hazard (two module instances) is real — singleton/state packages need the playbook's mitigation or ESM-only with a documented range.
- attw failures read cryptically; the playbook maps its codes to concrete exports-map fixes.
enginesdrives everything downstream (CI matrix innode-ci, format here) — set it deliberately, never inherit it silently.- Version-gate the
require(esm)support matrix — re-verify Node ranges against nodejs.org docs at use time.
Files
references/packaging-playbook.md— require(esm) matrix, format decision framework, exports blocks, bundler status, hazard mitigations, error decision tree.scripts/check_package.sh— pack dry-run + publint + attw gate; non-zero exit on findings; degrades with a clear message when Node/npx is unavailable.