npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

no-mistakes

v0.69.0

Published

Deterministic impact maps, test plans, Playwright coverage, and repository checks for coding agents

Readme

no-mistakes

Local AST graph for coding agents: impact, focused test plans, Playwright coverage, and repository checks. Use it when grep would miss callers behind aliases, when a change should not run every suite, or when a new page needs a coverage gate. See why it exists.

The async N-API facade avoids subprocess parsing and reuses one prepared analysis for related reports.

Published installs select a platform-specific optional package containing both the CLI and N-API addon. Prebuilt packages support macOS ARM64, Linux ARM64 and x64 with glibc, and Windows x64; Intel Macs are not supported. Repository contributors build and stage the local native package explicitly with pnpm run build:native before running the CLI.

npm install --save-dev no-mistakes
npx no-mistakes dependencies src/main.mts --json
npx no-mistakes dependents src/utils.mts --json
npx no-mistakes symbols src/utils.mts --json
npx no-mistakes import-usages --root . --filter 'src/**' --json
npx no-mistakes check --json
npx no-mistakes planning-impact --changed-files /private/run/changed-files.txt --output-dir /private/run

planning-impact is supplied by the npm package, not the Cargo-installed binary. It writes the private four-report artifact contract from one prepared analysis. See the CLI reference.

Programmatic Node usage loads the same Rust analysis through N-API:

const { analyzeProject } = require("no-mistakes");

const report = await analyzeProject({
  root: process.cwd(),
  reports: [
    { type: "dependents", files: ["src/api.mts"] },
    { type: "symbols", files: ["src/api.mts"], include: "both" },
    {
      type: "testsPlan",
      framework: "vitest",
      changedFiles: ["src/api.mts"],
    },
  ],
});

Use analyzeProject() when reports share a root and configuration. Dedicated functions remain convenient for a single query:

testsWhy reports that receive planJson are materialized in a private temporary directory and cleaned up after success, native rejection, or preparation failure, including when they are batched through analyzeProject().

const {
  dependencies,
  dependents,
  check,
  fetches,
  importUsages,
  flow,
  playwrightRelated,
  symbols,
  testsPlan,
  testsTargets,
  queueEdges,
  queueRelated,
  queueCheck,
  serverRouteList,
  serverRouteEdges,
  serverRouteRelated,
  serverContracts,
  reactAnalyze,
  reactCheck,
  validateMermaidMarkdown,
} = require("no-mistakes");

(async () => {
  const deps = await dependencies({
    root: process.cwd(),
    files: ["src/main.mts"],
    relationships: ["import"],
  });
  const tests = await dependents({
    root: process.cwd(),
    files: ["src/utils.mts"],
    tests: ["vitest"],
  });
  const symbolFacts = await symbols({
    root: process.cwd(),
    files: ["src/utils.mts"],
    include: "both",
  });
  const imports = await importUsages({
    root: process.cwd(),
    filters: ["src/**"],
  });
  const signatureImpact = await symbols({
    root: process.cwd(),
    files: ["src/utils.mts"],
    mode: "signature-impact",
    symbol: "parseDate",
  });
  const plan = await testsPlan({
    root: process.cwd(),
    framework: "vitest", // also jest, python, go, cargo, rails, php, java, kotlin, elixir, dart, playwright, dotnet, swift
    changedFiles: ["src/utils.mts"],
  });
  // Complete changed-file inventory, including paths that selected no tests.
  console.log(plan.changedFiles);
  const targetCommands = await testsTargets({
    root: process.cwd(),
    framework: "vitest",
    files: ["src/utils.test.mts"],
  });
  const projectCheck = await check({
    root: process.cwd(),
    // Path to tsconfig.json for alias resolution; searched upward if omitted.
    // In monorepos, pass the workspace-scoped tsconfig (e.g. "web/tsconfig.json").
    tsconfig: "tsconfig.json",
  });
  const mermaid = await validateMermaidMarkdown({
    content: "```mermaid\nflowchart LR\n  A --> B\n```",
    file: "docs/design.md",
  });
  const localFlow = await flow({
    root: process.cwd(),
    target: "src/utils.mts#parseDate",
    direction: "dependents",
    depth: 1,
  });
  const coveredByPlaywright = await playwrightRelated({
    root: process.cwd(),
    files: ["web/app/users/page.tsx"],
  });

  const queueHops = await queueRelated({
    root: process.cwd(),
    files: ["src/jobs/enqueue.ts"],
    direction: "both",
  });
  const routeEdges = await serverRouteEdges({
    root: process.cwd(),
    roots: ["src/server.ts"],
  });
  const contracts = await serverContracts({
    root: process.cwd(),
    roots: ["src/server.ts"],
  });
  const components = await reactAnalyze({
    root: process.cwd(),
    targets: ["app/**/*.tsx"],
  });
})();

CLI and Node analyses share a per-user machine-wide lock. CLI flags --timeout, --lock-timeout, and --fail-on-lock have Node equivalents timeout, lockTimeout, and failOnLock. CLI timeouts default to 30 seconds; Node/N-API omits both deadlines unless you set them. 0 disables either CLI timeout, while 0 or null disables it in Node. While waiting, stderr reports the holder pid and elapsed seconds. Waiting does not alter successful output, and Node lock/timeout failures reject the returned Promise.

Dependency graph, query, and test-planning resolution is per workspace by default: when tsconfig is omitted, each import uses the config that owns its importing file, including referenced projects. This keeps conflicting package aliases isolated while shared code can still select all importing tests. Pass tsconfig explicitly to force one config for a whole invocation when debugging or preserving a legacy single-config workflow.

Graph queries also support relationships: ["workflow"] for canonical local GitHub Actions traversal: workflow file -> virtual job -> virtual step, needs, local reusable workflows/actions, supported literal run: targets and package scripts, and same-run artifact handoffs. Virtual IDs are workflow.yml#job:<job> and workflow.yml#job:<job>/step:<zero-based-index>. Use the precise workflow-job, workflow-step, workflow-needs, workflow-uses, workflow-run, or workflow-artifact filters to select a semantic while retaining its required structural bridge edges. The legacy ci relationship stays separate: it covers only workflow-file-to-Rust-binary Cargo invocations. Remote actions/workflows, workflow_run, dynamic shell commands, and paths outside the tracked graph are intentionally excluded.

External no-mistakes-* executables on PATH can be invoked as subcommands. For example, after installing no-mistakes-scripts:

npm install --save-dev no-mistakes-scripts
npx no-mistakes rust-no-inline-tests crates/*/src
npx no-mistakes rust-max-lines-per-file crates/*/src crates/*/tests

See the full documentation in docs/, the CLI command index, and the Node/N-API guide. Agents can use the compact packaged skill.