Agent skill

Jev Lint

by mizchi in mizchi/jev-lint

A skill your agent uses when running jev-lint, adding it to a repository or its CI, choosing which of its shipped rule packs to use, writing a new jev-lint rule (an ast-grep matcher plus one…

MITAuto-check passedDevelopment

Install Jev Lint

skills CLI
$ npx skills add mizchi/jev-lint --skill jev-lint -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install mizchi/jev-lint jev-lint --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/mizchi/jev-lint.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/jev-lint .claude/skills/jev-lint && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
jev-lint
GitHub stars
119
Token cost
~2.6k tokens
SKILL.md length
1,203 words
Files
6 (incl. references)
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when running jev-lint, adding it to a repository or its CI, choosing which of its shipped rule packs to use, writing a new jev-lint rule (an ast-grep matcher plus one…

  • Works in 6 steps: **Never write a rule a compiler, type… → Never ask for something the matched code… → Never put a threshold in the sentence.… → …
  • Running jev-lint
  • SKILL.md covers Non-negotiables, Which task is this?, Running it and Writing a rule in a project, plus 1 more section
  • Calls npx; needs TYPESAFE_API_KEY and TYPESAFEAI_API_KEY

What it does

Jev Lint is an agent skill from mizchi/jev-lint. Use when running jev-lint, adding it to a repository or its CI, choosing which of its shipped rule packs to use, writing a new jev-lint rule (an ast-grep matcher plus one sentence a model judges), or calibrating a rule's cutoff. Triggers: jev-lint, .jev-lint.yaml, a .jev-lint/rules/.yml or rules/.yml file with ask: in it, questions like 'lint whether function names match their bodies' or 'find comments that are no longer true', and any request to check code for something a conventional linter cannot decide. Also…

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/calibration.md`, `references/cookbook.md` and `references/rule-fields.md`).

It sits in Development, covering Linting and formatting. The repository describes itself as: lint text in code by jev scorerer. The licence is MIT.

When your agent uses it

  • Running jev-lint
  • Adding it to a repository
  • Choosing which of its shipped rule packs to use
  • Writing a new jev-lint rule (an ast-grep matcher plus one sentence a model judges)

Example prompts

  • “lint whether function names match their bodies”
  • “find comments that are no longer true”
  • “/jev-lint”

Requirements

  • Node.js
  • A credential in TYPESAFE_API_KEY
  • A credential in TYPESAFEAI_API_KEY

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. **Never write a rule a compiler, type checker or conventional linter can
  2. Never ask for something the matched code cannot show. The most common
  3. Never put a threshold in the sentence. The cutoff is threshold:; baking it
  4. The API key lives in the environment (TYPESAFE_API_KEY), never in
  5. A finding is a candidate for a human, not a verdict. Measured on real
  6. Record any run you draw a conclusion from (--record r.json).

What it can do on your machine

Read from SKILL.md and the folder at commit af58a3b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • ast-grep.github.io
    • typesafe.ai

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • TYPESAFE_API_KEY
    • TYPESAFEAI_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Jev Lint loads about 2.6k tokens when it runs, and up to ~24k if it reads all its reference files. Until then it costs about 157 tokens; SKILL.md has 1,203 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~157
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~24k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from mizchi/jev-lint at commit af58a3b, republished under its MIT licence (© mizchi). 1,203 words, ~2,626 tokens.

Download SKILL.mdSave it as .claude/skills/jev-lint/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
jev-lint
description
Use when running jev-lint, adding it to a repository or its CI, choosing which of its shipped rule packs to use, writing a new jev-lint rule (an ast-grep matcher plus one sentence a model judges), or calibrating a rule's cutoff. Triggers: `jev-lint`, `.jev-lint.yaml`, a `.jev-lint/rules/*.yml` or `rules/*.yml` file with `ask:` in it, questions like 'lint whether function names match their bodies' or 'find comments that are no longer true', and any request to check code for something a conventional linter cannot decide. Also use it before claiming a jev-lint rule 'works' — this skill defines what that requires.

jev-lint

A linter whose rules are sentences. An ast-grep matcher decides which code is looked at; one sentence decides whether it is a problem; a model (Jev) answers the sentence for every match, batched per file. It finds what no parser can: a function whose body does something other than its name promises, a comment that became false, a test that would pass if the behaviour it names were broken.

who does ithow it fails
rule:ast-grep — exact, free, localsilently: a node it misses is never asked about
ask:the model, once per matchloudly: every answer is visible in jev-lint gaps

Knowing which half you are working on is most of the job.

Non-negotiables

  1. Never write a rule a compiler, type checker or conventional linter can decide. The model is good at code that contradicts a contract it declares about itself and measurably poor at defects needing knowledge of a specific API (that .sort() is lexicographic). Those belong to the existing tools.
  2. Never ask for something the matched code cannot show. The most common way a rule fails, and it looks exactly like a threshold problem: every answer lands mid-scale and no cutoff separates. Check subject and state before touching the wording.
  3. Never put a threshold in the sentence. The cutoff is threshold:; baking it into the question means every recalibration rewrites the question.
  4. The API key lives in the environment (TYPESAFE_API_KEY), never in .jev-lint.yaml, which belongs in version control. apiKey: in the file is a hard error.
  5. A finding is a candidate for a human, not a verdict. Measured on real code about one finding in five was wrong. Read each against the code.
  6. Record any run you draw a conclusion from (--record r.json). jev-lint replay r.json re-scores it under new cutoffs with no API key, so a cutoff stays auditable.

Which task is this?

you want toread
run it, add it to CI, tune outputthis file, next section
use the rules that ship with it, pick some, adjust a cutoffreferences/using-shipped-rules.md
write a rule in your own TypeScript, custom-grammar, Text, or Git repositoryreferences/writing-project-rules.md, then references/cookbook.md
know what every field means, score vs noul, the state armsreferences/rule-fields.md
fit a cutoff, build a rule's evals, judge whether a rule worksreferences/calibration.md
judge commit messages against their diffs, or a change against the repository's own AGENTS.mdjev-lint commits, below
install it as a git hook, and know what blocks a commit../../docs/use-hooks.md

Running it

bash
export TYPESAFE_API_KEY=...            # or TYPESAFEAI_API_KEY
npx -y jev-lint check src --dry-run    # plan and price. Makes NO request.
npx -y jev-lint check src              # judge whole files
npx -y jev-lint run fn-name-promises src        # one shipped rule; rust/<id> for one language
npx -y jev-lint run --file myrule.yml src       # a rule file of your own, and nothing else
npx -y jev-lint review --base main     # judge only what the diff touched
npx -y jev-lint commits --base main    # judge each commit's message against its diff,
                                       #   and each change against AGENTS.md (CLAUDE.md fallback)
npx -y jev-lint commits --staged       # the same, on what is about to be committed
npx -y jev-lint init                   # write .jev-lint.yaml: files, and every shipped rule on
npx -y jev-lint rules                  # what loaded, and every validation error

Run --dry-run first, always: it prints subject count, request count and the price without spending anything. Then review, not check, for anything routine — review mode keeps only matches whose subject overlaps a changed line, which is where findings concentrate and costs a fraction of a cent.

bash
jev-lint review --base "$GITHUB_BASE_REF" --format github   # in CI
jev-lint init --pre-commit      # hook: review --staged + commits --staged, on every commit
jev-lint init --pre-push        # hook: commits @{upstream}..HEAD --fail-on error, before every push
jev-lint check src --retry 3                                 # decide on the mean of 3 passes
jev-lint check src --threshold typescript/fn-name-promises=0.8     # override one cutoff for one run
jev-lint check src -R my-rules.yml -R rules                  # rule sources, repeatable

Exit codes: 0 clean, 1 findings, 2 configuration error, 3 requests failed. Any finding exits 1 unless --fail-on <severity> raises the bar; --format github annotates warning unless the rule says severity: error, and no shipped rule does. The pre-commit hook init --pre-commit writes uses --fail-on error, so no finding blocks a commit until a rule has earned error; without a key in the environment it steps aside. It runs two questions about what is staged -- review --staged for the file rules, then commits --staged for subject: change rules, which is where git/diff-follows-instructions judges the diff against the repository's own AGENTS.md, or CLAUDE.md when absent. A failed request exits 3, and git fails a hook on any non-zero exit, so the shipped bodies let 3 through deliberately: being unable to commit while offline is how a hook gets deleted rather than fixed. Both bodies are tracked at .jev-lint/hooks/<name>, reviewable like any other file, with a shim in git's hooks directory that finds and runs them -- ../../docs/use-hooks.md. --staged reviews what the commit will contain: no untracked files, no unstaged edits, though a partially staged file is judged as it is on disk. When paths are configured or given, review scans only the changed files under them, never the whole tree.

Settings: .jev-lint.yaml (or jev-lint.yaml, .jevlint.yml, any spelling; two in one directory is an error), nearest one searching upwards, a flag beats it. languages: declares a grammar ast-grep does not have built in (a tree-sitter parser compiled to a dynamic library — see the reference; MoonBit is measured there). files: there lets jev-lint check take no argument; rules: picks the rules, ESLint-style — fn-name-promises: on, rust/fn-name-promises: off, comment-describes-block: { threshold: 0.7, severity: error } — from the shipped packs and the project's own .jev-lint/rules/; a config with no rules: runs nothing. Unknown keys are errors. A -R run inside a repository that has a config still merges that config — its rules:, its files: — so pass --no-config when testing a rule in isolation, and --cache none so no earlier verdict is reused (the cache is .jev-lint/baseline.json; -c <path> names another).

Show full SKILL.md (400 more words)Show less

hooks.precommit can select a separate rule set for review --staged and commits --staged. extends: true inherits top-level rules: and applies the hook entries over it; extends: false uses only hook entries. Without the section, staged runs use top-level rules:. See the hook guide.

Two output lines that are never noise:

  • N rules matched nothing — the only place a dead matcher is visible. On a TypeScript-only repository the seven Rust variants land here; anything else there is a matcher to look at.
  • N without a verdict — requests failed. A run with failures never reads as a clean repository.

Silencing — any comment syntax, first thing on its line:

ts
// jev-lint-ignore-next-line fn-name-promises, var-name-describes-value
// jev-lint-ignore-file

A suppressed subject is never sent, so it also saves its tokens; every run prints how many were skipped, and calls out a suppression naming a rule id that does not exist.

--retry n asks everything n times and decides on the mean, printing 3/3 passes or 1/3 passes per finding. Use it near a cutoff: pass-to-pass spread has a median of 0.01 but a maximum of 0.30. It bypasses the verdict cache and costs n times the tokens. (-r is retry; -R is rules.)

Writing a rule in a project

Use writing-project-rules.md for the rule's location and the steps for a built-in grammar, a custom parser, a Text block, or a Git change. It links the validated cookbook, the field reference, and the calibration procedure. Keep the --dry-run --show-subjects matcher check separate from the paid, labelled evaluation; a guessed threshold: is not a calibrated rule.

Judging the output

When you disagree with a finding it is one of three things, and only the third means the tool is wrong:

  1. The rule is right and the code is wrong. Most often. Fix the code.
  2. The rule is right and the name is wrong. A test called "no batch exceeds the ceiling" whose body legitimately exempts one-subject batches is a name that overclaims. Fix the name.
  3. The rule is wrong. Add the case to the rule's fixtures/ as a labelled clean example in expect.yml, run the eval, and refit. A false positive that is not in the evals comes back.

Do not chase the tail: editing a file moves the located state for every subject in it, so a fix can move unrelated verdicts. Fix what you agree with, re-measure with --retry 3, and record the residue rather than iterating against noise.

© mizchi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (references) in skills/jev-lint of mizchi/jev-lint.

  • SKILL.md
  • references/calibration.md
  • references/cookbook.md
  • references/rule-fields.md
  • references/using-shipped-rules.md
  • references/writing-project-rules.md

Open the folder on GitHubat commit af58a3b

Compare with similar skills

Jev Lint next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Jev Lint compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Jev Lint this skillmizchi/jev-lint119—~2.6kAutomated safety check: PassMIT
Minimizing Ty Ecosystem Changesastral-sh/ruff50k—~4.6kAutomated safety check: PassMIT
Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop5.4k—~2.2kAutomated safety check: PassMIT
Babysit PR To Pass CIsgl-project/sglang37k2 repos~3kAutomated safety check: PassApache-2.0
Rust Best Practicesfarm-fe/farm5.6k3 repos~1.1kAutomated safety check: PassMIT
Summarise Ecosystem Resultsastral-sh/ruff50k—~2.2kAutomated safety check: PassMIT

Similar skills

  • Official

    A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…

    50k GitHub stars~4.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.

    5.4k GitHub stars~2.2k tokensUpdated 29 days ago
    DevelopmentAuto-check passed
  • Babysit PR To Pass CI

    sgl-project/sglang

    Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.

    37k GitHub starsUsed in 2 repos~3k tokens
    DevelopmentAuto-check passed
  • Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.

    5.6k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Official

    A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…

    50k GitHub stars~2.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Go Pedantry

    chromedp/chromedp

    This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…

    13k GitHub stars~3.7k tokensUpdated 4 days ago
    DevelopmentAuto-check passed

More from mizchi/jev-lint

  • Jev Lint Repo

    mizchi/jev-lint

    A skill your agent uses when changing jev-lint ITSELF — editing src/, shipped rule suites under rules/<language/<id/, or recorded runs in docs/data/.

    119 GitHub stars~942 tokensUpdated 8 days ago
    Auto-check passed

Categories

Questions about Jev Lint

What does Jev Lint do?

A skill your agent uses when running jev-lint, adding it to a repository or its CI, choosing which of its shipped rule packs to use, writing a new jev-lint rule (an ast-grep matcher plus one…. Jev Lint is an agent skill from mizchi/jev-lint. Use when running jev-lint, adding it to a repository or its CI, choosing which of its shipped rule packs to use, writing a new jev-lint rule (an ast-grep matcher plus one sentence a model judges), or calibrating a rule's cutoff.

When should I use Jev Lint?

Jev Lint fits situations like: running jev-lint; adding it to a repository; choosing which of its shipped rule packs to use; writing a new jev-lint rule (an ast-grep matcher plus one sentence a model judges).

How do I install Jev Lint in Claude Code?

Run `npx skills add mizchi/jev-lint --skill jev-lint -a claude-code`. Or copy the skill folder (skills/jev-lint in mizchi/jev-lint) into .claude/skills/jev-lint in your project. Claude Code loads it when a task matches its description.

How do I install Jev Lint in Codex?

Run `npx skills add mizchi/jev-lint --skill jev-lint -a codex`. Or copy the skill folder (skills/jev-lint in mizchi/jev-lint) into .agents/skills/jev-lint in your project. Codex loads it when a task matches its description.

Can I use Jev Lint in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add mizchi/jev-lint --skill jev-lint -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/jev-lint, .gemini/skills/jev-lint, .github/skills/jev-lint and .opencode/skills/jev-lint in your project.

What does Jev Lint need to run?

Going by SKILL.md and its folder, Jev Lint needs the command-line tools its instructions call (npx) and credentials named TYPESAFE_API_KEY and TYPESAFEAI_API_KEY. Our summary lists: Node.js; A credential in TYPESAFE_API_KEY; A credential in TYPESAFEAI_API_KEY.

Does Jev Lint access the network?

SKILL.md names 2 domains. As links in the text: ast-grep.github.io and typesafe.ai. This is read from the text; nothing was executed.

Is Jev Lint safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Jev Lint use?

Jev Lint is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Jev Lint use?

About 2.6k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 21k tokens, read only when the agent opens those files.

What are the alternatives to Jev Lint?

Skills that share tags, products or a category with Jev Lint: Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars), Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.4k stars), Babysit PR To Pass CI (sgl-project/sglang, 37k stars) and Rust Best Practices (farm-fe/farm, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Jev Lint?

mizchi (a GitHub user) maintains it in mizchi/jev-lint, which has 119 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 2, 2026.

Source: mizchi/jev-lint on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.