| name | code-quality |
| description | 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. |
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
uv run black .
uv run black --check .
uv run ruff check .
uv run ruff check --fix .
uv run mypy .
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
uv add --dev black ruff mypy
Black - Code Formatting
Zero-config formatting with consistent style.
uv run black .
uv run black --check .
uv run black --diff .
Configuration
[tool.black]
line-length = 88
target-version = ['py311']
Ruff - Fast Linting
Rust-based linter replacing flake8, isort, pylint, and 50+ tools.
uv run ruff check .
uv run ruff check --fix .
uv run ruff check --show-source .
Configuration
[tool.ruff]
line-length = 88
target-version = "py311"
select = ["E", "W", "F", "I", "B", "SIM"]
ignore = ["E501"]
[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.
def greet(name: str) -> str:
return f"Hello, {name}"
greet(123)
Configuration
[tool.mypy]
python_version = "3.11"
warn_return_any = true
disallow_untyped_defs = false
check_untyped_defs = true
Common Type Hints
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
[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
import os
matrix = [[1, 2, 3], [4, 5, 6]]
Workflow Best Practices
Development (before commit)
uv run black . && uv run ruff check --fix . && uv run mypy .
CI/CD (strict, no auto-fix)
uv run black --check . && uv run ruff check . && uv run mypy --strict .
Gradual Adoption
- Start with Black - Zero config, immediate benefits
- Add Ruff - Basic rules first, expand gradually
- Introduce mypy - Lenient initially, increase strictness
Code Style Principles
Clarity Over Cleverness
result = [x for x in range(10) if x % 2 == 0 if x > 5]
even_numbers = [x for x in range(10) if x % 2 == 0]
result = [x for x in even_numbers if x > 5]
Meaningful Names
def proc(d, x):
return d[x] if x in d else None
def get_user_by_id(users_dict, user_id):
return users_dict.get(user_id)
Early Returns
def process(amount, user):
if amount > 0:
if user.has_payment():
return charge(user, amount)
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