Minimizing Ty Ecosystem Changes
astral-sh/ruff
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"…
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…
$ npx skills add mizchi/jev-lint --skill jev-lint -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mizchi/jev-lint jev-lint --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "jev-lint" agent skill from https://github.com/mizchi/jev-lint/tree/main/skills/jev-lint into .claude/skills/jev-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jev-lint", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/mizchi/jev-lint/tree/main/skills/jev-lintType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add mizchi/jev-lint --skill jev-lint -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mizchi/jev-lint jev-lint --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/jev-lint.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/jev-lint .agents/skills/jev-lint && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "jev-lint" agent skill from https://github.com/mizchi/jev-lint/tree/main/skills/jev-lint into .agents/skills/jev-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jev-lint", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mizchi/jev-lint --skill jev-lint -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mizchi/jev-lint jev-lint --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/jev-lint.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/jev-lint .cursor/skills/jev-lint && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "jev-lint" agent skill from https://github.com/mizchi/jev-lint/tree/main/skills/jev-lint into .cursor/skills/jev-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jev-lint", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/mizchi/jev-lint.git --path skills/jev-lint--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add mizchi/jev-lint --skill jev-lint -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mizchi/jev-lint jev-lint --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/jev-lint.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/jev-lint .gemini/skills/jev-lint && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "jev-lint" agent skill from https://github.com/mizchi/jev-lint/tree/main/skills/jev-lint into .gemini/skills/jev-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jev-lint", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install mizchi/jev-lint jev-lintInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add mizchi/jev-lint --skill jev-lint -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mizchi/jev-lint.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/jev-lint .github/skills/jev-lint && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "jev-lint" agent skill from https://github.com/mizchi/jev-lint/tree/main/skills/jev-lint into .github/skills/jev-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jev-lint", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mizchi/jev-lint --skill jev-lint -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mizchi/jev-lint jev-lint --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/jev-lint.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/jev-lint .opencode/skills/jev-lint && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "jev-lint" agent skill from https://github.com/mizchi/jev-lint/tree/main/skills/jev-lint into .opencode/skills/jev-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jev-lint", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
jev-lintA 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. 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.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit af58a3b. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
ast-grep.github.iotypesafe.aiFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
TYPESAFE_API_KEYTYPESAFEAI_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from mizchi/jev-lint at commit af58a3b, republished under its MIT licence (© mizchi). 1,203 words, ~2,626 tokens.
.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.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 it | how it fails | |
|---|---|---|
rule: | ast-grep — exact, free, local | silently: a node it misses is never asked about |
ask: | the model, once per match | loudly: every answer is visible in jev-lint gaps |
Knowing which half you are working on is most of the job.
.sort() is lexicographic). Those belong to the existing tools.subject and state before
touching the wording.threshold:; baking it
into the question means every recalibration rewrites the question.TYPESAFE_API_KEY), never in
.jev-lint.yaml, which belongs in version control. apiKey: in the file
is a hard error.--record r.json).
jev-lint replay r.json re-scores it under new cutoffs with no API key,
so a cutoff stays auditable.| you want to | read |
|---|---|
| run it, add it to CI, tune output | this file, next section |
| use the rules that ship with it, pick some, adjust a cutoff | references/using-shipped-rules.md |
| write a rule in your own TypeScript, custom-grammar, Text, or Git repository | references/writing-project-rules.md, then references/cookbook.md |
know what every field means, score vs noul, the state arms | references/rule-fields.md |
| fit a cutoff, build a rule's evals, judge whether a rule works | references/calibration.md |
| judge commit messages against their diffs, or a change against the repository's own AGENTS.md | jev-lint commits, below |
| install it as a git hook, and know what blocks a commit | ../../docs/use-hooks.md |
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 errorRun --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.
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, repeatableExit 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).
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:
// jev-lint-ignore-next-line fn-name-promises, var-name-describes-value
// jev-lint-ignore-fileA 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.)
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.
When you disagree with a finding it is one of three things, and only the third means the tool is wrong:
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
SKILL.md and 5 other files (references) in skills/jev-lint of mizchi/jev-lint.
Open the folder on GitHubat commit af58a3b
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Jev Lint this skillmizchi/jev-lint | 119 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Minimizing Ty Ecosystem Changesastral-sh/ruff | 50k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.4k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Babysit PR To Pass CIsgl-project/sglang | 37k | 2 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Rust Best Practicesfarm-fe/farm | 5.6k | 3 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | — | ~2.2k | Automated safety check: Pass | MIT |
astral-sh/ruff
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"…
dmmulroy/anti-slop
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.
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.
farm-fe/farm
Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.
astral-sh/ruff
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…
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)…
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/.
Categories
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.