🎯

code-quality

🎯Skill

from autumnsgrove/groveengine

VibeIndex|
What it does

Enforces Python code quality by automatically formatting, linting, and type-checking code using Black, Ruff, and mypy.

πŸ“¦

Part of

autumnsgrove/groveengine(45 items)

code-quality

Installation

uv runRun with uv
uv run black .
uv runRun with uv
uv run black --check . # Dry run
uv runRun with uv
uv run ruff check .
uv runRun with uv
uv run ruff check --fix . # Auto-fix
uv runRun with uv
uv run mypy .

+ 7 more commands

πŸ“– Extracted from docs: autumnsgrove/groveengine
2Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

Maintain Python code quality using Black formatting, Ruff linting, and mypy type checking. Use when formatting code, running linters, fixing style issues, or adding type hints.

Overview

# Code Quality Skill

When to Activate

Activate this skill when:

  • Formatting Python code
  • Running linters
  • Adding type annotations
  • Fixing code style issues
  • Setting up quality tools

Quick Commands

```bash

# Format with Black

uv run black .

uv run black --check . # Dry run

# Lint with Ruff

uv run ruff check .

uv run ruff check --fix . # Auto-fix

# Type check with mypy

uv run mypy .

# All checks

uv run black . && uv run ruff check . && uv run mypy .

```

Tool Overview

| Tool | Purpose | Speed | Auto-fix |

|------|---------|-------|----------|

| Black | Code formatting | Fast | Yes |

| Ruff | Linting & imports | Very Fast | Most rules |

| mypy | Type checking | Moderate | No |

Installation

```bash

uv add --dev black ruff mypy

```

Black - Code Formatting

Zero-config formatting with consistent style.

```bash

uv run black . # Format all

uv run black --check . # Dry run

uv run black --diff . # Show changes

```

Configuration

```toml

[tool.black]

line-length = 88

target-version = ['py311']

```

Ruff - Fast Linting

Rust-based linter replacing flake8, isort, pylint, and 50+ tools.

```bash

uv run ruff check . # Check

uv run ruff check --fix . # Auto-fix

uv run ruff check --show-source . # Show context

```

Configuration

```toml

[tool.ruff]

line-length = 88

target-version = "py311"

select = ["E", "W", "F", "I", "B", "SIM"]

ignore = ["E501"] # Black handles line length

[tool.ruff.per-file-ignores]

"__init__.py" = ["F401"]

"tests/*" = ["S101"]

```

Common Issues

  • F401: Unused import (auto-fixable)
  • F841: Unused variable
  • I001: Import sorting (auto-fixable)
  • B008: Mutable default argument

mypy - Type Checking

Static type checker for Python.

```python

def greet(name: str) -> str:

return f"Hello, {name}"

greet(123) # mypy error: incompatible type "int"

```

Configuration

```toml

[tool.mypy]

python_version = "3.11"

warn_return_any = true

disallow_untyped_defs = false # Enable gradually

check_untyped_defs = true

```

Common Type Hints

```python

from typing import Optional, List, Dict

def find_user(user_id: int) -> Optional[Dict[str, str]]:

return database.get(user_id)

def process_items(items: List[str]) -> int:

return len(items)

```

Unified Configuration

```toml

# pyproject.toml

[tool.black]

line-length = 88

target-version = ['py311']

[tool.ruff]

line-length = 88

target-version = "py311"

select = ["E", "W", "F", "I", "B", "SIM"]

[tool.mypy]

python_version = "3.11"

warn_return_any = true

```

Skipping Rules

```python

import os # noqa: F401 # Ignore Ruff rule

# fmt: off # Disable Black

matrix = [[1, 2, 3], [4, 5, 6]]

# fmt: on

```

Workflow Best Practices

Development (before commit)

```bash

uv run black . && uv run ruff check --fix . && uv run mypy .

```

CI/CD (strict, no auto-fix)

```bash

uv run black --check . && uv run ruff check . && uv run mypy --strict .

```

Gradual Adoption

  1. Start with Black - Zero config, immediate benefits
  2. Add Ruff - Basic rules first, expand gradually
  3. Introduce mypy - Lenient initially, increase strictness

Code Style Principles

Clarity Over Cleverness

```python

# ❌ Clever but unclear

result = [x for x in range(10) if x % 2 == 0 if x > 5]

# βœ… Clear and readable

even_numbers = [x for x in range(10) if x % 2 == 0]

result = [x for x in even_numbers if x > 5]

```

Meaningful Names

```python

# ❌ Unclear

def proc(d, x):

return d[x] if x in d else None

# βœ… Clear

def get_user_by_id(users_dict, user_id):

return users_dict.get(user_id)

```

Early Returns

```python

# ❌ Nested

def process(amount, user):

if amount > 0:

if user.has_payment():

return charge(user, amount)

# βœ… Early returns

def process(amount, user):

if amount <= 0:

return "Invalid amount"

if not user.has_payment():

return "No payment method"

return charge(user, amount)

```

Related Resources

See AgentUsage/code_quality.md and AgentUsage/code_style_guide.md for:

  • IDE integration
  • Pre-commit hook setup
  • Comprehensive style guidelines
  • Error handling patterns