no-mistakes
v0.40.1
Published
Static codebase analysis tools for TS/JS dependencies, dependents, and symbols
Readme
no-mistakes
Unified static codebase intelligence CLI for TS/JS module graphs, symbols, React traits, queue hops, server routes, and project checks.
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 --jsonProgrammatic Node usage loads the same Rust analysis through N-API:
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"],
timeout: 30,
lockTimeout: 30,
});
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 supports "playwright", "dotnet", and "swift"
changedFiles: ["src/utils.mts"],
});
// Complete changed-file inventory, including paths that selected no tests.
console.log(plan.changed_files);
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. Both timeouts default to 30 seconds;
0 disables either CLI timeout, while 0 or null disables it in Node.
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/*/testsSee the full documentation in docs/, the CLI command index, and the Node/N-API guide.
