Claude
Skills
Sign in
Back

linter-autofix

Included with Lifetime
$97 forever

Cross-language linter autofix commands and common fix patterns for biome, ruff, clippy, shellcheck, and more.

Code Reviewscripts

What this skill does


# Linter Autofix Patterns

Quick reference for running linter autofixes across languages.

## Autofix Commands

| Language      | Linter       | Autofix Command                        |
| ------------- | ------------ | -------------------------------------- |
| TypeScript/JS | biome        | `bunx @biomejs/biome check --write .`  |
| TypeScript/JS | biome format | `bunx @biomejs/biome format --write .` |
| Python        | ruff         | `ruff check --fix .`                   |
| Python        | ruff format  | `ruff format .`                        |
| Rust          | clippy       | `cargo clippy --fix --allow-dirty`     |
| Rust          | rustfmt      | `cargo fmt`                            |
| Go            | gofmt        | `gofmt -w .`                           |
| Go            | go mod       | `go mod tidy`                          |
| Shell         | shellcheck   | apply shellcheck -f diff suggestions   |

## Common Fix Patterns

### JavaScript/TypeScript (Biome)

**Unused imports**

```typescript
// Before
import { useState, useEffect, useMemo } from 'react';
// Only useState used

// After
import { useState } from 'react';
```

**Prefer const**

```typescript
// Before
let x = 5; // Never reassigned

// After
const x = 5;
```

### Python (Ruff)

**Import sorting (I001)**

```python
# Before
import os
from typing import List
import sys

# After
import os
import sys
from typing import List
```

**Unused imports (F401)**

```python
# Before
import os
import sys  # unused

# After
import os
```

**Line too long (E501)**

```python
# Before
result = some_function(very_long_argument_one, very_long_argument_two, very_long_argument_three)

# After
result = some_function(
    very_long_argument_one,
    very_long_argument_two,
    very_long_argument_three,
)
```

### Rust (Clippy)

**Redundant clone**

```rust
// Before
let s = String::from("hello").clone();

// After
let s = String::from("hello");
```

**Use if let**

```rust
// Before
match option {
    Some(x) => do_something(x),
    None => {},
}

// After
if let Some(x) = option {
    do_something(x);
}
```

### Shell (ShellCheck)

**Quote variables (SC2086)**

```bash
# Before
echo $variable

# After
echo "$variable"
```

**Use $(...) instead of backticks (SC2006)**

```bash
# Before
result=`command`

# After
result=$(command)
```

## Quick Autofix (Recommended)

Auto-detect project linters and run all appropriate fixers in one command:

```bash
# Fix mode: detect linters and apply all autofixes
bash "${CLAUDE_PLUGIN_ROOT}/skills/linter-autofix/scripts/detect-and-fix.sh"

# Check-only mode: report issues without fixing
bash "${CLAUDE_PLUGIN_ROOT}/skills/linter-autofix/scripts/detect-and-fix.sh" --check-only
```

The script detects biome, eslint, prettier, ruff, black, clippy, rustfmt, gofmt, golangci-lint, and shellcheck. It reports which linters were found, runs them, and shows modified files. See [scripts/detect-and-fix.sh](scripts/detect-and-fix.sh) for details.

## Manual Workflow

1. Run autofix first: `ruff check --fix . && ruff format .`
2. Check remaining issues: `ruff check .`
3. Manual fixes for complex cases
4. Verify: re-run linter to confirm clean

## When to Escalate

Stop and use different approach when:

- Fix requires understanding business logic
- Multiple files need coordinated changes
- Warning indicates potential bug (not just style)
- Security-related linter rule
- Type error requires interface/API changes

Related in Code Review