[MASTER]
# List of plugins (as comma separated values of python modules names)
# that can be installed with pip
load-plugins = pylint.extensions.no_self_use

[TYPECHECK]
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed.
generated-members = pydantic.*

# List of decorators that produce context managers
contextmanager-decorators = contextlib.contextmanager

# Skip attribute checks on stdlib `subprocess`: astroid on Python 3.12
# mis-resolves the type annotation `asyncio.subprocess.Process` to
# `subprocess.Process` (which doesn't exist), producing a spurious
# no-member error on every annotation site. The annotation itself is
# correct — asyncio.subprocess legitimately exports Process — only the
# inference path is wrong. The codebase never imports stdlib subprocess
# directly (asyncio.subprocess only), so ignoring the module costs us
# nothing real.
ignored-modules = subprocess

[BASIC]
# Don't require docstrings on:
#   ^_          — private (pylint default)
#   ^Parameters$ — nested pydantic `Parameters` schemas inside each MCP
#                  command class. The outer command class carries the
#                  command's docstring; the inner Parameters is just the
#                  schema for the `params` field and has no extra semantics
#                  beyond what the outer class already describes.
no-docstring-rgx = ^_|^Parameters$

[MESSAGES CONTROL]
disable =
    line-too-long,
    too-few-public-methods,
    too-many-ancestors,
    too-many-arguments,
    too-many-branches,
    too-many-instance-attributes,
    too-many-lines,
    too-many-locals,
    too-many-nested-blocks,
    too-many-positional-arguments,
    too-many-public-methods,
    too-many-return-statements,
    too-many-statements,
    # Protocol method bodies need `...` for pyright to infer the declared return type
    # (PEP 484/544 idiom). Pylint considers it redundant when a docstring is present.
    unnecessary-ellipsis,
    # Test runners legitimately wrap each test in `except Exception:` so one
    # failure doesn't crash the suite, and asyncio.subprocess perimeter code
    # (stderr drain, stdout reader, validator fallbacks) must catch anything
    # to keep background tasks alive. Narrowing each site would mean listing
    # 5+ types per catch with no behavior change.
    broad-exception-caught,
    # MCP/Client/ is test infrastructure throughout, and several modules
    # use deferred imports for legitimate reasons: graceful test-category
    # degradation in tests.mcp_test_orchestrator (each `try: from tests.<X>
    # import …; except ImportError`), circular avoidance between
    # mcp_client.mcp_runner and the orchestrator, CLI fast-path in
    # run_tests.py (don't load the heavy orchestrator on `--help`), and
    # cross-module imports of mcp_client.mcp_test_config helpers from
    # mcp_client.mcp_organizer / mcp_client.mcp_infrastructure. The
    # trivial hoistable cases have already been moved to the top of their
    # modules.
    import-outside-toplevel
