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

@jevlint/cli

v0.1.4

Published

Configurable semantic linting with Jev, including magic-strings and descriptive-names plugins.

Readme

JevLint

Slop happens. Don’t ship it.

Write coding conventions in plain English. JevLint checks what your code means, semantically, so your coding agent can fix what syntax rules miss.

Use it in a write → check → fix → repeat workflow: your agent writes code, JevLint checks it against your conventions, and the agent uses the findings to make the next edit. Run it from your terminal, an agent’s verification step, or CI. Your agent or workflow controls when to run checks and how to fix findings; JevLint supplies the judgments.

JevLint is powered by Jev, TypeSafe AI’s System One model. It sends selected source files and plugin instructions to the Jev API, then reports the probability that each file violates a rule. Findings are file-level signals for review, without line-level diagnostics, generated replacement names, or automatic fixes. The default finding threshold is 0.8 (80%).

Website · npm · GitHub

Get started

Requires Node.js 24 or newer. From your project root:

npm install --save-dev @jevlint/cli
npx jevlint init

init creates jevlint.config.json with magic-strings enabled, prettyPrint: true, and exclusions for tests and TypeScript declaration files. It never overwrites an existing config. Configuration is optional: without one, JevLint scans the current directory with magic-strings.

Add your key to .env in the directory where you run JevLint:

JEV_API_KEY=your-api-key

The CLI loads .env automatically; exported shell variables take precedence. Then run:

npx jevlint

To choose targets, preview requests, or adjust the threshold:

npx jevlint src
npx jevlint 'src/**/*.ts' --ignore '**/*.test.ts'
npx jevlint src --dry-run
npx jevlint src --threshold 0.9 --format json

Quote globs so JevLint expands them. Repeat --ignore for additional exclusions. --dry-run prints request JSON without calling the Jev API or requiring a key. It still imports and executes configured JavaScript and TypeScript plugins with normal Node.js permissions. Plugin code can read files, modify files, or make its own network requests, including during a dry run. Only run configurations and plugins you trust; this flag is not a sandbox for unfamiliar repositories.

Source scanning excludes secrets/ and credentials/ directories and files named secrets or credentials with any supported extension: .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, and .cts. These filename exclusions are not secret detection: sensitive values in other source files can still be included. Use --ignore or configuration exclusions for additional sensitive files.

Your rules, your files

Built-in plugins can be enabled by name:

| Plugin | What it checks | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | magic-strings | Application-defined symbolic strings, such as states, modes, and actions, that should use named constants. Ordinary display text, paths, and library-defined values are exempt. | | descriptive-names | Vague or misleading identifiers whose purpose is clear enough from the file to justify a better name. Conventional short names, clear local names, and externally defined API names are allowed. |

Enable both across all selected files with:

{
  "plugins": ["magic-strings", "descriptive-names"]
}

Or give each plugin its own scope. This example checks separate parts of a project:

{
  "files": ["src"],
  "ignore": ["**/*.test.*", "**/*.d.ts"],
  "plugins": [
    {
      "path": "magic-strings",
      "files": ["src/domain/**"],
      "ignore": ["**/*.generated.ts"]
    },
    {
      "path": "descriptive-names",
      "files": ["src/services/**"],
      "ignore": ["**/*.generated.ts"]
    }
  ],
  "threshold": 0.8,
  "format": "text",
  "prettyPrint": true
}

Plugins from another folder

Write your convention as a yes/no question and export a plugin object from index.mjs or index.ts. For example, save this as custom-plugins/no-debug-logs/index.mjs:

export const plugin = {
  id: "no-debug-logs",
  instructions:
    "Does this file contain temporary debugging console calls that should be removed? Allow intentional CLI output, operational logging, and error reporting. Judge executable calls, not examples inside strings or comments.",
  message: "Remove temporary debug logging from this file.",
};

Register its directory path in your config:

{
  "files": ["src"],
  "plugins": [
    {
      "path": "./custom-plugins/no-debug-logs",
      "files": ["src/**"],
      "ignore": ["**/*.test.ts"]
    }
  ]
}

The plugin path is relative to the config file. You can also point directly to a plugin file. Plugin IDs must be unique within a configuration. instructions can be a string or a structured object or array for more detailed rules and examples.

Human-readable and machine-readable output

Pretty text is the default: findings are grouped by file, probabilities appear as percentages, and terminal colours distinguish warnings, errors, and clean results. Set "prettyPrint": false for compact plain text. Use --color always or --color never to control colours in pretty output; NO_COLOR disables automatic colours.

For scripts, agents, and CI:

npx jevlint --format json > report.json

You can also set "format": "json" in your config. JSON output includes no colours or progress messages, regardless of prettyPrint. Reports contain plugins, model, threshold, results, and summary. File failures appear in results; fatal errors use { "error": { "message": "..." } }.

| Exit code | Meaning | | --------- | ---------------------------------------------------------------------- | | 0 | No findings or analysis failures. Check the summary for skipped files. | | 1 | At least one file has a finding at or above the threshold. | | 2 | Configuration or analysis failure. |

Run npx jevlint --help for all options. The included jevlint.config.example.json also shows model selection, a custom API-key environment variable, request timeout, and file-size limits.

Developing JevLint

From this repository, use the pnpm version pinned in package.json:

pnpm install
pnpm jevlint init
pnpm jevlint src
pnpm test
pnpm typecheck
pnpm build

The source CLI also runs through npm run jevlint -- src. To get JSON without npm’s script banner, use npm run --silent jevlint -- --format json.

JevLint is an independent project, not affiliated with or endorsed by TypeSafe AI. Licensed under MIT.