One-line setup
Call devMode() once at app startup. PulsCheck auto-instruments fetch, setTimeout, setInterval, clearTimeout, clearInterval, addEventListener, removeEventListener, and WebSocket. No manual placement, no configuration.
One function call. Four detectors. Zero config.
Call devMode() once at app startup. PulsCheck auto-instruments fetch, setTimeout, setInterval, clearTimeout, clearInterval, addEventListener, removeEventListener, and WebSocket. No manual placement, no configuration.
after-teardown, response-reorder, double-trigger, and dangling-async. The runtime timing bugs that static analysis cannot see.
Gate devMode() behind import.meta.env.DEV or process.env.NODE_ENV in your entrypoint. The registry no-ops when NODE_ENV is production, but the package does not strip itself — the call site must do the guarding.
Every finding includes the pattern, severity, call sites extracted from stack traces, and a concrete fix suggestion. Structurally deduplicated by (pattern, sorted labels, call site) — one report per bug, not per occurrence.
npx pulscheck scan src/ runs an AST-based detector for fetch() inside useEffect without AbortController — the static sibling of the runtime after-teardown pattern. npx pulscheck ci outputs SARIF and exits non-zero on findings for CI gates.