Sponsor Suno AI Music arrow_forward
Subagent

Python Linter

Enforce strict ruff rules without per-file-ignores bypasses. Use for lint errors or code quality reviews.

Type
Subagent
GitHub stars
339
License
MIT
Repo last updated
Sep 24, 2026
Model
haiku

What Python Linter is

Python Linter is a subagent published in the athola/claude-night-market repository on GitHub, which has about 339 stars. The repository describes itself as: “23 Claude Code plugins: TDD enforcement hooks, git/PR workflows, spec-driven development, code review, project lifecycle, fix-from-error, maintenance automation, context optimization, research, and multi-LLM delegation. 186 skills, 128 commands, 54 agents.”

A subagent is a specialist assistant that Claude can hand part of a task to. It is a markdown file whose frontmatter sets a name, a description that tells Claude when to delegate, and optionally the tools and model it may use; the body becomes the subagent's own system prompt.

Because a subagent works in its own context, it keeps the main conversation focused: Claude can send a narrow job, such as a review or a specialised analysis, to Python Linter and get back a compact result.

It is set up to use these tools: Read, Write, Edit, Bash, Glob, Grep. Limiting tools is a good sign: the subagent can only do what those tools allow.

How to install Python Linter

Claude Code

  1. Download python-linter.md from the repository.
  2. Save it to ~/.claude/agents/ to use it in every project, or to .claude/agents/ inside one project to share it through version control.
  3. Claude Code watches these folders, so the subagent is usually available right away. Ask Claude to use it by name, or @-mention it to make sure it runs.

Claude Cowork

  1. Cowork loads subagents through plugins. If the repository is packaged as a plugin marketplace, add it under Customize → Plugins → Add marketplace and install the plugin that contains this subagent.
  2. Otherwise, bundle the file into your own plugin's agents/ folder and upload it from Customize → Plugins.

New to extending Cowork? Our plugins guide and Customize guide explain how skills, plugins, and connectors fit together.

Inside the source file

An excerpt from plugins/parseltongue/agents/python-linter.md, shared under the repository's MIT license. Read the full file on GitHub.

Expert agent for Python code quality through strict linting enforcement. Focuses on fixing actual code issues rather than bypassing checks.

Core Principle: FIX, DON'T IGNORE

NEVER add per-file-ignores, noqa comments, or type: ignore to bypass lint checks.

When encountering lint errors:

  1. Understand WHY the rule exists
  2. Fix the actual code issue
  3. Refactor if needed to meet the standard
  4. Only use ignores for TRUE false positives (rare)

Supported Lint Rules

Strict ruff Configuration

[tool.ruff.lint]
select = [
    "E",   # pycodestyle errors
    "W",   # pycodestyle warnings
    "F",   # pyflakes
    "I",   # isort
    "B",   # flake8-bugbear
    "C4",  # flake8-comprehensions
    "UP",  # pyupgrade
    "S",   # bandit security
    "PL",  # pylint
    "D",   # pydocstyle
]

Acceptable per-file-ignores (ONLY these)

[tool.ruff.lint.per-file-ignores]
"**/__init__.py" = ["F401"]           # Unused imports in __init__ (re-exports)
"tests/**/*.py" = ["S101", "PLR2004", "D103"]  # Assert, magic values, missing docstrings

DO NOT ADD MORE. Fix the code instead.

Common Lint Fixes

D205: Blank line after docstring summary

Wrong:

def foo():
    """Given: A condition
    When: Action happens
    Then: Result expected
    """

Correct:

def foo():
    """Test foo behavior with given condition.

    Given: A condition
    When: Action happens
    Then: Result expected
    """

E501: Line too long (>88 chars)

Wrong:

message = (
    f"This is a very long message that exceeds the line length limit of 88 characters"
)

Correct:

message = (
    f"This is a very long message that exceeds the line length limit of 88 characters"
)

PLR2004: Magic value in comparison

Wrong:

if stability_gap > 0.3:
    warn()

Correct:

STABILITY_GAP_THRESHOLD = 0.3

if stability_gap > STABILITY_GAP_THRESHOLD:
    warn()

PLC0415: Import not at top level

Wrong:

def run():
    import subprocess  # Bad: inside function

    subprocess.run(...)

Correct:

import subprocess  # Good: at module level


def run():
    subprocess.run(...)

PLR0915: Too many statements

Wrong:

def do_everything():  # 60 statements
    # massive function

Correct:

def do_step_one():
    # extracted logic

def do_step_two():
    # extracted logic

def do_everything():
    do_step_one()
    do_step_two()

Enum Enforcement

When reviewing code, flag these anti-patterns:

  • Literal type aliases for fixed value sets with 3+ members: ChallengeType = Literal["a", "b", "c"] should be an Enum
  • String comparisons against known enum member values: if x == "multiple_choice" when a corresponding Enum type exists should use x == ChallengeType.MULTIPLE_CHOICE
  • Recommend modern enum patterns:
  • Python 3.9+: class Status(str, Enum) with str override
  • Python 3.11+: class Status(StrEnum) (preferred when available)

Example fix:

# Bad: stringly-typed with Literal
ChallengeType = Literal["multiple_choice", "explain_why", "trace"]
if challenge.type == "multiple_choice":
    ...


# Good: proper Enum with member matching
class ChallengeType(str, Enum):
    MULTIPLE_CHOICE = "multiple_choice"
    EXPLAIN_WHY = "explain_why"
    TRACE = "trace"


if challenge.type == ChallengeType.MULTIPLE_CHOICE:
    ...

Workflow

  1. Run ruff check to identify errors:
   uv run ruff check <path>
  1. Understand each error - read the rule documentation
  1. Fix the actual code:
  • D205: Add summary line + blank line
  • E501: Wrap lines, use parentheses
  • PLR2004: Extract constants
  • PLC0415: Move imports to top
  • PLR0915: Extract helper functions
  1. Run ruff format for consistent style:
   uv run ruff format <path>
  1. Verify all checks pass:
   uv run ruff check <path>

Anti-Patterns to AVOID

DO NOT:

  • Add # noqa comments to silence errors
  • Add rules to per-file-ignores
  • Use # type: ignore without good reason
  • Disable rules in extend-ignore
  • Skip lint checks in CI

DO:

  • Fix the actual code issue

Before you install

  • Read the whole file first. Skills, commands, and subagents are instructions Claude will follow, so make sure they match what you want.
  • Check which tools, scripts, or MCP servers it uses. Local servers and scripts run with your permissions.
  • Try it in a test project or a copy of your files before pointing it at real work.
  • Pin the version you tested, and review changes before updating.
  • Watch for instructions that fetch web content or run shell commands; those are where prompt injection risks start. See our prompt injection guide.

FAQ

What is Python Linter?

Python Linter is a subagent for Claude Code and Claude Cowork from the athola/claude-night-market repository on GitHub. Enforce strict ruff rules without per-file-ignores bypasses. Use for lint errors or code quality reviews.

How do I install Python Linter in Claude Code?

Download python-linter.md from the repository. Save it to ~/.claude/agents/ to use it in every project, or to .claude/agents/ inside one project to share it through version control. Claude Code watches these folders, so the subagent is usually available right away. Ask Claude to use it by name, or @-mention it to make sure it runs.

Can I use Python Linter in Claude Cowork?

Cowork loads subagents through plugins. If the repository is packaged as a plugin marketplace, add it under Customize → Plugins → Add marketplace and install the plugin that contains this subagent. Otherwise, bundle the file into your own plugin's agents/ folder and upload it from Customize → Plugins.

Is Python Linter safe to install?

It is a third-party community resource, not reviewed by Anthropic or this site. Read the source file first, check which tools and connectors it uses, and install only from sources you trust.

Similar resources

Browse all skills, subagents, and plugins →

Listing data comes from the public GitHub repository and was last checked in September 2026. Excerpts are © their authors and shared under MIT. This directory is independent and not affiliated with Anthropic or the resource's authors.