Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run Python (ruff) and JavaScript (Biome) linting.
.claude/skills/notque-code-linting/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 874% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 604% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 168% | 0% |
Unified linting workflow for Python (ruff) and JavaScript (Biome). Covers check, format, and auto-fix for both languages. Only handles Python and JavaScript/TypeScript -- complex logic issues and other languages are out of scope.
| Signal | Load These Files | Why | |---|---|---| | Python violations, ruff rules, F401/E711/B006/UP errors | ruff-rules-reference.md | Routes to the matching deep reference | | ruff not found, pyproject.toml config, ruff version differences | ruff-rules-reference.md | Routes to the matching deep reference | | JavaScript/TypeScript violations, Biome rules, noVar/useConst/noDoubleEquals | biome-rules-reference.md | Routes to the matching deep reference | | biome not found, biome.json config, migrating from ESLint | biome-rules-reference.md | Routes to the matching deep reference | | Linting CI failures, format check vs lint check differences | biome-rules-reference.md | Routes to the matching deep reference |
Before running any linter, read the repository's CLAUDE.md for project-specific linting rules -- those override every default below. Then locate the project's linter config files (pyproject.toml for ruff, biome.json for Biome). All linter invocations must use these configs as-is; never override line width, rule sets, or other project settings.
When a project contains both Python and JavaScript/TypeScript, lint both unless the user explicitly requests a single language. Run the check command first to see what violations exist:
bash# Python -- use project venv when available ruff check . # or: ./venv/bin/ruff check . # JavaScript/TypeScript npx @biomejs/biome check src/
Always display the complete linter output. Never summarize results as "no issues found" or describe output secondhand -- show the actual command output so the user can see every error, warning, and style issue together.
Read the full output and understand what violations exist and their severity before applying any fixes. Jumping straight to --fix without reviewing risks auto-removing imports that are still needed or making changes that reduce readability.
Apply --fix for safe categories: formatting, import ordering, and style issues that the linter can correct mechanically.
bash# Python ruff check --fix . ruff format . # JavaScript/TypeScript npx @biomejs/biome check --write src/ npx @biomejs/biome format --write src/
Only run the linters and fixes that were requested. Do not add custom rules, configuration changes, or additional tooling unless the user explicitly asks.
After auto-fix, review the diff to verify changes are correct and safe:
bashgit diff
Auto-fixes can occasionally remove imports that are still needed, reformat code in ways that hurt readability, or introduce subtle bugs through variable shadowing changes. Revert any problematic auto-fixes before proceeding.
For violations that cannot be auto-fixed, explain each one and how to resolve it:
Python common fixes:
ruff check --fixJavaScript common fixes:
var with let/constconst for unchanging values=== instead of ==Run the linter one final time to confirm zero violations before suggesting a commit:
bashruff check . ruff format --check . npx @biomejs/biome check src/
Report output factually -- no self-congratulation, just the command results.
Remove any temporary lint report files or cache files created during execution.
bashmake lint # Check both Python and JS make lint-fix # Fix both Python and JS
| Tool | Config | Typical Line Width | |------|--------|-------------------| | ruff | pyproject.toml | 88-120 | | biome | biome.json | 80-120 |
Cause: Virtual environment not activated or ruff not installed Solution:
./venv/bin/ruff or ./env/bin/ruffpip install ruffpipx run ruff check .Cause: Biome not installed in project Solution: Run npx @biomejs/biome to use npx-based execution
Cause: Running from wrong directory Solution: cd to project root where pyproject.toml/biome.json exist
Load these files when the task involves the corresponding domain:
| Task type | Reference file | |-----------|---------------| | Python violations, ruff rules, F401/E711/B006/UP errors | references/ruff-rules-reference.md | | ruff not found, pyproject.toml config, ruff version differences | references/ruff-rules-reference.md | | JavaScript/TypeScript violations, Biome rules, noVar/useConst/noDoubleEquals | references/biome-rules-reference.md | | biome not found, biome.json config, migrating from ESLint | references/biome-rules-reference.md | | Linting CI failures, format check vs lint check differences | references/ruff-rules-reference.md + references/biome-rules-reference.md |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 1,988 | 3,780 | +90% | 1 | 1 | 0% | 212 | 2,064 | +874% | 0 | 0 | — |
case-01 | fail→fail | 3,296 | 3,468 | +5% | 1 | 1 | 0% | 426 | 1,898 | +346% | 0 | 0 | — |
case-02 | fail→fail | 4,992 | 6,977 | +40% | 1 | 1 | 0% | 161 | 1,900 | +1080% | 0 | 0 | — |
case-03 | fail→fail | 10,008 | 3,003 | -70% | 1 | 1 | 0% | 1,623 | 1,861 | +15% | 0 | 0 | — |
case-04 | fail→pass | 19,238 | 13,821 | -28% | 1 | 1 | 0% | 3,589 | 3,941 | +10% | 0 | 0 | — |
case-06 | fail→pass | 14,463 | 14,479 | +0% | 1 | 1 | 0% | 2,132 | 3,306 | +55% | 0 | 0 | — |
case-07 | pass→pass | 8,396 | 5,083 | -39% | 1 | 1 | 0% | 1,363 | 2,307 | +69% | 0 | 0 | — |
case-08 | pass→pass | 10,350 | 4,989 | -52% | 1 | 1 | 0% | 1,714 | 2,381 | +39% | 0 | 0 | — |
case-09 | pass→pass | 11,991 | 5,537 | -54% | 1 | 1 | 0% | 1,991 | 2,445 | +23% | 0 | 0 | — |
case-10 | fail→pass | 2,112 | 3,054 | +45% | 1 | 1 | 0% | 275 | 1,937 | +604% | 0 | 0 | — |
case-11 | fail→fail | 11,525 | 5,032 | -56% | 1 | 1 | 0% | 1,643 | 2,232 | +36% | 0 | 0 | — |
case-12 | pass→pass | 10,935 | 4,760 | -56% | 1 | 1 | 0% | 1,718 | 2,334 | +36% | 0 | 0 | — |
case-13 | pass→pass | 4,743 | 2,398 | -49% | 1 | 1 | 0% | 768 | 1,879 | +145% | 0 | 0 | — |
case-14 | fail→pass | 4,887 | 3,479 | -29% | 1 | 1 | 0% | 756 | 2,025 | +168% | 0 | 0 | — |
case-15 | fail→pass | 7,339 | 2,844 | -61% | 1 | 1 | 0% | 1,099 | 1,916 | +74% | 0 | 0 | — |
case-16 | pass→pass | 9,387 | 4,495 | -52% | 1 | 1 | 0% | 1,503 | 2,135 | +42% | 0 | 0 | — |
case-17 | pass→pass | 9,717 | 6,634 | -32% | 1 | 1 | 0% | 1,729 | 2,651 | +53% | 0 | 0 | — |
case-18 | fail→pass | 7,539 | 3,747 | -50% | 1 | 1 | 0% | 1,300 | 2,070 | +59% | 0 | 0 | — |
case-19 | pass→pass | 8,963 | 1,633 | -82% | 1 | 1 | 0% | 1,298 | 1,704 | +31% | 0 | 0 | — |
case-20 | pass→pass | 8,857 | 5,465 | -38% | 1 | 1 | 0% | 1,562 | 2,388 | +53% | 0 | 0 | — |
case-21 | pass→pass | 5,194 | 2,794 | -46% | 1 | 1 | 0% | 816 | 1,931 | +137% | 0 | 0 | — |
case-22 | pass→pass | 8,947 | 5,263 | -41% | 1 | 1 | 0% | 1,458 | 2,348 | +61% | 0 | 0 | — |
case-23 | fail→pass | 9,101 | 2,573 | -72% | 1 | 1 | 0% | 1,695 | 1,902 | +12% | 0 | 0 | — |
case-24 | fail→pass | 11,116 | 2,508 | -77% | 1 | 1 | 0% | 2,002 | 1,747 | -13% | 0 | 0 | — |
case-25 | pass→pass | 5,631 | 2,527 | -55% | 1 | 1 | 0% | 846 | 1,865 | +120% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 24 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 24 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.